在一段时间后自行破坏Android应用程序
我目前正在开发一款需要大量电池才能支持背景GPS跟踪的应用程序。我的经验表明,当人们不再需要跟踪时,人们只会忘记在后台运行的应用程序。因此我设置了一些应该在4小时后关闭应用程序的代码。在一段时间后自行破坏Android应用程序
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将继续运行时不会再执行。任何想法如何正确地得到这个工作?
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
到您在AndroidManifest.xml
通过<receiver>
标签注册BroadcastReceiver
。然后你在这个广播接收机内部做紧密的应用程序代码。
另外我应该补充一点,称System.exit(0);
从来不好,因为这只是摧毁了虚拟机而没有多少警告。如果您传递命令给持有GPS的Service
(我相信您正在运行服务),那么这是一个更好,更有组织/结构化的关闭,那么此服务将取消GPS请求,并致电stopSelf();
不是确定如何做到这一点,但添加通知栏中无法删除的通知应该是让用户了解的好方法。确保点击通知时,系统会提示用户关闭进程或保持运行状态。 – 2014-10-05 21:15:30
是啊,已经实现了...... :) – stephanlindauer 2014-10-05 21:16:34
我想这是处理这个问题的最好方法。自动杀死一个进程似乎并不适合我。至少,我会将它设置为空闲时间的设置,而不是使用常量。无论如何,就我所知,应用程序可能会被放在后台,这意味着代码将不会运行。您必须改为创建闹钟。 https://developer.android.com/training/scheduling/alarms.html – 2014-10-05 21:21:10