如果本文帮助到你,本人不胜荣幸,如果浪费了你的时间,本人深感抱歉。
希望用最简单的大白话来帮助那些像我一样的人。如果有什么错误,请一定指出,以免误导大家、也误导我。
本文来自:http://www.jianshu.com/users/320f9e8f7fc9/latest_articles
感谢您的关注。
我们经常有通过 Scheme 打开 App 的情况,并且大多数时候会通过 Scheme 携带一些参数回来。
一般情况下,可能都是正常的。但是!!!
当启动模式是 singTask 时,Activity 的生命周期就有了两种情况,可能会导致我们获取不到携带回来的参数。
第一种:Activity 没有创建过
那就新创建,那就是正常的流程
onCreate()
onStart()
onResume()
这个时候,我们获取 getIntent() 是没有问题的。
第二种:Activity 已经存在了
它在后台。这时候是 onPause() 或 onStop() 状态,在看启动流程
onNewIntent()
onRestart()
onStart()
onResume()
首先注意,onCreate() 方法不会再走了,如果是在 onCreate() 中获取 getIntent() 肯定是获取不到的。
然后来看这个 onNewIntent() 方法:
当 launchMode 为 singleTask 的时候,通过 Intent 启到一个 Activity ,如果系统已经存在一个实例,系统就会将请求发送到这个实例上。但这个时候,系统就不会再调用通常情况下我们处理请求数据的 onCreate 方法,而是调用 onNewIntent 方法。
所以,我们再要获取到 intent ,就要重写 onNewIntent 方法,如下:
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
// 从这里传回来的 intent 就是新的 intent
// 将 onNewIntent 接收的 initnt 设置给 Activity
setIntent(intent);
}
结论
想要在 singleTask 模式下获取 getIntent() 有两种方式:
1. 重写 onNewIntent() ,在 onStart() 中获取 getIntent();
2. 在 onCreate() 获取 getIntent();再重写 onNewIntent() ,在 onNewIntent() 中把 onCreate() 中的逻辑再写一遍。
两者选其一即可。
网友评论