一、基础概念
onNewIntent()是android中的一个方法,当Activity处于启动顶端(singleTop)时,在每次调用Intent后都会回到该Activity,并触发该函数。它用于处理新传入的Intent并更新activity的状态。
在onNewIntent()回调方法中可以实现对不同的Intent做出相应的处理,例如更新UI界面等。不过需要注意的是,该方法只有在启动模式为singleTop或singleTask的Activity中才会被调用。因为这些启动模式会让只有栈顶的Activity才能被唤醒,以达到统一一致的操作流程。
二、使用方法
使用onNewIntent()之前,需要在Activity的Manifest文件中对其进行声明。在android中,我们通过在
下面是一个简单的示例,在MainActivity的Manifest文件中添加
<activity android:name=".MainActivity" android:launchMode="singleTop"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> <action android:name="com.example.ON_NEW_INTENT" /> //新增 </intent-filter> </activity>
随后,在MainActivity中添加以下代码:
@Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); if (Intent.ACTION_VIEW.equals(intent.getAction())) { Uri uri = intent.getData(); if (uri != null) { String orderId = uri.getQueryParameter("orderId"); String amount = uri.getQueryParameter("amount"); handleOrder(orderId, amount); } } else if ("com.example.ON_NEW_INTENT".equals(intent.getAction())) { String name = intent.getStringExtra("name"); String age = intent.getStringExtra("age"); handleUser(name, age); } }
在这个示例中,我们接收了两种不同类型的Intent,一种可以通过URI parse获得参数,而另一种传入了一个name和age参数。
需要注意的是,接收Intent的Activity应当是栈顶的Activity,因为只要Activity不在栈顶,onNewIntent()方法就不会被调用。(如果需要使用onNewIntent()方法,可以使用FLAG_ACTIVITY_CLEAR_TOP标志位在进入Activity时退出之前Activity)
三、应用场景
onNewIntent()在应用中有很多使用场景。下面我们列举了一些通用的示例。
1. 启动Activity时传递数据
假设我们需要在MainActivity中传递一个用户信息到UserInfoActivity中。我们可以通过Intent传递数据到UserInfoActivity,并在UserInfoActivity的onNewIntent()方法中获取该数据。
//在MainActivity中传递数据 Intent intent = new Intent(MainActivity.this, UserInfoActivity.class); intent.putExtra("name", "John"); intent.putExtra("age", 18); startActivity(intent); //在UserInfoActivity中接收数据 @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); String name = intent.getStringExtra("name"); int age = intent.getIntExtra("age", 0); updateUserInfo(name, age); }
2. 处理外部传入数据
当我们在应用中使用了自定义的URI scheme(如:XXX://order/detail?orderId=123&amount=200),通过使用intent-filter过滤器,我们可以处理从外部传入的URI数据。
在Manifest文件中添加过滤器:
<intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <data android:scheme="XXX" android:host="order" android:pathPrefix="/detail" /> </intent-filter>
在Activity中获取Uri数据并更新UI。
@Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); if (Intent.ACTION_VIEW.equals(intent.getAction())) { Uri uri = intent.getData(); if (uri != null) { String orderId = uri.getQueryParameter("orderId"); String amount = uri.getQueryParameter("amount"); handleOrder(orderId, amount); } } }
3. 恢复程序状态
在大多数情况下,应用程序可能会被暂停、停止、终止或销毁,这些情况下,应用程序的进程可能会被销毁,这意味着您可能需要在应用程序的任何时候恢复应用程序的状态。 一种可能的方法是在Activity中使用onSaveInstanceState()方法并在onCreate()方法中使用Bundle恢复状态,另一种方法是在onNewIntent()方法中保存状态,并在需要时加载状态,例如:
@Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); Bundle extras = intent.getExtras(); if (extras != null) { //恢复状态 } }
4. 唤起Activity
当应用程序的某个Activity已经处于栈顶时,您可以通过重复调用startActivity()方法来唤醒该Activity。但是,如果特定Activity在应用程序的任务栏的不同部分处于活动状态,则只能使用onNewIntent()方法来处理传入的Intent实例。
下面是一个示例,可以切换Task,唤起指定Activity:
//MainActivity启动ActivityA Intent intentA = new Intent(MainActivity.this, ActivityA.class); intentA.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intentA); //ActivityA启动ActivityB Intent intentB = new Intent(ActivityA.this, ActivityB.class); intentB.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intentB);
五、总结
onNewIntent是Android中一个非常有用的方法,它可以广泛应用于各种场景,例如传递、处理和恢复数据以及唤起Activity等。在使用时需要注意,仅能在singleTask或singleTop启动模式的Activity中使用onNewIntent()方法,否则会导致一些应用异常。