Skip to content

Android onNewIntent调用时机

Mr.wu edited this page Nov 9, 2017 · 4 revisions

最近用到 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();

    }
}

image

当 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

Home

Android 开发录

-深入理解LayoutInflater.inflate()的参数

计算机网络原理

数据库

Java 垃圾回收机制

Java 开发录

面试

搭建翻墙shadowsocks 教程

其他

Clone this wiki locally