脑洞现象基于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:至于出现这种问题的具体逻辑根源,我还在看源码,众道友如果有比较深刻的理解,还望在评论区不吝赐教(抱拳)



