业务场景我就不多描述了,我说下我的环境,我怎么写的导致我在singleInstance模式下收不到消息。
清单文件(重点注意singleInstance)
<activity
android:name=".activity.MainActivity"
android:exported="true"
android:screenOrientation="landscape"
android:launchMode="singleInstance"
>
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
传递数据的地方
/**
* @param context 上下文对象
* @param bundle 传输的数据
* @time 2023/11/30 9:26
* @Description: 发送到MainActivity的 Intent
*/
private fun sendBundleForActivity(context: Context, bundle: Bundle?) {
Log.d(TAG, "sendBundleForActivity: ${bundle?.get("xxx")}")
val startIntent = Intent(context, MainActivity::class.java)
if (bundle!=null){
startIntent.putExtras(bundle)
}
context.startActivity(startIntent)
}
可以看到当bundle不为空是使用putExtras方法传递了参数
接收参数的地方
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val bundle = intent.extras
if (bundle != null) {
...
处理数据的地方
}
}
如果不是singleInstance(单实例模式)那么就不会有任何问题,可以接收到bundle 中的数据,但是我使用了singleInstance,就一直接收不到数据,摸不着头脑。
为什么会有这种问题,如果对启动模式有一定的理解,还是能马上想明白的,如果想学习可以看下这篇文章
也是转载的,原文连接要开VIP了。
我们只解决问题的话,只需要关注开头的图
从图中可以看到,singleInstance是singletop的加强版,而singletop会调用onnewintent方法,再看singleInstance启动是重新打开任务栈,而不是重新创建activity,相信看到这里的同学应该能明白过来为什么,会收不到值了,因为intent一直都没变过,所以提供了onnewintent这个方法。
那么我们来看看onNewIntent方法的解释
翻译下来呢,就是说:对于在其包中将launchMode设置为“singleTop”的活动,或者如果客户端使用了Intent,则需要执行此操作。调用startActivity时的FLAG_ACTIVITY_SINGLE_TOP标志。在任何一种情况下,当活动处于活动堆栈的顶部而不是正在启动的活动的新实例时,都会使用用于重新启动它的Intent在现有实例上调用onNewIntent()。
在恢复状态下,活动永远无法接收到新的意图。您可以指望onResume在该方法之后被调用,但不一定在完成该回调之后立即调用。如果活动已恢复,它将暂停,并传递新的意图,然后是onResume。如果活动未处于恢复状态,则可以立即传递新的意图,稍后当活动再次变为活动状态时调用onResume()。
需要注意的是,getIntent仍然返回原始Intent。您可以使用setIntent将其更新为此新的Intent。也就是说我们需要这样使用,例子如下:
override fun onNewIntent(intent: Intent?) {
super.onNewIntent(intent)
setIntent(intent)
//在这里进行getIntent,才能获取到发送的新的值
}
不止是singleInstance模式,singletop模式应该也是同理。
本文主要讲述了在使用singleInstance模式下,无法接收到传递的Bundle数据的问题,并提供了解决方案。首先介绍了singleInstance模式的启动机制,解释了为什么会出现无法接收数据的情况。然后介绍了onNewIntent方法,该方法在singleTop和singleInstance模式下都可以使用,在该方法中调用setIntent可以获取到新的Intent数据。