Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/225.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在一定时间后自毁android应用程序_Android_Performance_Android Activity_Android Lifecycle_System.exit - Fatal编程技术网

在一定时间后自毁android应用程序

在一定时间后自毁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

我目前正在开发一款需要大量电池才能支持背景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()


现在,如果我将时间设置为小时左右,并调试该功能,则一切正常。如果我将时间设置为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();
}