一、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方法可以提供更好的用户体验和更加流畅的应用运行效果。