在一定时间后自毁android应用程序
我目前正在开发一款需要大量电池才能支持背景gps跟踪的应用程序。我的经验表明,当人们不再真正需要跟踪时,他们会忘记在后台运行应用程序。因此,我设置了一些代码,应该在4小时后关闭应用程序在一定时间后自毁android应用程序,android,performance,android-activity,android-lifecycle,system.exit,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 h
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()
现在,如果我将时间设置为小时左右,并调试该功能,则一切正常。如果我将时间设置为4小时,则
系统退出(0)代码>从未被调用。我假设带有关闭回调的应用程序线程在一段时间后被android系统暂停,因此在gps继续运行时将不再执行。有什么办法可以让它正常工作吗?handler
和postDelayed
不适合长时间使用。最多只能在几秒钟内使用,我个人认为我从未使用过超过2秒钟的
综上所述,Android有一个合适的类来描述“长时间后应该发生的事情”,它被称为AlarmManager:
您可以通过调用Context.getSystemService(Context.ALARM\u service)
然后通过调用am.set(AlarmManager.appeased\u REALTIME,IDLE\u TIME\u UNTIL\u AUTO\u DESTRUCT,operation)进行设置。
操作是通过
标记在AndroidManifest.xml
中注册的广播接收器的挂起内容。然后在这个广播接收器中执行关闭应用程序代码
我还应该补充一点,调用System.exit(0)永远都不好代码>,因为这只是在没有太多警告的情况下销毁VM。如果您将命令传递给持有GPS的服务
(我相信您正在运行服务),则该服务将取消GPS请求,并调用stopSelf(),这是一种更好、更有组织性/结构化的关机方式代码>不确定如何实现这一点,但在通知栏中添加一个无法删除的通知应该是让用户意识到这一点的好方法。确保在单击通知时,提示用户关闭该进程或使其保持运行。是的,已经实现了…:)我想这是处理这个问题的最好办法。自动终止进程对我来说似乎不合适。至少,我可以通过设置空闲时间来配置它,而不是使用常量。无论如何,据我记忆所及,应用程序有可能被放在后台,这意味着代码不会运行。您必须创建一个警报。
@Override
protected void onResume() {
super.onResume();
SelfDestructor.getInstance().keepAlive();
}
@Override
protected void onStart() {
super.onStart();
SelfDestructor.getInstance().keepAlive();
}