почему PendingIntent.getBroadcast () распознается только статическими получателями? - PullRequest
0 голосов
/ 15 сентября 2018

Я использую FCM, в onMessageReceived() Я использую PendingIntent.getBroadcast() для вызова BroadcastReceiver, присутствующего в той же услуге. В приведенном ниже коде я отправляю трансляцию, если уведомление удалено из области уведомлений.

 @Override
public void onMessageReceived(RemoteMessage remoteMessage) {
    super.onMessageReceived(remoteMessage);

     ......

     Intent intent = new Intent(getApplicationContext(), MyBroadcastReceiver.class);
            intent.putExtra("id", NOTIFICATION_ID);
            PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
            builder.setDeleteIntent(pendingIntent);

     ......

}

Более того, в методе onCreate() я регистрирую BroadcastReceiver, поскольку я отправляю трансляции из некоторых других видов деятельности.

@Override
public void onCreate() {
    super.onCreate();
    Log.d(TAG, "onCreate: ");

    //  registering the broadcast receiver on action "broadcastReceiverAction"
    IntentFilter intentFilter = new IntentFilter("broadcastReceiverAction");
    LocalBroadcastManager.getInstance(this).registerReceiver(new MyBroadcastReceiver(), intentFilter);
}  

Я заметил, что при удалении статического приемника из манифеста 1015 *, BrodcastReceiver не вызывается при удалении уведомлений, несмотря на регистрацию приемника вещания в методе onCreate() , Почему это происходит? Значит ли это, что PendingIntent.getBroadcast() нужен статический приемник?

MyBroadcastReceiver

public static class MyBroadcastReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        SharedPreferences sharedPreferences = context.getSharedPreferences("shared", MODE_PRIVATE);
        SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.remove(String.valueOf(intent.getExtras().getInt("id")));
        editor.commit();
    }
}

РЕДАКТИРОВАТЬ 1 статический приемник вещания

<receiver android:name=".MyFirebaseMessagingService$MyBroadcastReceiver"  android:exported="true">
        <intent-filter>
            <action android:name="broadcastReceiverAction" />
        </intent-filter>
    </receiver>

отмена регистрации приемника вещания в onDestroy()

@Override
public void onDestroy() {
    super.onDestroy();
    Log.d(TAG, "onDestroy: ");

    //  un-registering receiver
    LocalBroadcastManager.getInstance(this).unregisterReceiver(new MyBroadcastReceiver());
}

1 Ответ

0 голосов
/ 16 сентября 2018

Поскольку ваш код для использования динамического вещания (нестатический) неверен.

Сначала вы регистрируетесь в onCreate метод

//  registering the broadcast receiver on action "broadcastReceiverAction"
IntentFilter intentFilter = new IntentFilter("broadcastReceiverAction");
LocalBroadcastManager.getInstance(this).registerReceiver(new MyBroadcastReceiver(), intentFilter);

Затем вы отправляете широковещательный

Intent intent = new Intent(getApplicationContext(), MyBroadcastReceiver.class);
intent.putExtra("id", NOTIFICATION_ID);
PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

Вы забыли добавить action в намерение, заключенное в PendingIntent, чтобы система не могла найти и запустить вашу трансляцию.

Измените ваш код на

Intent intent = new Intent(getApplicationContext(), MyBroadcastReceiver.class);
intent.setAction("broadcastReceiverAction"); // Add this line
intent.putExtra("id", NOTIFICATION_ID);
PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

Обновление: Когда вы удалите уведомление, PendingIntent выполнит трансляцию, например, вызов Context.sendBroadcast().В вашем коде вы используете LocalBroadcastManager, который ловит только message/intent, транслируемый из компонентов в вашем приложении.Он не может перехватить message/intent из системы.

Поэтому измените код на

private MyBroadcastReceiver myBroadcastReceiver;

@Override
public void onCreate() {
    super.onCreate();
    //  registering the broadcast receiver on action "broadcastReceiverAction"
    IntentFilter intentFilter = new IntentFilter("broadcastReceiverAction");
    myBroadcastReceiver = new MyBroadcastReceiver();
    registerReceiver(myBroadcastReceiver, intentFilter);
}

@Override
public void onDestroy() {
    super.onDestroy();
    unregisterReceiver(myBroadcastReceiver);
}

@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
    super.onMessageReceived(remoteMessage);

     ......

     Intent intent = new Intent("broadcastReceiverAction");
     intent.putExtra("id", NOTIFICATION_ID);
     PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
     builder.setDeleteIntent(pendingIntent);

     ......

}
...