【BUG系列】getIntent()无法获取到值,Activity 是singTask 模式

【BUG系列】getIntent()无法获取到值,Activity 是singTask 模式,第1张

我们经常有通过 Scheme 打开 App 的情况,并且大多数时候会通过 Scheme 携带一些参数回来。

一般情况下,可能都是正常的。但是!!!

当启动模式是 singTask 时,Activity 的生命周期就有了两种情况,可能会导致我们获取不到携带回来的参数。

那就新创建,那就是正常的流程

onCreate()

onStart()

onResume()

这个时候,我们获取 getIntent() 是没有问题的。

它在后台。这时候是 onPause() 或 onStop() 状态,在看启动流程

onNewIntent()

onRestart()

onStart()

onResume()

首先注意,onCreate() 方法不会再走了,如果是在 onCreate() 中获取 getIntent() 肯定是获取不到的。

然后来看这个 onNewIntent() 方法

所以,我们再要获取到 intent ,就要重写 onNewIntent 方法,如下:

想要在 singleTask 模式下获取 getIntent() 有两种方式:

两者选其一即可。

Bundle只是一个信息的载体

将内部的内容以键值对组织

Intent负责Activity之间的交互

自己是带有一个Bundle的

IntentputExtras(Bundle

bundle)直接将Intent的内部Bundle设置为参数里的bundle

IntentgetExtras()直接可以获取Intent带有的Bundle

ntentputExtra(key,

value)

Bundle

bundle

=

intentgetExtras();

bundleputXXX(key,

value);

intentputExtras(bundle);

是等价的

intentgetXXXExtra(key)

Bundle

bundle

=

intentgetExtras();

bundle

getXXX(key);

是等价的(XXX代表数据/对象类型

String

boolean

第一个首字母大写的,应该是你程序中自定义的某种数据类型(或者你所用编程语言中的特殊数据类型);第二个全小写字母的,是此处说明的一个变量,右边是一个函数。

即:定义了一个名为intent的变量,其类型是Intent,其值初始化为函数getIntent()的返回值。

首先,尽量不要用try{}catch去捕捉能用判断规避的异常,那样会影响效率,每次出现异常,虚拟机要抓错误调用堆栈。所以,最好的方式是通过判断去规避。

按你的思路,可以先判断getIntentgetExtras()是否为null。

Intent

_getIntent

=

thisgetIntent();

if(

_getIntentgetExtras()

!=

null){

Logi("YuryLog","理论上只有点了确认键才执行");

receiveName

=

_getIntentgetExtras()getString("sendName");

receiveEatSomething

=

_getIntentgetExtras()getString("sendeatSomething");

receiveCopies

=

_getIntentgetExtras()getString("sendcopies");

要指出的是,上述代码,最好使用getXXXExtra这类方法,它不会出现空指针(除了少数几个,比方说getStringExtra)。

需要设定默认值的,在没有值时它会返回默认值;没有设置默认值的,在没有值时会返回null,针对这类判空一下。

可以看下getBooleanExtra的源码:

public

boolean

getBooleanExtra(String

name,

boolean

defaultValue)

{

return

mExtras

==

null

defaultValue

:

mExtrasgetBoolean(name,

defaultValue);

}

而getExtras()在没有值时会返回null,看下源码:

public

Bundle

getExtras()

{

return

(mExtras

!=

null)

new

Bundle(mExtras)

:

null;

}

所以,最好不要用getIntent()getExtras()这种方式,换用getIntent()getXXXExtras(),这样针对有设置默认值的就不需要判空了。

activity之间传值,是没有机制可以确定哪个activity传过来的。这是考虑到代码的可扩展性,解耦。要确定哪个activity发过来,在intent创建那里多传个布尔值就行,比方说下面的代码。

发送

intentputExtra("fromXXActivity",

true);

接收

if

(getIntent()getBooleanExtra("fromXXActivity",

false))

{

//

这里,你就可以安全的接收那个activity发过来的所有值。

}

broadcast发送的时候都是传递一个intent对象,这个intent对象就是传给onReceive方法的那个intent通过这个intent就可以获取发送广播的程序的包名,知道了包名就知道是哪个程序了。

ComponentName com = intentgetComponent();

String pkgName = comgetPackageName();

试试看行不行。。。

以上就是关于【BUG系列】getIntent()无法获取到值,Activity 是singTask 模式全部的内容,包括:【BUG系列】getIntent()无法获取到值,Activity 是singTask 模式、Android开发中创建Intent方法的区别~求解释、求大神解答 Intent intent=getIntent() 是什么意思啊等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9546945.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-29
下一篇 2023-04-29

发表评论

登录后才能评论

评论列表(0条)

保存