栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

【日常记录】startActivityForResult与singleInstance的冲突

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【日常记录】startActivityForResult与singleInstance的冲突

脑洞现象基于Android11(API 30)

       最近给自己定了个新方向kotlin安卓开发的学习,书籍这块必然是郭神的第三版第一行代码了,前面看的还挺快,毕竟干的是Java安卓开发,都是安卓大差不差嘛。当重温到启动模式的时候,上手敲了一下代码发现了个有趣的问题(可能还是太年轻这个问题竟然才遇到):

        按照道理讲 singleInstance 这种启动模式是另起一个任务栈,并且包含 singleTask 的栈内唯一特性,不仅如此还得到了加强成为了全任务唯一,乍一看确实是那么回事,但是如果你的启动方式是startActivityForResult(启动一个singleInstance活动),那么实际效果就不是那样了。

MainActivity 代码示例

class MainActivity : AppCompatActivity() {

    private val tag = MainActivity::class.simpleName

    private lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        Log.d(tag, "task id is $taskId")
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)
        binding.toastButton.setonClickListener {
            //val data = "hello second activity!"
            val intent = Intent(this, SecondActivity::class.java)
            //intent.putExtra("extra_data", data)
            startActivityForResult(intent, 1)
            //startActivity(intent)
        }
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        Log.d(tag, "return data is $resultCode")
    }

}

SecondActivity 代码示例

class SecondActivity : AppCompatActivity() {

    private val tag = SecondActivity::class.simpleName

    private lateinit var binding: ActivitySecondBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        Log.d(tag, "task id is $taskId")
        binding = ActivitySecondBinding.inflate(layoutInflater)
        setContentView(binding.root)
        //val extraData = intent.getStringExtra("extra_data")
        //Log.d(tag, "MainActivity extra data is $extraData")
        binding.finishButton.setonClickListener {
            val intent = Intent(this, ThirdActivity::class.java)
            startActivity(intent)
        }
    }
}

ThirdActivity就是个空活动

androidmanifest.xml 配置文件示例局部 主活动启动模式默认也一样

        
        
        
        
            
                
                
            
        
2021-10-03 14:21:33.433 3738-3738/com.kotlin.firstapplication D/MainActivity: task id is 27
2021-10-03 14:21:40.430 3738-3738/com.kotlin.firstapplication D/SecondActivity: task id is 27
2021-10-03 14:21:42.208 3738-3738/com.kotlin.firstapplication D/ThirdActivity: task id is 28
2021-10-03 14:21:45.446 3738-3738/com.kotlin.firstapplication D/MainActivity: return data is 0

然后运行一看log,有意思的就来了,MainActivity和SecondActivity在一个活动栈里面!而我们什么都没设置的ThirdActivity确去了新的活动栈!

当然如果你启动活动用的是 startActivity 那么不会出现这个问题,但如果是startActivityForResult 的话那么各位道友就要注意了,目前的情况上看,这种有特定返回结果实现的方式,会影响原本设定的启动模式。

PS:至于出现这种问题的具体逻辑根源,我还在看源码,众道友如果有比较深刻的理解,还望在评论区不吝赐教(抱拳)

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/286953.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号