基于安卓11的日常细节问题记录|【日常记录】startActivityForResult与singleInstance的冲突

脑洞现象基于Android11(API 30)
最近给自己定了个新方向kotlin安卓开发的学习,书籍这块必然是郭神的第三版第一行代码了,前面看的还挺快,毕竟干的是Java安卓开发,都是安卓大差不差嘛。当重温到启动模式的时候,上手敲了一下代码发现了个有趣的问题(可能还是太年轻这个问题竟然才遇到):
按照道理讲 singleInstance 这种启动模式是另起一个任务栈,并且包含 singleTask 的栈内唯一特性,不仅如此还得到了加强成为了全任务唯一,乍一看确实是那么回事,但是如果你的启动方式是startActivityForResult(启动一个singleInstance活动),那么实际效果就不是那样了。
MainActivity 代码示例

class MainActivity : AppCompatActivity() {private val tag = MainActivity::class.simpleNameprivate lateinit var binding: ActivityMainBindingoverride 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 = "https://www.it610.com/article/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.simpleNameprivate lateinit var binding: ActivitySecondBindingoverride fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) Log.d(tag, "task id is $taskId") binding = ActivitySecondBinding.inflate(layoutInflater) setContentView(binding.root) //val extraData = https://www.it610.com/article/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 的话那么各位道友就要注意了,目前的情况上看,这种有特定返回结果实现的方式,会影响原本设定的启动模式。
【基于安卓11的日常细节问题记录|【日常记录】startActivityForResult与singleInstance的冲突】PS:至于出现这种问题的具体逻辑根源,我还在看源码,众道友如果有比较深刻的理解,还望在评论区不吝赐教(抱拳)

    推荐阅读