Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/223.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 单实例活动让我感到困惑_Android - Fatal编程技术网

Android 单实例活动让我感到困惑

Android 单实例活动让我感到困惑,android,Android,活动是单实例活动 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(

活动是单实例活动

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销毁。用户再次按back,一次销毁。没错

但在另一种情况下:A->B.用户操作主页按钮。当用户重新启动任务时,android框架调用A的
onNewIntent()

为什么?我的意思是活动堆栈应该是这样的:

-B
-A

为什么android框架会将意图路由到一个实例?

单实例
单任务
单实例
之间存在差异。阅读以了解更多信息,但您确实希望注意
singleInstance
的描述

仅允许运行此活动的一个实例此活动获得一个唯一的任务,其中只有它自己在运行;如果再次以相同的目的启动该活动,则该任务将被提前,并调用其Activity.onNewIntent()方法。如果此活动尝试启动新活动,则该新活动将在单独的任务中启动。有关任务的更多详细信息,请参阅任务和后堆栈文档


这正是你所看到的行为,也是应该预料到的。

好了,既然你回答了这个评论,我就可以更安全地回答你的问题了

歌舞伎说的是对的。但是,您不理解它,因为您甚至不理解任务的概念,以及它与启动器的关系

当在启动器上启动
singleInstance
活动时(请参阅?这就是我询问清单的原因!),启动器不会启动/重新启动与活动a一起启动/使用的任何活动(a
singleInstance
活动)。它正在启动/重新启动A的任务

事实上,正如文档所说(阅读歌舞伎的答案),当你从A启动B时,B被认为是一个新的任务。恰好这两个活动在活动历史中“粘合”在一起。。。显然,因为您在启动A之后就启动了B。但我要再次指出:重要的是要看到这构成了对应用程序的逻辑中断。

你会问,为什么这是一个合乎逻辑的中断

因为A是一个
单实例
活动。正如前面所说的,这是这项任务中唯一的一项活动。因此,如果您再次从启动器启动该任务,您将再次以A结束,而不是B结束,因为B是不属于A的另一个任务

与您期望的相比:如果A是标准的,那么B将在同一个任务中启动并考虑。因此,重新启动A的任务将以B结束,这是您所期望的


最后,正如文档所说,这就是为什么您通常不应该使用
singleTask
,甚至更不应该使用
singleInstance
。这些不是预期的行为。因为它们不适合您,所以对于用户来说,它们甚至更少,其他方面都一样。

您介意发布您的清单吗?我认为你在启动程序上有默认设置。更好的是,只需回答:清单中的默认/启动程序活动是“A”吗?android清单非常简单。比如:不,A不是默认的启动程序。请稍候,我正在写一个答案,因为我相信我完全知道你在想什么,以及为什么你不能理解下面已经写的答案。好吧,好吧。但我仍然有一个问题。在本例中,B是前台(任务)。为什么android路由到A(这是后台任务)?正如David提到的,我想你应该多读点书来理解任务。报价中的建议可能是一个很好的建议。看一看文档,正如我所说的:如果启动器的默认值是a,那么启动器将调用a,最近的将调用顶部的活动(甚至是B),考虑到您还没有完成B(在本例中,将是a)。如果A不是默认的/启动器,那么启动器将调用B(不是A的任务,这与清单中启动器的任务不同),如果您在此处停止,则最近的将调用A。这都是关于任务和清单,以及recents和launcher之间的区别。我有一些附加问题,希望你能告诉我更多细节。:)
android:taskAffinity="" android:launchMode="singleInstance"