如何在android中安排一些代码执行或者:android中的守护程序线程究竟是什么?

我目前正在开发一个Android OS的应用程序,它需要不时从远程服务器获取数据。

因为即使实际的前端应用程序没有运行,也应该执行这个“更新”,我实现了一个在系统启动时启动的远程服务。 现在我需要安排一个计时器来开始更新。

“计时器”是这项工作的合适人选吗? 如果“是”:“正常”Timer()与Timer(“真实”)作为“守护进程”启动的有什么区别?

http://developer.android.com/reference/java/util/Timer.html对此不是很有帮助:(

编辑:

好的 – 我看到有更多的方法可以做到这一点比我预期的要多。 澄清:

  • 我想在指定的时间执行一些代码。
  • 此计时器用于在将来7天触发代码执行。 (即,在给定的工作日和时间每周)
  • 代码应该在没有唤醒电话的情况下运行,如果它正在“hibernate”(屏幕变暗)。
  • 运行代码时,不应启动任何活动。 即屏幕上没有弹出应用程序。
  • 执行的代码应该从互联网上获取一些数据。 如果此时没有可用的互联网连接,则应将计时器设置为30分钟,然后再试一次。
  • 完成代码执行后,计时器将设置为下一个时间间隔,这将是7天后。
  • 计时器应该在系统启动时启动,例如,如果我重新启动电话,计时器应确定执行代码的下一个日期并安排计时器。 这必须在没有任何用户交互的情况下工作!
  • 当“hibernate”时,线程/服务/定时器/任何东西都不应该消耗任何系统资源…

  • 我需要的是一个简单的unix cronjob。

我想这里有人知道android的“newsrob”吗? 我想要实现的与newsrob-updateservice几乎相同。

使用AlarmManager 。 这允许您设置计划,然后退出组件。 您的代码不需要保留在内存中,并且会在闹钟响起时触发。

我实现了一个在系统启动时启动的远程服务

请不要仅为计划任务执行此操作。 使用AlarmManager

如果您希望在手机处于睡眠状态时完成工作,则需要使用_WAKEUP警报类型,并且可能使用类似我的WakefulIntentService来保持设备在工作完成时保持清醒状态。

我最近不得不按照相同的模式开发应用程序。

这是我设计它的方式:

我通过配置对话框创建了一个由前端显式启动的服务,该配置对话框由BroadcastReceiver启动,等待激活网络连接:

        

该服务启动时会启动一个新的HandlerThread,并将其与Looper关联:

 public class MyService extends Service { private Looper serviceLooper; private MyHandler serviceHandler; @Override public IBinder onBind(Intent intent) { return null; } @Override public void onCreate() { //Toast.makeText(this, "service started", Toast.LENGTH_SHORT).show(); HandlerThread thread = new HandlerThread("MyHandlerThread", Process.THREAD_PRIORITY_BACKGROUND); thread.start(); serviceLooper = thread.getLooper(); serviceHandler = new MyHandler(this, serviceLooper); // initial message serviceHandler.sendMessage(Message.obtain()); } @Override public void onDestroy() { serviceLooper.quit(); //Toast.makeText(this, "service stopped", Toast.LENGTH_SHORT).show(); } } 

当网络出现故障或前端禁用它时,服务将停止,而looper也会停止。

现在,在MyHandler中,我实际上在接收消息时从服务器获取更新。

 public class MyHandler extends Handler { private final Context context; public MyHandler(Context context, Looper looper) { super(looper); this.context = context; } @Override public void handleMessage(Message msg) { // handle message and perform update // ... // try again 30 minutes this.sendMessageDelayed(Message.obtain(), 1000 * 60 * 30); } } 

你可以看到的诀窍是向自己发送延迟消息,以便在30分钟后处理。

与使用AlarmManager相比,这种解决方案的优势在于手机不会在设计的时间被强行唤醒,这意味着如果不需要,它可以更好地利用手机资源。

此外,我不会在启动时启动服务,只有当有一个活跃的互联网连接时,我会在连接消失后立即停止它。

到目前为止它非常有效。