Android: отправка намерений LocalBroadcastManager из событий BroadcastReceiver

У меня возникла странная ситуация, когда получатель намерения регистрируется в LocalBroadcastManager либо из службы, либо из MainActivity, а когда намерение отправляется из получателя PHONE_STATE (определено в AndroidManifest.xml), оно никогда не было получено.

«Самопроверка» с отправкой того же намерения из Activity | Service — работает.

Стоит ли пытаться указать намерение LocalBroadcastManager для получения через AndroidManifest.xml?


Услуга определяется как:

    <service
     android:name=".AppService"
     android:process=":remote">
      <intent-filter>
       <action android:name="me.cmp.app.AppService" />
      </intent-filter>
    </service>

В сервисе:

 public class AppService extends Service {
 @Override
 public void onCreate() {
        super.onCreate();
        LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver, new IntentFilter("me.cmp.app.statechange"));

            // self-test uses same intent sending code:
            Intent intent2 = new Intent("me.cmp.app.statechange");
            intent2.putExtra("message", "selfsend");
            LocalBroadcastManager.getInstance(this).sendBroadcastSync(intent2);

 }  
 ...

В манифесте:

    <receiver android:name="me.cmp.app.PhoneReceiver" >
        <intent-filter>
            <action android:name="android.intent.action.PHONE_STATE" >
            </action>
        </intent-filter>
    </receiver>        

Слушатель:

public class PhoneReceiver extends BroadcastReceiver {

  @Override
  public void onReceive(Context context, Intent intent) {
    Bundle extras = intent.getExtras();
    if (extras != null) {
      Log.e("test", extras.getString(TelephonyManager.EXTRA_STATE));

      Intent intent2 = new Intent("me.cmp.app.statechange");
      intent2.putExtra("message", state.toString());
      LocalBroadcastManager.getInstance(context).sendBroadcastSync(intent2);
      Log.w("test", "Broadcast sent");
    }
  }
}

--

Основная проблема заключается в том, что должен ли я использовать Android : process =:remote в моем приемнике? ; однако я до сих пор не уверен, почему приемник MainActivity не работал раньше, возможно, необходимы полные имена.


person kagali-san    schedule 10.01.2014    source источник
comment
Опубликуйте код для каждой широковещательной рассылки.   -  person A--C    schedule 10.01.2014
comment
текущий код не работает (поэтому ни полные имена намерений, ни sendBroadcastSync) не помогают.   -  person kagali-san    schedule 10.01.2014
comment
Несоответствие, которое я вижу, заключается в том, что ваша служба App, тогда как в манифесте AppService. Я бы удостоверился, что служба работает, но я бы удалил android:process=":remote", чтобы посмотреть, поможет ли это.   -  person A--C    schedule 10.01.2014
comment
@A--c App/Appservice - это опечатка; удаление android:process=:remote сработало, можете ли вы сделать это ответом?   -  person kagali-san    schedule 10.01.2014
comment
Я видел ваше редактирование, что вы подразумеваете под MainActivity's receiver didn't worked earlier? Если служба - это единственное, что является remote, имеет смысл, что LocalBroadcasts не будет работать должным образом.   -  person A--C    schedule 10.01.2014


Ответы (1)


В документации LocalBroadcastReceiver указано, что это

Помощник для регистрации и отправки широковещательных сообщений о намерениях локальным объектам в вашем процессе.

Это означает, что если вы используете Службу, которая работает в отдельном процессе (например, android:process=":remote"), то LocalBroadcastManager, скорее всего, завершится ошибкой (хотя и незаметно), потому что вы, вероятно, получаете два отдельных экземпляра этого класса (по одному для каждого процесса).

person A--C    schedule 10.01.2014