机器人"单一顶"启动模式和onNewIntent方法
-
19-09-2019 - |
题
我读中文档,通过设置我的活动的launchMode财产singleTop或者通过加入 FLAG_ACTIVITY_SINGLE_TOP
标志,我的意图,即呼叫 startActivity(intent)
将重复使用一个单一的活动实例和给我的意图 onNewIntent
回调。我做了这些东西, onNewIntent
从来没有火灾 onCreate
火灾每次。医生还说, this.getIntent()
返回的意图,这是首次通过的活动时,它是第一次创建的。在 onCreate
我打电话 getIntent
我得到一个新的每次(我创造的意图象中的另一项活动,并增加一个额外来这...这个额外的应该是相同的,每次如果是返回我同意对象)。所有这一切导致我相信,我的活动是不像一个"顶级",并且我不明白为什么。
添加一些背景情况下,我只是缺少必需的步骤,这是我的活动的宣言》中的清单和代码,我在使用的启动活动。该活动本身不会做任何事情值得一提的是关于这个:
在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);
解决方案
你有没有检查 onDestroy()
被称为好吗?也许这就是为什么 onCreate()
获得援引每一个时间,而不是的 onNewIntent()
, 这将仅仅被称为如果该活动是已经存在。
例如,如果你离开你的活动通过后按钮,它就会被摧毁的默认。但如果你去了更高的活动堆成的其他活动,并从那里呼叫你 ArtistActivity.class
这又会跳 onCreate()
直接去 onNewIntent()
, ,因为该活动已经创建,并由于定义为 singleTop
安卓不会创建一个新的实例,但是采取一个已经躺在附近。
我做什么看到什么我实现伪功能的所有不同国家的各个活动,所以我总是现在什么:
@Override
public void onDestroy() {
Log.i(TAG, "onDestroy()");
super.onDestroy();
}
同样用于 onRestart()
, onStart()
, onResume()
, onPause()
, onDestroy()
如果上述(后按钮)不是你的问题,实施这些傻瓜至少将帮助你在调试它好一点。
其他提示
所接受的答案是不是很正确的。如果onDestroy()被称为之前,那么是的,onCreate()将总是被称为。但是, 该声明是错误的:"如果你去了更高的活动堆成的其他活动,并从那里呼叫你ArtistActivity.class 这又会跳过onCreate()直接去onNewIntent()"
在"singleTop"部分 http://developer.android.com/guide/components/tasks-and-back-stack.html 解释说明它是如何工作(注意粗体文字如下;我也证明了这一点通过我自己的调试):
"例如,假设任务的回堆包括根的活动与活动的B、C、和D上(这堆是A-B-C-D;D是在顶部).一个意图达的活动的类型D。如果D已经默认的"标准"启动模式,一个新的类的实例,是启动和堆变为A-B-C-D-D。然而,如果D发射的模式是"singleTop",现有的实例的D接收意图通过onNewIntent(),因为这是在顶部的叠堆仍然是A-B-C-D。但是, 如果一个意图达的活动的B类,那么一个新的实例B中加入到叠,甚至如果它启动的模式是"singleTop"."
换句话说,开始一个活动通过SINGLE_TOP只会重复使用的现有活动如果是 已经在栈顶.它不会工作如果另一项活动是,同样的任务是在顶部(例如,活动是执行startActivity(SINGLE_TOP));一个新的实例就是创造替代。
这里有两种方式来解决这个 使你得到SINGLE_TOP行为是你想要的-的一般目的是重新使用现有的活动,而不是创建一个新的...
第一种方式 (中所描述的评论部分的接受 回答):你可以添加一个launchMode的"为singletask"您的活动。这将迫使onNewIntent()因为singletask意味着只能有一个实例,一个特定的活动在给定的任务。这是一个有点哈克解决方案,但因为如果你的应用程序需要多个实例,该活动在特定的情况(就像我为我的项目),你在搞砸。
第二种办法(最好): 而不是FLAG_ACTIVITY_SINGLE_TOP,使用FLAG_ACTIVITY_REORDER_TO_FRONT.这将再利用现有的活动实例,通过移动它的顶部堆(onNewIntent()将称为预期的).
主要目的FLAG_ACTIVITY_SINGLE_TOP是要防止建立的多个实例,一项活动。例如,当该项活动可以启动了通过一个意图,即来自外部的应用程序的主要任务。内部之间交换的活动在我的程序,我已经发现,FLAG_ACTIVITY_REORDER_TO_FRONT通常是我想要什么代替。
设置这个标记你的意图:
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP)