腦洞現象基于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 組態檔示例區域 主活動啟動模式默認也一樣
<activity
android:name=".ThirdActivity"
android:label="ThirdActivity"
android:exported="true" />
<activity
android:name=".SecondActivity"
android:label="SecondActivity"
android:exported="true"
android:launchMode="singleInstance">
</activity>
<activity
android:name=".MainActivity"
android:exported="true"
android:label="First_Kotlin_Test"
android:launchMode="singleTask">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
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:至于出現這種問題的具體邏輯根源,我還在看原始碼,眾道友如果有比較深刻的理解,還望在評論區不吝賜教(抱拳)
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/305238.html
標籤:其他
上一篇:MPAndroidChart詳解
