Android onNewIntent调用时机
最近用到 onNewIntent,对它的调用时机一直存疑,google 了一下,搜到了几个结果都是说 onNewIntent() –> onRestart() –> onStart(),而 android 开发者官网 上只提到 onNewIntent() –> onResume()。在我的例子中,调用 onNewIntent 后并没有进入到 onRestart() 和 onStart() 中。于是在 BaseActivity 中重写了所有生命周期函数,加入了 Log。代码如下所示:
public abstract class BaseActivity extends AppCompatActivity {
public final String TAG = getClass().getSimpleName();
@Override
protected void onCreate(Bundle savedInstanceState) {
Log.d(TAG, "onCreate: ");
super.onCreate(savedInstanceState);
setContentView(getLayoutResId());
initViews();
initData();
}
public abstract int getLayoutResId();
public void initViews() {
}
public void initData() {
}
@Override
protected void onNewIntent(Intent intent) {
Log.d(TAG, "onNewIntent: ");
super.onNewIntent(intent);
}
@Override
protected void onRestart() {
Log.d(TAG, "onRestart: ");
super.onRestart();
}
@Override
protected void onStart() {
Log.d(TAG, "onStart: ");
super.onStart();
}
@Override
protected void onResume() {
Log.d(TAG, "onResume: ");
super.onResume();
}
@Override
protected void onPause() {
Log.d(TAG, "onPause: ");
super.onPause();
}
@Override
protected void onStop() {
Log.d(TAG, "onStop: ");
super.onStop();
}
@Override
protected void onDestroy() {
Log.d(TAG, "onDestroy: ");
super.onDestroy();
}
}
当 activity (假设为 A) 的 launchMode 为 singleTop 且 A 的实例已经在 task 栈顶,或者 launchMode 为 singleTask 且 A 的实例已在 task 栈里 (无论是栈顶还是栈中),再次启动 activity A 时,便不会调用 onCreate() 去产生新的实例,而是调用 onNewIntent() 并重用 task 栈里的 A 实例。
如果 A 在栈顶,那么调用顺序依次是 A.onPause() –> A.onNewIntent() –> A.onResume()。A 的 launchMode 可以是 singleTop 或者是 singlTask。android 开发者官网 上描述的是这种情况。
如果 A 不在栈顶,此时它处于 A.onStop() 状态,当再次启动时,调用顺序依次是 [A.onStop()] –> A.onNewIntent() –> A.onRestart() –> A.onStart() –> A.onResume()。A 的 launchMode 只能是 singleTask。google 到的其它大多文章描述的是这种情况。
参考:http://baurine.github.io/2015/12/26/android_onnewintent.html