何时杀死活动的初始化线程

时间:2013-09-23 21:25:32

标签: android

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

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

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

1 个答案:

答案 0 :(得分: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
        }
    }

发布这个答案时犹豫不决,因为它感到abit hackish但是因为直到现在还没有其他提议发布,所以你不妨尝试一下。

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