diff --git a/firebase-messaging/CHANGELOG.md b/firebase-messaging/CHANGELOG.md index 4a7e28a5766..6b0a8bdadd9 100644 --- a/firebase-messaging/CHANGELOG.md +++ b/firebase-messaging/CHANGELOG.md @@ -1,4 +1,6 @@ # Unreleased +* [changed] Bug fix in SyncTask to always unregister the receiver on the same + context on which it was registered. # 24.1.0 diff --git a/firebase-messaging/src/main/java/com/google/firebase/messaging/SyncTask.java b/firebase-messaging/src/main/java/com/google/firebase/messaging/SyncTask.java index c0c4074c11e..cd821f0e1f3 100644 --- a/firebase-messaging/src/main/java/com/google/firebase/messaging/SyncTask.java +++ b/firebase-messaging/src/main/java/com/google/firebase/messaging/SyncTask.java @@ -161,6 +161,7 @@ boolean isDeviceConnected() { static class ConnectivityChangeReceiver extends BroadcastReceiver { @Nullable private SyncTask task; // task is set to null after it has been fired. + @Nullable private Context receiverContext; public ConnectivityChangeReceiver(SyncTask task) { this.task = task; @@ -171,7 +172,10 @@ public void registerReceiver() { Log.d(TAG, "Connectivity change received registered"); } IntentFilter intentFilter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION); - task.getContext().registerReceiver(this, intentFilter); + if (task != null) { + receiverContext = task.getContext(); + receiverContext.registerReceiver(this, intentFilter); + } } @Override @@ -191,7 +195,9 @@ public void onReceive(Context context, Intent intent) { Log.d(TAG, "Connectivity changed. Starting background sync."); } task.firebaseMessaging.enqueueTaskWithDelaySeconds(task, 0); - task.getContext().unregisterReceiver(this); + if (receiverContext != null) { + receiverContext.unregisterReceiver(this); + } task = null; } }