0

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

+0

不是确定如何做到这一点,但添加通知栏中无法删除的通知应该是让用户了解的好方法。确保点击通知时,系统会提示用户关闭进程或保持运行状态。 – 2014-10-05 21:15:30

+0

是啊,已经实现了...... :) – stephanlindauer 2014-10-05 21:16:34

+0

我想这是处理这个问题的最好方法。自动杀死一个进程似乎并不适合我。至少,我会将它设置为空闲时间的设置,而不是使用常量。无论如何,就我所知,应用程序可能会被放在后台,这意味着代码将不会运行。您必须改为创建闹钟。 https://developer.android.com/training/scheduling/alarms.html – 2014-10-05 21:21:10

回答

1

handlerpostDelayed不适合长时间定时器。至多他们应该在几秒钟内使用,我个人认为我从来没有用过任何超过2秒的任何东西。

说了这么多,Android的拥有“的东西很长一段时间后,应该会是”适当的类,它被称为AlarmManager:http://developer.android.com/reference/android/app/AlarmManager.html

您可以通过调用Context.getSystemService(Context.ALARM_SERVICE)

获取到系统服务AlarmManager引用

然后将其设置通过调用am.set(AlarmManager.ELAPSED_REALTIME, IDLE_TIME_UNTIL_AUTO_DESTRUCT, operation)

operationPendingIntent到您在AndroidManifest.xml通过<receiver>标签注册BroadcastReceiver。然后你在这个广播接收机内部做紧密的应用程序代码。

另外我应该补充一点,称System.exit(0);从来不好,因为这只是摧毁了虚拟机而没有多少警告。如果您传递命令给持有GPS的Service(我相信您正在运行服务),那么这是一个更好,更有组织/结构化的关闭,那么此服务将取消GPS请求,并致电stopSelf();

相关问题