您的位置:

onNewIntent详解

一、基础概念

onNewIntent()是android中的一个方法,当Activity处于启动顶端(singleTop)时,在每次调用Intent后都会回到该Activity,并触发该函数。它用于处理新传入的Intent并更新activity的状态。

在onNewIntent()回调方法中可以实现对不同的Intent做出相应的处理,例如更新UI界面等。不过需要注意的是,该方法只有在启动模式为singleTop或singleTask的Activity中才会被调用。因为这些启动模式会让只有栈顶的Activity才能被唤醒,以达到统一一致的操作流程。

二、使用方法

使用onNewIntent()之前,需要在Activity的Manifest文件中对其进行声明。在android中,我们通过在 标签中过滤器设置来指定一个Activity能够接收的Intent类型。

下面是一个简单的示例,在MainActivity的Manifest文件中添加 标签,并添加过滤action:

    <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()方法,否则会导致一些应用异常。