我目前正在开发一款需要大量电池才能支持背景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将继续运行。任何想法如何正确地使这个工作?
答案 0 :(得分:1)
handler
和postDelayed
不适合长时间游戏。最多它们应该在几秒钟内使用,我个人认为我从未使用过任何超过2秒的时间。
说了这么多,Android有一个适当的类,这些东西应该在很长一段时间后发生,它叫做AlarmManager:http://developer.android.com/reference/android/app/AlarmManager.html
您可以通过调用Context.getSystemService(Context.ALARM_SERVICE)
然后通过调用am.set(AlarmManager.ELAPSED_REALTIME, IDLE_TIME_UNTIL_AUTO_DESTRUCT, operation)
operation
是PendingIntent
到BroadcastReceiver
,您通过AndroidManifest.xml
标记在<receiver>
注册。然后在此广播接收器中执行关闭的应用程序代码。
另外我应该补充一点,打电话给System.exit(0);
并不好,因为这只会在没有太多警告的情况下破坏虚拟机。如果您将命令传递给持有GPS的Service
(我相信您正在运行服务),那么它会更好,更有条理/更有条理地关闭,然后此服务将取消GPS请求,并致电stopSelf();