23

我有一个由单个Activity. 如何确保Activity在给定时间内仅存在我的应用程序 (== ) 的一个实例?我遇到了这样一种情况,我通过多次单击应用程序图标成功打开了我的应用程序的多个实例(这不会一直重现)。

4

3 回答 3

41

像这样更改您的清单:

    <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="singleTask"并且不可能同时启动您的 Activity 的多个实例。有关更多信息,请参阅活动文档。

于 2013-05-22T13:43:40.540 回答
15

接受的答案服务于它的目的,但这不是最好的方法。

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模式启动您的活动开始与活动和任务的默认行为混淆,这可能会产生一些不良影响。

Android 文档建议您仅在必要时中断此行为(在这种情况下不是):

警告:大多数应用程序不应中断 >activities 和任务的默认行为。如果您确定您的活动有必要修改默认行为,请谨慎行事,并确保在启动期间以及使用“后退”按钮从其他活动和任务导航回活动时测试活动的可用性。请务必测试可能与用户预期行为冲突的导航行为。

于 2015-06-13T16:40:54.890 回答
0

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

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

于 2013-08-21T22:50:57.033 回答