【问题标题】:WakefulBroadcastReceiver doesn't receive PendingIntent from AlarmManagerWakefulBroadcastReceiver 没有收到来自 AlarmManager 的 PendingIntent
【发布时间】:2015-03-09 17:18:37
【问题描述】:

我正在努力开发一个必须以指定间隔重复任务的应用。如果需要,我希望它唤醒设备。我不知道为什么,但是 WakefulBroadcastReceiver 永远不会执行应该通过 AlarmManager 触发的 onReceive 方法。正常的广播接收器问题仍然存在。我使用的是 Lollipop 5.0.1 Nexus5,时间间隔为 5-20 秒。

代码如下:

class mypackage.MainActivity

[...]
private void startRepeatingAlarm(){
    this.wbr = new SimpleWakefulBroadcastReceiver();
    this.registerReceiver(wbr, new IntentFilter("mypackage.FOO_ACTION"));
    Intent i = new Intent("mypackage.FOO_ACTION");
    i.setClass(this, SimpleWakefulBroadcastReceiver.class);

    pendingIntent = PendingIntent.getBroadcast(MainActivity.this, 1234, i, PendingIntent.FLAG_CANCEL_CURRENT);      
    AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);      
    manager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(), timeInterval, pendingIntent);
    Toast.makeText(this, "Alarm set", Toast.LENGTH_SHORT).show();
}

class mypackage.SimpleWakefulBroadcastReceiver

public class SimpleWakefulBroadcastReceiver extends WakefulBroadcastReceiver{

@Override
public void onReceive(Context context, Intent intent) {
    // This method gets NEVER called
    Intent service = new Intent(context, SimpleWakefulService.class);
    startWakefulService(context, service);
}}

【问题讨论】:

    标签: android broadcastreceiver alarmmanager android-pendingintent android-alarms


    【解决方案1】:

    我将在这里伸出我的脖子,并猜测您尚未在清单中声明广播接收器:

    <receiver android:name=".SimpleWakefulBroadcastReceiver"/>
    

    【讨论】:

    • 成功了!但据我通过阅读官方文档和 Eclipse 警告声明了解,如果您以编程方式执行此操作,则无需在清单中声明接收者——建议将其作为最佳实践,我这样做它在 startRepeatingAlarm() 方法中。
    • 文档有时会产生误导 :-( 如果 外部组件 可以访问接收器,则需要在清单中声明接收器(即:应用程序之外的东西) . 由于您使用AlarmManager 来触发您的接收器(并且AlarmManager 是一个外部组件),您需要在清单中声明接收器。
    • 其他常见错误是使用 PendingIntent.getService 而不是 PendingIntent.getBroadcast
    【解决方案2】:
    private void startRepeatingAlarm(){    
     Intent intent = new Intent(MainActivity.this, SimpleWakefulBroadcastReceiver.class);
                    intent.setAction(Intent.ACTION_MAIN);
                    pendingIntent = PendingIntent.getBroadcast(getApplicationContext(),
                            0, intent, 0);
                  //repeat per 1 min
                    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 1 * 60 * 1000, pendingIntent);
    
    }
    

    【讨论】:

    • 欢迎来到 Stack Overflow!尽管此代码可能有助于解决问题,但它并没有解释 为什么 和/或 如何 回答问题。提供这种额外的背景将显着提高其长期教育价值。请edit您的答案添加解释,包括适用的限制和假设。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-16
    • 2023-04-08
    相关资源
    最近更新 更多