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