Android“单顶”启动模式和onNewIntent方法

时间:2009-11-10 22:45:17

标签: java android android-activity android-intent android-manifest

我在Android文档中读到,通过将我的Activity的launchMode属性设置为singleTop或者通过向我的Intent添加FLAG_ACTIVITY_SINGLE_TOP标志,调用startActivity(intent)将重用单个Activity实例并给我Intent在onNewIntent回调中。我做了这两件事,onNewIntent每次都不会发射并onCreate发射。文档还说this.getIntent()返回首次创建时首次传递给Activity的意图。在onCreate我正在调用getIntent并且我每次都会得到一个新的(我在另一个活动中创建了intent对象并添加了一个额外的...这个额外应该是每次如果它返回相同的意图对象)。这一切让我相信我的活动并不像“单一顶级”,我不明白为什么。

要添加一些背景,以防我只是错过了必需的步骤,这里是清单中的Activity声明和我用来启动活动的代码。活动本身并没有做任何值得一提的事情:

AndroidManifest.xml中的

    <activity
        android:name=".ArtistActivity"
        android:label="Artist"
        android:launchMode="singleTop">
    </activity>     

在我的通话活动中:

        Intent i = new Intent();
        i.putExtra(EXTRA_KEY_ARTIST, id);
        i.setClass(this, ArtistActivity.class);
        i.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
        startActivity(i);

2 个答案:

答案 0 :(得分:36)

您是否检查过onDestroy()是否也被调用了?这可能是每次onCreate()而不是onNewIntent()被调用的原因,只有在活动已经存在时才会被调用。

例如,如果您通过BACK按钮离开活动,则默认情况下会将其销毁。但是,如果您在活动堆栈中向上移动到其他活动中,并再次致电ArtistActivity.class,则会跳过onCreate()并直接转到onNewIntent(),因为该活动已经创建并且因为你将它定义为singleTop Android不会创建它的新实例,而是选择已经存在的实例。

我做了什么,看看发生了什么我为每个活动的所有不同状态实现了虚函数,所以我现在总是在做什么:

@Override
public void onDestroy() {
    Log.i(TAG, "onDestroy()");
    super.onDestroy();
}

onRestart()onStart()onResume()onPause()onDestroy()

相同

如果上面的(BACK按钮)不是你的问题,实现这些假人至少可以帮助你更好地调试它。

答案 1 :(得分:3)

将此标记设置为您的意图:

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP)