【日常记录】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,有意思的就来了,MainActivitySecondActivity在一个活动栈里面!而我们什么都没设置的ThirdActivity确去了新的活动栈!

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

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

你可能感兴趣的:(基于安卓11的日常细节问题记录,android,java,kotlin)