我在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);
答案 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)