Added defensive code (#8324)
authorGerald Versluis <gerald.versluis@microsoft.com>
Tue, 5 Nov 2019 09:53:34 +0000 (10:53 +0100)
committerGitHub <noreply@github.com>
Tue, 5 Nov 2019 09:53:34 +0000 (10:53 +0100)
Xamarin.Forms.Platform.Android/AppCompat/FormsAppCompatActivity.cs
Xamarin.Forms.Platform.Android/FormsApplicationActivity.cs

index fe58f1b..334fbb6 100644 (file)
@@ -55,6 +55,7 @@ namespace Xamarin.Forms.Platform.Android
 
                bool _renderersAdded;
                bool _activityCreated;
+               bool _powerSaveReceiverRegistered;
                PowerSaveModeBroadcastReceiver _powerSaveModeBroadcastReceiver;
 
                static readonly ManualResetEventSlim PreviousActivityDestroying = new ManualResetEventSlim(true);
@@ -296,10 +297,11 @@ namespace Xamarin.Forms.Platform.Android
                {
                        _layout.HideKeyboard(true);
 
-                       if (Forms.IsLollipopOrNewer)
+                       if (_powerSaveReceiverRegistered && Forms.IsLollipopOrNewer)
                        {
-                               // Don't listen for power save mode changes while we're paused
-                               UnregisterReceiver(_powerSaveModeBroadcastReceiver);
+                                       // Don't listen for power save mode changes while we're paused
+                                       UnregisterReceiver(_powerSaveModeBroadcastReceiver);
+                                       _powerSaveReceiverRegistered = false;
                        }
 
                        // Stop animations or other ongoing actions that could consume CPU
@@ -339,12 +341,14 @@ namespace Xamarin.Forms.Platform.Android
                        _previousState = _currentState;
                        _currentState = AndroidApplicationLifecycleState.OnResume;
 
-                       if (Forms.IsLollipopOrNewer)
+                       if (!_powerSaveReceiverRegistered && Forms.IsLollipopOrNewer)
                        {
                                // Start listening for power save mode changes
                                RegisterReceiver(_powerSaveModeBroadcastReceiver, new IntentFilter(
                                        PowerManager.ActionPowerSaveModeChanged
                                ));
+
+                               _powerSaveReceiverRegistered = true;
                        }
 
                        OnStateChanged();
index 27ee495..46303f6 100644 (file)
@@ -18,6 +18,7 @@ namespace Xamarin.Forms.Platform.Android
                AndroidApplicationLifecycleState _currentState;
                LinearLayout _layout;
 
+               bool _powerSaveReceiverRegistered;
                PowerSaveModeBroadcastReceiver _powerSaveModeBroadcastReceiver;
 
                AndroidApplicationLifecycleState _previousState;
@@ -149,10 +150,11 @@ namespace Xamarin.Forms.Platform.Android
                        _previousState = _currentState;
                        _currentState = AndroidApplicationLifecycleState.OnPause;
 
-                       if (Forms.IsLollipopOrNewer)
+                       if (_powerSaveReceiverRegistered && Forms.IsLollipopOrNewer)
                        {
                                // Don't listen for power save mode changes while we're paused
                                UnregisterReceiver(_powerSaveModeBroadcastReceiver);
+                               _powerSaveReceiverRegistered = false;
                        }
 
                        OnStateChanged();
@@ -176,11 +178,13 @@ namespace Xamarin.Forms.Platform.Android
                        _previousState = _currentState;
                        _currentState = AndroidApplicationLifecycleState.OnResume;
 
-                       if (Forms.IsLollipopOrNewer)
+                       if (!_powerSaveReceiverRegistered && Forms.IsLollipopOrNewer)
                        {
                                // Start listening for power save mode changes
                                RegisterReceiver(_powerSaveModeBroadcastReceiver, new IntentFilter(
                                        PowerManager.ActionPowerSaveModeChanged));
+
+                               _powerSaveReceiverRegistered = true;
                        }
 
                        OnStateChanged();