Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.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_Android Activity_Android Lifecycle - Fatal编程技术网

防止由单个活动组成的多个Android应用程序实例

防止由单个活动组成的多个Android应用程序实例,android,android-activity,android-lifecycle,Android,Android Activity,Android Lifecycle,我有一个Android应用程序,它由一个活动组成。 如何确保在给定的时间内仅存在我的应用程序(=活动)的一个实例? 在这种情况下,我通过多次单击应用程序图标成功打开了我的应用程序的多个实例(这不会一直重复)。如下更改您的清单: <activity android:name="com.yourpackage.YourActivity" android:label="@string/app_name" android:launchMode

我有一个Android应用程序,它由一个
活动
组成。 如何确保在给定的时间内仅存在我的应用程序(=
活动
)的一个实例?
在这种情况下,我通过多次单击应用程序图标成功打开了我的应用程序的多个实例(这不会一直重复)。

如下更改您的清单:

    <activity
        android:name="com.yourpackage.YourActivity"
        android:label="@string/app_name"
        android:launchMode="singleTask" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

我发现我的应用程序的用户内存不足,我一直在努力找出原因。在尝试这样做时,我发现我可以打开我的应用程序的多个实例,然后反复单击图标,然后单击主页,然后单击图标,然后单击主页。。我可以看到内存使用在不断增加,直到最终应用程序崩溃。在它崩溃之前,我可以点击关闭菜单选项,而之前的实例出现在前面,这种情况的发生次数与我启动应用程序的次数相同


我的解决方案是将android:launchMode=“singleInstance”
添加到清单中。从那时起,我无法打开多个实例或使应用程序崩溃。

接受的答案符合其目的,但这不是最好的方法

相反,我建议在每个活动中使用静态的
AtomicInteger
,如下所示:

//create a counter to count the number of instances of this activity
public static AtomicInteger activitiesLaunched = new AtomicInteger(0);

@Override
protected void onCreate(Bundle pSavedInstanceState) {

        //if launching will create more than one 
        //instance of this activity, bail out
        if (activitiesLaunched.incrementAndGet() > 1) { finish(); }

        super.onCreate(pSavedInstanceState);

}

@Override
protected void onDestroy() {

        //remove this activity from the counter
        activitiesLaunched.getAndDecrement();

        super.onDestroy();

}


那么,被接受的答案有什么问题? 声明您的活动应该使用
singleInstance
模式启动,这将与活动和任务的默认行为发生冲突,这可能会产生一些不必要的影响

建议您仅在必要时中断此行为(本例中并非如此):

警告:大多数应用程序不应中断>活动和任务的默认行为。如果你确定它是 如果您的活动需要修改默认行为,请使用 注意并确保在测试过程中测试活动的可用性 从其他活动和任务导航回it时启动 用后退按钮。请确保测试以下导航行为: 可能与用户的预期行为冲突


它是否优于
“singleInstance”
?阅读文档中两者之间的差异,并决定哪一个更适合您的用例。。。如果不了解您的应用程序的更多信息,我无法回答。android:launchMode=“singleTask”不工作android:launchMode=“singleInstance”工作您建议的解决方案是否适用于具有多个活动的应用程序?我以一个空白活动结束,在某些情况下,应用程序根本无法启动。它应该启动。这就是我使用它的目的,没有任何问题。当然,那是几年前的事了。。。您的代码中是否可能存在其他问题?尝试消除这种可能性:用两个只显示文本的基本活动(“活动1”和“活动2”)启动一个新项目。然后在这个控制环境中实现这个方法并进行测试,看看它是否仍然会给你带来像那样的奇怪问题。我的使用案例是从任何第三方应用程序启动我的应用程序,使用Intent.ACTION\u VIEW ACTION,而我的应用程序在后台运行。好的,我将在一些简单的代码上尝试它,看看它是否能工作。这应该是公认的答案。单人启动模式在接收通知时给我的应用程序带来了很多问题。这个答案解决了我的问题!忘了原子整数吧,这真是太棒了