WakefulBroadcastReceiver无法从AlarmManager接收PendingIntent

4
我正在研究一款必须以指定间隔重复执行任务的应用程序。如果需要,我希望它可以唤醒设备。但是不知道为什么,WakefulBroadcastReceiver 永远不会执行其通过 AlarmManager 触发的 onReceive 方法。即使使用普通的 BroadcastReceiver 也无法解决该问题。我正在使用 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);
}}
2个回答

3
我敢打赌,你没有在清单文件中声明广播接收器。
<receiver android:name=".SimpleWakefulBroadcastReceiver"/>

成功了!但是根据我阅读的官方文档和Eclipse警告语句,如果您在程序中声明了接收器,则不需要在清单中声明---建议作为最佳实践这样做,并且我在startRepeatingAlarm()方法中这样做。 - Marco Virgolin
1
文档有时会误导人 :-( 如果接收器将被外部组件(即应用程序之外的东西)访问,则需要在清单中声明它。由于您正在使用AlarmManager触发接收器(而AlarmManager是外部组件),因此需要在清单中声明接收器。 - David Wasser
另一个常见的错误是使用PendingIntent.getService而不是PendingIntent.getBroadcast。 - vinga

-1
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!虽然这段代码可能有助于解决问题,但它并没有解释为什么以及如何回答这个问题。提供这种额外的上下文将显著提高其长期教育价值。请编辑您的答案以添加说明,包括适用的限制和假设。 - Toby Speight

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接