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

时间:2013-05-22 13:32:32

标签: android android-activity android-lifecycle

我有一个Android应用程序,它由一个Activity组成。 我怎样才能确保在给定时间内只存在一个应用程序实例(== Activity)? 通过多次点击应用程序图标,我成功打开了应用程序的多个实例(这不会一直重现)。

3 个答案:

答案 0 :(得分:25)

像这样更改你的清单:

    <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实例。 See the activity docs for more.

答案 1 :(得分:11)

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

相反,我建议在每个活动中使用静态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 docs建议你只在必要时破坏这种行为(在这种情况下不是这样):

  

警告:大多数应用程序不应该中断&gt;活动和任务的默认行为。如果你确定它   您的活动必须修改默认行为,请使用   谨慎并确保测试活动的可用性   启动以及从其他活动和任务导航回来   使用后退按钮。一定要测试那些导航行为   可能与用户的预期行为发生冲突。

答案 2 :(得分:0)

我发现我的应用程序的用户内存不足,我正在努力解决原因。在尝试这样做时,我发现我可以打开我的应用程序的多个实例,我反复点击图标然后是Home,然后是图标,然后是Home ..我可以看到内存使用上升和上升,直到最终应用程序崩溃。在它崩溃之前,我可以点击关闭菜单选项,前一个实例出现在前面,这将发生在我启动应用程序的次数。

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