SingleInstance活动让我感到困惑

时间:2011-12-06 02:19:37

标签: android

活动是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?

3 个答案:

答案 0 :(得分:3)

singleTopsingleTasksingleInstance之间存在差异。有关详细信息,请阅读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"