我们经常有通过 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() 中的逻辑再写一遍。

两者选其一即可。