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

文章讨论了在Android中,如何在singleInstance模式下Activity无法接收到Bundle数据的问题,原因在于该模式下启动机制,以及如何通过onNewIntent方法和setIntent解决这一问题。
摘要由CSDN通过智能技术生成


前言

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

  • 21
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我怀里的猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值