0

我目前正在开发一个需要大量电池才能支持后台 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 将继续运行时将不再执行。任何想法如何正确地让它工作?

4

1 回答 1

1

handler并且postDelayed不适合长时间使用。最多它们应该在几秒钟内使用,我个人认为我从未使用过超过 2 秒的时间。

说了这么多,Android有一个合适的类来处理“应该在很长一段时间后发生的事情”,它被称为AlarmManager:http: //developer.android.com/reference/android/app/AlarmManager.html

您可以通过调用获取对系统服务 AlarmManager 的引用Context.getSystemService(Context.ALARM_SERVICE)

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

operation是您通过标签注册的PendingIntent一个。然后你在这个广播接收器中执行关闭应用程序代码。BroadcastReceiverAndroidManifest.xml<receiver>

另外我应该补充一点,调用它永远不会很好System.exit(0);,因为这只会在没有太多警告的情况下破坏虚拟机。Service如果您将命令传递给持有 GPS 的人(我相信您正在运行一项服务),这是一个更好、更有条理/结构化的关闭,然后该服务将取消 GPS 请求,并调用stopSelf();

于 2014-10-05T21:29:32.970 回答