如果你想使用非活动的context
(例如applicationContext
)启动活动,从而使用Intent.FLAG_ACTIVITY_NEW_TASK
,则只有两种选择可以避免每次调用startActivity
时创建目标活动的新实例。
首先,在清单文件中为活动指定android:launchMode="singleInstance"
,可以强制在仅托管此实例的任务中存在该活动的唯一实例。在这种情况下,如果它已经存在于主任务中,则启动该活动将其带到前台,否则会创建一个新任务,其中包含该活动的唯一实例。我认为这不是我们要寻找的方式。
其次,通过在清单文件中指定android:launchMode="singleTask"
,我们可以实现更好的解决方案。在这种情况下,如果不存在该活动的实例,则系统将创建一个新任务,并将该活动添加到该任务的根位置。否则,系统会将包含该活动实例的任务置于前台,然后转到目标活动并调用onNewIntent
。
下面是第二种方法的示例代码,检查了2个场景:
manifest.xml:
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".ActivityA" android:launchMode="singleTask" />
<activity android:name=".ActivityB" />
MainActivity.kt:
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
button1.setOnClickListener {
Intent(applicationContext, ActivityA::class.java).apply {
flags = Intent.FLAG_ACTIVITY_NEW_TASK
}.let {
applicationContext.startActivity(it)
}
}
button2.setOnClickListener {
startActivity(Intent(this, ActivityA::class.java))
Handler().postDelayed({
startActivity(Intent(this, ActivityB::class.java))
}, 1000)
}
}
}
ActivityA.kt
class ActivityA : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_a)
Toast.makeText(this, "onCreate on ActivityA", Toast.LENGTH_SHORT).show()
}
override fun onNewIntent(intent: Intent?) {
super.onNewIntent(intent)
Toast.makeText(this, "onNewIntent on ActivityA", Toast.LENGTH_SHORT).show()
}
}
ActivityB.kt
class ActivityB : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_b)
button.setOnClickListener {
Intent(applicationContext, ActivityA::class.java).apply {
flags = Intent.FLAG_ACTIVITY_NEW_TASK
}.let {
applicationContext.startActivity(it)
}
}
}
}
结果:
.......