【问题标题】:Starting a service on BOOTUP and then scheduling the service to run every 10 minutes?在 BOOTUP 上启动服务,然后安排服务每 10 分钟运行一次?
【发布时间】:2023-03-31 03:50:01
【问题描述】:

我希望在启动时运行一项服务,然后计划每 10 分钟运行一次。我该怎么办?

如果在启动时我可以强制安排 10 分钟,但我想我每次启动时都需要安排这个,因为重新启动后所有的计划都丢失了?

【问题讨论】:

  • “我想我每次启动时都需要安排这个,因为重新启动后所有的安排都丢失了?” -- 您需要在安装后首次运行您的应用程序和重新启动时安排您的AlarmManager 警报。如果您在手动运行应用程序时确定警报没有运行太久(例如,用户在应用程序的设置中按下强制停止),您可能还需要一些智能来重新安排警报。
  • 感谢 CommonsWare,所以我仍然听 BOOT_COMPLETED,然后使用 AlarmManager 安排警报?

标签: android android-intent android-service


【解决方案1】:

有一个很好的小教程here,它解释了如何在启动时启动一个服务,该服务一直在运行,并在某个固定的时间间隔做一些事情(在教程的情况下写入日志文件)。

正如@CommonsWare 指出的那样,这会给系统带来不必要的负载。更好的方法是使用 AlarmManager 安排重复警报,如this thread 中所述。您可以注册您的应用以接收 BOOT_COMPLETED 广播(如上述教程中所述)并在响应中安排警报。

【讨论】:

  • 第一个教程演示了永恒的服务反模式。对于“在启动时运行服务,然后安排每 10 分钟运行一次”,不需要永久服务,并且用户经常大声抱怨服务堵塞了他们的设备。请请请请请使用AlarmManager
  • @CommonsWare - 我同意。我编辑了我的答案以强调后一种方法。
  • @Ted Hopp 对于我的用例,如果有数百个用于触发警报的pendingIntent 需要在BroadcastReceiver 收到BOOT_COMPLETED 操作后重置怎么办?由于有很多警报,我将如何在后台重置这些警报?
【解决方案2】:

在我的应用程序中,我在ACTION_BOOT_COMPLETED Intent 上注册了一个广播接收器,以便在设备启动完成时收到通知。 要获得结果,您必须在清单文件中指定以下内容:

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
...
<receiver
 android:name=".YOUR_BROADCAST_RECEIVER">
 <intent-filter>
  <action android:name="android.intent.action.BOOT_COMPLETED" />
 </intent-filter>
</receiver>

在 BroadcastReceiver 中,我使用

启动了服务
public void onReceive(Context context, Intent intent) {
 context.startService(new Intent(context, serviceClass));
 ...
}

终于在服务的onStartCommand中

public int onStartCommand(Intent intent, int flags, int startId) {
 ...
 setNextSchedule();
 ...
}

private void setNextSchedule() {
 long time = WHEN_YOU WANT_THE SERVICE TO BE SCHEDULED AGAIN;
 AlarmManager am = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE);
 PendingIntent pi = PendingIntent.getService(this, 0,new Intent(this, this.getClass()), PendingIntent.FLAG_ONE_SHOT);
 am.set(AlarmManager.RTC_WAKEUP, time, pi);
}

AlarmManger 将使用待处理的 Intent 将您传递的 Intent 发送到您的服务。看看here

再见

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-04
    • 1970-01-01
    • 2012-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多