Android M听android.os.action.DEVICE_IDLE_MODE_CHANGED

Rup*_*ali 7 android android-6.0-marshmallow

一旦设备进入打盹模式,第三方应用程序是否可以获得操作?

尝试注册广播接收器以执行以下操作,

<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>
Run Code Online (Sandbox Code Playgroud)

它不起作用(接收器没有被调用).

zma*_*ies 12

要确认评论中提到的内容,android.os.action.DEVICE_IDLE_MODE_CHANGED通过AndroidManifest.xml 定义广播接收器无效.

注册接收器的唯一方法是动态执行:

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);
Run Code Online (Sandbox Code Playgroud)


van*_*art 10

基于@zmarties提供的完美答案,以下是完整的解决方案:

    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));
    }
Run Code Online (Sandbox Code Playgroud)

如果您能够检查上下文何时被销毁(例如在活动或服务中),请调用此方法以避免资源泄漏:

context.unregisterReceiver(receiver);
Run Code Online (Sandbox Code Playgroud)

要测试这段代码,请使用以下命令:

adb shell dumpsys deviceidle force-idle
Run Code Online (Sandbox Code Playgroud)

将设备置于打盹模式,

adb shell dumpsys deviceidle step
Run Code Online (Sandbox Code Playgroud)

从Doze中唤醒设备.