BroadcastReceiver не работает после остановки приложения

У меня есть служба переднего плана, загружающая изображения и транслирующая статус, используя намерение с действием «myAction».

Мое приложение должно реагировать на трансляцию, например отправлять запрос к серверу после получения сообщения об успешном завершении или всплывающее уведомление после получения сообщения об ошибке. Я следую этому https://developer.android.com/training/run-background-service/report-status.html

Отправка широковещательного намерения не запускает и не возобновляет действие. BroadcastReceiver для Activity получает и обрабатывает объекты Intent, даже когда ваше приложение находится в фоновом режиме, но не переводит ваше приложение на передний план. Если вы хотите уведомить пользователя о событии, которое произошло в фоновом режиме, когда ваше приложение не было видно, используйте Уведомление. Никогда не запускайте Activity в ответ на входящее широковещательное намерение.

Сначала я пытаюсь статически зарегистрировать свой широковещательный приемник в Manifest. Не работает. Затем я следую этой инструкции: Не отключать широковещательный приемник после закрытия приложения, чтобы запустить службу для регистрации моего широковещательного приемника. Оба не работают (журнал не отображается), когда я смахиваю или закрываю приложение. Чтобы быть конкретным, я могу видеть журналы «HAHAHAHA» и «HEHEHEHE», когда они находятся на переднем плане. Он не выходит, когда я вычеркиваю его из списков приложений или нажимаю назад, чтобы выйти из приложения.

Вот мой код. Где я скучаю?

В моем манифесте

<application...>
  <receiver android:name=".MyBroadcastReceiver"
      android:enabled="true"
      android:exported="false">
    <intent-filter android:priority="0">
      <action android:name="myAction"/>
    </intent-filter>
  </receiver>
  <service
      android:name=".MyService"
      android:exported="false"/>
</application>

MyBroadcastReceive.java

public class MyBroadcastReceiver extends BroadcastReceiver{
  @Override
  public void onReceive(Context context, Intent intent) {
    Log.d("HAHAHAHA", "Broadcast received.");
  }
}

MyService.java

public class MyService extends Service {
  BroadcastReceiver mReceiver;

  // use this as an inner class like here or as a top-level class
  public class MyReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
      // do something
      Log.d("HEHEHEHE", "Broadcast received.");
    }
  }

  @Override
  public void onCreate() {
    // get an instance of the receiver in your service
    IntentFilter filter = new IntentFilter();
    filter.addAction("myAction");
    mReceiver = new MyReceiver();
    registerReceiver(mReceiver, filter);
  }

  @Override
  public IBinder onBind(Intent intent) {
    return null;
  }


  @Override
  public void onDestroy() {
    Log.d("HEHEHEHE", "onDestroy");
    super.onDestroy();
  }
}

MainActivity.java

onStart() {
  Intent intent = new Intent(this, MyService.class);
  startService(intent);
}

Трансляция называется следующим образом:

LocalBroadcastManager.getInstance(service).sendBroadcast(intent);

person Mingwei Lin    schedule 18.05.2017    source источник


Ответы (1)


Сначала я пытаюсь статически зарегистрировать свой широковещательный приемник в Manifest. Не работает.

Вы не можете использовать зарегистрированные в манифесте получатели с LocalBroadcastManager. Только получатели, зарегистрированные через LocalBroadcastManager.getInstance().registerReceiver(), будут отвечать на локальные трансляции.

Мое приложение должно реагировать на трансляцию, например отправлять запрос к серверу после получения сообщения об успешном завершении или всплывающее уведомление после получения сообщения об ошибке.

Избавьтесь от трансляции и сделайте это в сервисе.

person CommonsWare    schedule 18.05.2017
comment
Писать в сервисе немного, потому что мой сервис рассчитан на множество приложений. Приложения могут выполнять разные действия с определенным сообщением. Можно ли использовать глобальную трансляцию для решения этой проблемы? - person Mingwei Lin; 19.05.2017
comment
@MingweiLin: Если вы пытаетесь работать между приложениями, глобальные трансляции могут работать ... по крайней мере, до выхода Android O в конце этого года. На этом этапе все станет немного сложнее.. И есть проблемы с безопасностью, которые вам нужно будет решить. Но если вы переключитесь с LocalBroadcastManager.getInstance(service).sendBroadcast(intent) на service.sendBroadcast(intent);, ваш зарегистрированный в манифесте приемник будет работать (опять же, пока не появится Android O). - person CommonsWare; 19.05.2017