Android power save mode listener?

后端 未结 3 336
执笔经年
执笔经年 2021-01-12 11:04

How can an Android listener be created to perform a task just before entering power save mode? Also: what are some of the low power options that can be controlled by this ta

相关标签:
3条回答
  • 2021-01-12 11:35

    The answer above(for API 21 and above) is not exactly right. You should register a receiver in your activity or service like this:

    BroadcastReceiver powerSaverChangeReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            checkPowerSaverMode();
        }
     };
    
    IntentFilter filter = new IntentFilter();
    filter.addAction("android.os.action.POWER_SAVE_MODE_CHANGED");
    registerReceiver(powerSaverChangeReceiver, filter);
    

    The reason for this is that receivers in manifest are not triggered by this broadcast.

    ACTION_POWER_SAVE_MODE_CHANGED

    Intent that is broadcast when the state of isPowerSaveMode() changes. This broadcast is only sent to registered receivers.

    I have tested this and it works.

    0 讨论(0)
  • 2021-01-12 11:41

    How can an Android listener be created to perform a task just before entering power save mode?

    There is no broadcast Intent for this. The closest is ACTION_SCREEN_OFF. The device will likely fall asleep in the near future after you receive this broadcast. And, you can only listen for this broadcast using a BroadcastReceiver registered via registerReceiver() in an activity or service or other Context.

    Also: what are some of the low power options that can be controlled by this task?

    I have no idea what this means, sorry.

    0 讨论(0)
  • 2021-01-12 11:47

    Since Lollipop (API 21) there is PowerManager#ACTION_POWER_SAVE_MODE_CHANGED broadcast intent.

    So you need just to receive it:


    AndroidManifest.xml:

    <receiver android:name=".observers.PowerSaveModeReceiver">
        <intent-filter>
            <action android:name="android.os.action.POWER_SAVE_MODE_CHANGED"/> 
        </intent-filter>
    </receiver>
    


    PowerSaveModeReceiver.java:

    public class PowerSaveModeReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(final Context context, final Intent intent) {
            if (BuildConfig.DEV_LOGS)
                Log.d(this.getClass().getName(), String.format("onReceive(context = [%s], intent = [%s])", context, intent));
    
            final PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
            if (pm.isPowerSaveMode()) {
                // do something
            } else {
                // do some else
            }
        }
    }
    
    0 讨论(0)
提交回复
热议问题