Android Activity收不到bundle消息(singleInstance,singletop模式)

发布时间:2023年12月18日


前言

业务场景我就不多描述了,我说下我的环境,我怎么写的导致我在singleInstance模式下收不到消息。


一、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,就一直接收不到数据,摸不着头脑。

二、找到问题并解决

1.launchMode启动模式

为什么会有这种问题,如果对启动模式有一定的理解,还是能马上想明白的,如果想学习可以看下这篇文章

Activity的启动模式launchMode

也是转载的,原文连接要开VIP了。
我们只解决问题的话,只需要关注开头的图

在这里插入图片描述
从图中可以看到,singleInstance是singletop的加强版,而singletop会调用onnewintent方法,再看singleInstance启动是重新打开任务栈,而不是重新创建activity,相信看到这里的同学应该能明白过来为什么,会收不到值了,因为intent一直都没变过,所以提供了onnewintent这个方法。

2.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数据。

文章来源:https://blog.csdn.net/shop_and_sleep/article/details/135021168
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。