【问题标题】:Android: AlarmManager sometimes doesn't call BroadcastReceiverAndroid:AlarmManager 有时不调用 BroadcastReceiver
【发布时间】:2012-11-02 16:15:40
【问题描述】:

在我的应用程序中,我有一个 BroadcastReceiver,它由 AlarmManager 调用。 BroadcastReceiver 调用 CommonsWare 的 WakefulIntentservice

我在手机上对此进行了测试,有时我的BroadcastReceiver 似乎根本没有被调用。我真的很困惑它可能是什么。我的 BroadcastReceiver 和 WakefulIntentservice 已在清单中注册。

这是我的代码: 在 AlarmActivity 中:

Calendar cal = Calendar.getInstance();
cal.add(Calendar.SECOND, 2);

Intent intent = new Intent(this, AlarmReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, 0);

AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), savedIntervalAutomaticMilisInt, pendingIntent);

Toast.makeText(this, "Saved", Toast.LENGTH_LONG).show();

finish();

报警接收器:

package com.something.app;

import com.commonsware.cwac.wakeful.WakefulIntentService;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

public class AlarmReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Intent i = new Intent(context, AlarmService.class);
        WakefulIntentService.sendWakefulWork(context, i);
    }
}

还有报警服务:

package com.something.app;

import android.app.PendingIntent;
import android.content.Intent;
import com.commonsware.cwac.wakeful.WakefulIntentService;

public class AlarmService extends WakefulIntentService {

    public AlarmService() {
        super("AlarmService");
    }

    @Override
    protected void doWakefulWork(Intent arg0) {
        //A looooooooot of stuff
    }

有谁知道为什么有时不调用BroadcastReceiver

编辑:我听说要设置一个接收onBootCompletedBroadcastReceiver。是必须的吗?

【问题讨论】:

  • 行得通,我很确定。它由微调器选择。
  • 使用adb shell dumpsys alarm 调试您的闹钟不工作的原因。当您遇到广播似乎未发送的情况时,请使用adb shell dumpsys alarm 了解您的闹钟是否已安排以及安排的时间。您还可以考虑使用日志记录语句或断点来更好地检测广播何时发送。 “这是必须的吗?” -- 仅当您需要在设备重启后重新建立闹钟时间表时。
  • @CommonsWare 好的,我会试试的。如果需要在重启后重新建立闹钟,我现在该怎么办?
  • "如果需要在重启后重新建立警报,我现在该怎么办?" -- 你希望知道你是否希望你的闹钟在重启后仍然存在。毕竟,这是您的应用程序。当设备重新启动时,AlarmManager 中的所有计划事件都将被清除。因此,如果您在 AlarmManager 中设置了一个事件,并且您希望该事件在重新启动后仍保留在 AlarmManager 中,您需要自己执行此操作,通常通过 ACTION_BOOT_COMPLETED BroadcastReceiver.
  • 哦,好吧,我以为你的意思是如果我想在启动时更改闹钟,它是必需的。但这很可能是问题所在。我会试试这个。

标签: java android broadcastreceiver alarmmanager commonsware-cwac


【解决方案1】:

所以,这就是问题所在:如果设备重新启动,有时它会清除警报,因此您必须在接收 onBootCompletedBroadcastReceiver 中重置它们

【讨论】:

    猜你喜欢
    • 2016-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多