Android M is listening on android.os.action.DEVICE_IDLE_MODE_CHANGED

Can a third-party application receive an action after a device enters Doed mode?

Attempting to register a broadcast receiver for the action below,

<receiver android:name="com.doze.sample.DozemodeReceiver" android:enabled="true">
    <intent-filter>
        <action android:name=" android.os.action.DEVICE_IDLE_MODE_CHANGED" />
    </intent-filter>
</receiver>

It does not work (the receiver is not called).

+4
source share
2 answers

To confirm what was mentioned in the comments, defining the broadcast receiver android.os.action.DEVICE_IDLE_MODE_CHANGEDvia AndroidManifest.xml has no effect.

The only way to register the receiver is to do it dynamically:

IntentFilter filter = new IntentFilter();
filter.addAction(PowerManager.ACTION_DEVICE_IDLE_MODE_CHANGED);
context.registerReceiver(new BroadcastReceiver()
{
  @Override
  public void onReceive(Context context, Intent intent)
  {
    onDeviceIdleChanged();
  }
}, filter);
+8
source

Based on the perfect answer provided by @zmarties, here is a complete solution:

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        BroadcastReceiver receiver = new BroadcastReceiver() {
            @RequiresApi(api = Build.VERSION_CODES.M) @Override public void onReceive(Context context, Intent intent) {
                PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);

                if (pm.isDeviceIdleMode()) {
                    // the device is now in doze mode
                } else {
                   // the device just woke up from doze mode
                }
            }
        };

        context.registerReceiver(receiver, new IntentFilter(PowerManager.ACTION_DEVICE_IDLE_MODE_CHANGED));
    }

, (, ), , :

context.unregisterReceiver(receiver);

, :

adb shell dumpsys deviceidle force-idle

,

adb shell dumpsys deviceidle step

Doze.

+4

Source: https://habr.com/ru/post/1599057/


All Articles