我读中文档,通过设置我的活动的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)
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top