【问题标题】:Android Service scheduled with AlarmManager stops being called after a couple of days使用 AlarmManager 安排的 Android 服务在几天后停止调用
【发布时间】:2023-03-11 08:40:01
【问题描述】:

我一直在尝试使用 AlarmManager 类安排一个 Android 服务重复运行,但几天后该服务停止被调用。最初我一直在使用下面的代码来尝试实现这一点:

Intent alarmIntent = new Intent(currentActivity.getApplicationContext(), AlarmReceiver.class);
PendingIntent pendingAlarmIntent = PendingIntent.getBroadcast(currentActivity.getApplicationContext(),
            AppManager.ALARM_PENDING_INTENT_REQUEST_CODE,
            alarmIntent,
            PendingIntent.FLAG_CANCEL_CURRENT);

AlarmManager alarmManager = (AlarmManager)currentActivity.getApplicationContext().getSystemService(Context.ALARM_SERVICE);
alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP,
            System.currentTimeMillis(),
            interval,
            pendingAlarmIntent);

与接收者:

public class AlarmReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context _context, Intent _intent){
        Intent serviceIntent = new Intent(_context.getApplicationContext(), PostLocationService.class);
        _context.getApplicationContext().startService(serviceIntent);
    }
}

这工作了几天,然后突然停止了。所以我将代码更改为最初向接收器广播一次,然后在每次运行服务时重新广播到接收器。我用以下代码做到了这一点:

Intent alarmIntent = new Intent(currentActivity.getApplicationContext(),     AlarmReceiver.class);
PendingIntent pendingAlarmIntent = PendingIntent.getBroadcast(currentActivity.getApplicationContext(),
            AppManager.ALARM_PENDING_INTENT_REQUEST_CODE,
            alarmIntent,
            PendingIntent.FLAG_CANCEL_CURRENT);

AlarmManager alarmManager = (AlarmManager)currentActivity.getApplicationContext().getSystemService(Context.ALARM_SERVICE);
alarmManager.set(AlarmManager.RTC_WAKEUP,
            interval,
            pendingAlarmIntent);

不幸的是,这具有相同的结果;几天后服务停止执行。

我还注册了一个接收器,用于在设备启动时重新启动 AlarmManager 调用,与上面的代码相同。

我错过了什么吗?对于这种类型的不断重复执行,是否有比上述任何一种方法更好的方法?

【问题讨论】:

  • 您的服务一定是崩溃了。让它在它启动和停止时记录到一个文件或你的网络服务器,这样你就可以知道它是否崩溃了。此外,如果手机正在重启警报丢失,您需要注册一个 BroadcastReceiver 来捕捉 {android.intent.action.BOOT_COMPLETED},为此您需要编辑应用清单文件。 stackoverflow.com/questions/12034357/…

标签: android android-intent scheduled-tasks alarmmanager android-pendingintent


【解决方案1】:

根据开发者网站:

注意:从 API 19 (KITKAT) 开始,警报传递是不精确的:操作系统将切换警报以最大程度地减少唤醒和电池使用。有新的 API 来支持需要严格交付保证的应用程序;参见 setWindow(int, long, long, PendingIntent) 和 setExact(int, long, PendingIntent)。 targetSdkVersion 早于 API 19 的应用程序将继续看到之前的行为,即所有警报都在请求时准确传递 块引用

see more

希望对你有帮助

【讨论】:

  • AlarmManager.set 在大多数情况下仍然可以。当您使用 set() 时,您是在告诉警报管理器您希望该操作在那个时间左右发生,但是操作系统可以决定优化电池寿命或避免太多警报触发得太近。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多