活动是singleInstance活动。
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
public class A extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setTitle("A");
startActivity(new Intent(this, B.class));
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
testLog("new Intent A");
}
private void testLog(String string) {
Log.d("test", string);
}
@Override
protected void onDestroy() {
super.onDestroy();
testLog("destroy A");
}
}
B活动是标准活动。
在正常情况下A-> B。用户操作返回操作,B销毁。用户再次按下,A销毁。那是对的。
但在另一种情况下:A-> B。用户操作主页按钮。当用户重启任务时,android框架会调用A的onNewIntent()
。
为什么?我的意思是活动堆栈应该是这样的:
-B
-A
为什么android框架将意图路由到A?
答案 0 :(得分:3)
singleTop
,singleTask
和singleInstance
之间存在差异。有关详细信息,请阅读the documentation,但您确实需要注意singleInstance
。
只允许此活动的一个实例运行。 此活动获得一项独特的任务,只在其中运行;如果它再次使用相同的Intent启动,则该任务将被提前并且其Activity.onNewIntent()方法被调用。如果此活动尝试启动新活动,则该新活动将在单独的任务。有关任务的更多详细信息,请参阅任务和后台堆栈文档。
这正是您所看到的行为,也应该是您期望的行为。
答案 1 :(得分:2)
好的,既然你回答了这个评论,我可以回答你的问题,感觉更安全。
kabuko说的是对的。但是,你不理解它,因为你甚至不了解任务的概念,以及它与发射器的关系。
如果您在启动器中启动了singleInstance
活动(请参阅?这就是我询问您的清单的原因!),启动器不启动/重新启动您启动的任何活动/与活动A(singleInstance
活动)一起使用。它正在启动/重新启动A的任务,因为它已经离开了。
事实上,正如文件所说(读kabuko的答案),当你从A推出B时,B被认为是一项新任务。事实上,这两个活动在活动历史中被“粘合”在一起......很明显,因为你在开始A之后就开始了B.但我再说一遍:重要的是要看到这构成了你的逻辑突破应用强>
为什么这是一个合乎逻辑的突破,你问?
因为A是singleInstance
活动。正如这里已经说过的那样,那些是这项任务中唯一的一项活动。因此,如果您再次从启动器启动任务,您将再次返回A,而不是B,因为B是另一个不属于A的任务。
与您的期望相比:如果A是standard
,则B将在同一任务中启动并考虑。因此,重新启动A的任务将最终出现在B中,这正是您所期望的。
最后,正如文档所说,这就是为什么你总是不应该使用singleTask
甚至更少singleInstance
的原因。这些不是预期的行为。因为它们不适合你,所以对于用户来说它们会更少,其他一切都相同。
答案 2 :(得分:0)
android:taskAffinity="" android:launchMode="singleInstance"