WakefulBroadcastReceiver не получает PendingIntent от AlarmManager

Я борюсь с приложением, которое должно повторять задачу с заданным интервалом. Я хочу, чтобы он разбудил устройство, если это необходимо. Я понятия не имею, почему, но WakefulBroadcastReceiver НИКОГДА не выполняет свой метод onReceive, который должен запускаться через AlarmManager. Проблема сохраняется с обычным BroadcastReceiver. Я использую Lollipop 5.0.1 Nexus5, временные интервалы 5-20 секунд.

Вот код:

класс 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();
}

класс 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);
}}

person Marco Virgolin    schedule 09.03.2015    source источник


Ответы (2)


Я собираюсь высунуть свою шею и предположить, что вы не объявили широковещательный приемник в своем манифесте:

<receiver android:name=".SimpleWakefulBroadcastReceiver"/>
person David Wasser    schedule 12.03.2015
comment
Это сработало! Но, насколько я понял, прочитав официальную документацию и из предупреждения Eclipse, нет необходимости объявлять получателя в манифесте, если вы делаете это программно --- предлагается сделать это как наилучшую практику, и я делаю это в методе startRepeatingAlarm(). - person Marco Virgolin; 13.03.2015
comment
Документация иногда вводит в заблуждение :-( Вам нужно объявить свой приемник в манифесте, если к нему будет обращаться внешний компонент (то есть: что-то вне вашего приложения). Поскольку вы используете AlarmManager для запуска ваш приемник (а AlarmManager является внешним компонентом), вам нужно, чтобы приемник был объявлен в манифесте. - person David Wasser; 13.03.2015
comment
Другой распространенной ошибкой является использование PendingIntent.getService вместо PendingIntent.getBroadcast. - person vinga; 10.02.2016

person    schedule
comment
Добро пожаловать в Stack Overflow! Хотя этот код может помочь решить проблему, он не объясняет, почему и/или как отвечает на вопрос. Предоставление этого дополнительного контекста значительно повысит его долгосрочную образовательную ценность. Пожалуйста, отредактируйте свой ответ, чтобы добавить пояснение, включая применимые ограничения и предположения. - person Toby Speight; 25.10.2016