在一段时间后自毁一个Android应用程序

时间:2014-10-05 21:12:03

标签: android performance android-activity android-lifecycle system.exit

我目前正在开发一款需要大量电池才能支持背景gps跟踪的应用。我的经验表明,当人们不再真正需要跟踪时,他们会忘记在后台运行的应用程序。因此我设置了一些应该在4小时后关闭应用程序的代码。

public class SelfDestructor {

    private static SelfDestructor instance;

    private final long IDLE_TIME_UNTIL_AUTO_DESTRUCT = 4 * 60 * 60 * 1000; // 4 hours

    private Handler handler;

    private Runnable closeApp = new Runnable() {
        @Override
        public void run() {
            System.exit(0);
        }
    };

    public static SelfDestructor getInstance() {
        if (SelfDestructor.instance == null) {
            SelfDestructor.instance = new SelfDestructor();
        }
        return SelfDestructor.instance;
    }

    public void keepAlive() {
        if (handler == null) {
            handler = new Handler();
        }
        handler.removeCallbacks(closeApp);
        handler.postDelayed(closeApp, IDLE_TIME_UNTIL_AUTO_DESTRUCT);
    }
}

现在在我的主要活动中,我称之为keepAlive()。

@Override
protected void onResume() {
    super.onResume();
    SelfDestructor.getInstance().keepAlive();
}

@Override
protected void onStart() {
    super.onStart();
    SelfDestructor.getInstance().keepAlive();
}

现在如果我将时间设置为一个小时左右并调试该功能一切正常。如果我将时间设置为4小时,则永远不会调用System.exit(0);。我假设应用程序线程与关闭回调只是一段时间后由Android系统暂停,因此将不再执行,而gps将继续运行。任何想法如何正确地使这个工作?

1 个答案:

答案 0 :(得分:1)

handlerpostDelayed不适合长时间游戏。最多它们应该在几秒钟内使用,我个人认为我从未使用过任何超过2秒的时间。

说了这么多,Android有一个适当的类,这些东西应该在很长一段时间后发生,它叫做AlarmManager:http://developer.android.com/reference/android/app/AlarmManager.html

您可以通过调用Context.getSystemService(Context.ALARM_SERVICE)

来获取对系统服务AlarmManager的引用

然后通过调用am.set(AlarmManager.ELAPSED_REALTIME, IDLE_TIME_UNTIL_AUTO_DESTRUCT, operation)

进行设置

operationPendingIntentBroadcastReceiver,您通过AndroidManifest.xml标记在<receiver>注册。然后在此广播接收器中执行关闭的应用程序代码。

另外我应该补充一点,打电话给System.exit(0);并不好,因为这只会在没有太多警告的情况下破坏虚拟机。如果您将命令传递给持有GPS的Service(我相信您正在运行服务),那么它会更好,更有条理/更有条理地关闭,然后此服务将取消GPS请求,并致电stopSelf();