您的位置:

onNewIntent的调用时机详解

一、onNewIntent的定义

onNewIntent方法是Activity的一个生命周期方法,它是在已经存在的Activity中打开一个新的Intent时所调用的方法。

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    //处理新的intent
}

在调用onNewIntent之前,系统会先调用Activity的onPause()方法,再调用onStop()方法。如果新的Intent中设定了FLAG_ACTIVITY_CLEAR_TOP标记,那么在调用onNewIntent之前,系统会先调用该Activity的onDestroy()方法,以此来实现重新创建Activity的目的。

二、从传递的Intent中获取数据

在onNewIntent方法中,我们可以使用传递过来的Intent获取我们需要的数据,也可以根据新的Intent来更新UI布局、重新初始化一些数据或者跳转至其他Activity。

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    int newId = intent.getIntExtra("id", -1);
    if (newId != -1) {
        //根据新的id更新UI布局
        updateUI(newId);
    }
}

三、应用场景1-处理通知栏点击事件

通知栏中的点击事件可以通过设置PendingIntent实现,当用户点击通知后会跳转至相应的Activity。当通知栏处于栈顶时,打开通知栏 相应Activity不会重新创建一个Activity,而是会将onNewIntent方法回调。这时,我们可以根据传递的Intent中的数据对象来更新UI布局,从而实现处理通知栏点击事件的功能。

四、应用场景2-扫码时开启相同的Activity

在扫码的场景下,通常是在当前的Activity中打开一个二维码扫描的界面,扫描成功后再跳转至另一个Activity进行数据的显示或者其他相关操作。但是如果扫码的次数较多时,可能会导致当前Activity的实例数较多,从而出现内存溢出或者界面卡顿等问题。此时可以通过在AndroidManifest文件中设置Activity的属性:android:launchMode="singleTop"。

  
   
   
        
    
        
    
        
    
   
   

  

这样可以保证打开扫码界面时,如果当前栈顶的Activity已经是ScanActivity,那么不会创建新的Activity,而是会回调它的onNewIntent方法。

五、应用场景3-打开新的Activity时销毁当前栈中的所有Activity

在某些业务场景中,可能需要打开某个Activity时同时销毁当前栈中的所有Activity,从而实现更好的用户体验。在这种情况下,可以在启动新的Activity时给它指定FLAG_ACTIVITY_CLEAR_TOP和FLAG_ACTIVITY_NEW_TASK两个标记。

Intent intent = new Intent(this, NewActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

FLAG_ACTIVITY_CLEAR_TOP标记可以清除除了目标Activity之外的所有Activity,并且回调它的onNewIntent方法。FLAG_ACTIVITY_NEW_TASK标记可以将目标Activity作为新的任务放入任务栈中。

六、小结

从以上应用场景可以看出,onNewIntent方法在Android应用中的使用非常广泛,它不仅仅可以处理通知栏点击事件,还可以解决在扫码时创建多个Activity,以及打开新的Activity时清空栈中的Activity等问题。良好的使用onNewIntent方法可以提供更好的用户体验和更加流畅的应用运行效果。