我们经常有通过 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() 是什么意思啊等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)