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


前言

业务场景我就不多描述了,我说下我的环境,我怎么写的导致我在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数据。

相关推荐

  1. 【Android】EventBus消息的一种情况

    2023-12-20 14:50:03       11 阅读
  2. 【Bug】.net6 cap总线+rabbitmq延时消息

    2023-12-20 14:50:03       39 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-20 14:50:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-20 14:50:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-20 14:50:03       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-20 14:50:03       20 阅读

热门阅读

  1. 【手撕算法系列】k-means

    2023-12-20 14:50:03       43 阅读
  2. Gitlab 登录报422错误,账号密码是正确的

    2023-12-20 14:50:03       32 阅读
  3. 207. Course Schedule

    2023-12-20 14:50:03       48 阅读
  4. @Controller 和 @RestController 区别

    2023-12-20 14:50:03       40 阅读
  5. Spring-MVC--ControllerAdvice 全局控制器增强

    2023-12-20 14:50:03       38 阅读
  6. 相电压型逆变器:实现和源代码示例(Matlab)

    2023-12-20 14:50:03       36 阅读
  7. 国产MCU在充气泵方案上面的优势

    2023-12-20 14:50:03       39 阅读
  8. 机器学习之逻辑回归(Logistic Regression)

    2023-12-20 14:50:03       41 阅读
  9. nginx配置端口转发

    2023-12-20 14:50:03       44 阅读
  10. 第30节: Vue3 监听事件

    2023-12-20 14:50:03       56 阅读
  11. 搜索区间—-二分查找,力扣-go实现

    2023-12-20 14:50:03       39 阅读
  12. 我们应该了解的前端缓存

    2023-12-20 14:50:03       31 阅读