0

为了确保我的活动保持对传感器输入的响应,我目前正在 onCreate() 方法中启动一个新线程,该线程初始化所有必需的资源,同时 UI 线程显示加载消息和徽标。如果用户在此初始化过程中按下主页按钮,我将使用活动的 on pause() 方法来通知该线程等待,直到另行通知。如果活动实际上在此等待状态或按下后退按钮时被破坏,我目前依靠 ondestroy() 方法来中断和破坏不完整的初始化线程。

不幸的是,当通过从主屏幕选择它的图标来恢复应用程序时,有时会调用活动的 onCreate() 方法来创建一个新的初始化线程,而无需调用 onDestroy() 方法来终止现有的初始化线程。如果在这种情况下并不总是调用 onDestroy(),我如何确定是否需要销毁现有的初始化线程?

非常感谢有关此问题的任何帮助和/或建议?

4

1 回答 1

0

取决于您的需要,但也许在清单中更改活动的启动模式就足够了:

android:launchMode="singleTask"

相反,“singleTask”和“singleInstance”活动只能开始一个任务。它们始终位于活动堆栈的根部。此外,设备一次只能保存一个活动实例——只有一个这样的任务。

这将防止在 onDestroy 之前调用 onCreate。

编辑:

另一种可能的解决方案是手动检查是否有其他进程在运行您的应用程序,例如 onCreate:

    ActivityManager activityManager = (ActivityManager) this
            .getSystemService(ACTIVITY_SERVICE);
    List<RunningAppProcessInfo> procInfos = activityManager
            .getRunningAppProcesses();
    int counter = 0;
    for (int i = 0; i < procInfos.size(); i++) {
        if (procInfos.get(i).processName.equals(this.getPackageName())) {
            counter++;
        }
        if (counter > 1) {
            // send broadcast to make other activities call finish() or the like
        }
    }

犹豫是否发布此答案,因为它感觉有点骇人听闻,但由于到目前为止尚未发布其他建议,您不妨试一试。

我将它用于不同的场景,手机有时会在启动后启动我的应用程序两次。使用此代码,我可以通过简单地调用完成来阻止第二次启动完成。

于 2013-09-23T21:33:05.723 回答