8

设备进入打盹模式后,第三方应用程序能否执行操作?

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

<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>

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

4

2 回答 2

14

基于@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));
    }

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

context.unregisterReceiver(receiver);

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

adb shell dumpsys deviceidle force-idle

使设备进入打盹模式,

adb shell dumpsys deviceidle step

从打盹唤醒设备。

于 2017-02-06T10:33:02.427 回答
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);
于 2015-09-09T15:16:41.653 回答