Android M 监听 android.os.action.DEVICE_IDLE_MODE_CHANGED
Posted
技术标签:
【中文标题】Android M 监听 android.os.action.DEVICE_IDLE_MODE_CHANGED【英文标题】:Android M listening to android.os.action.DEVICE_IDLE_MODE_CHANGED 【发布时间】:2015-07-22 09:52:03 【问题描述】:设备进入打盹模式后,第三方应用程序能否执行操作?
尝试为以下操作注册广播接收器,
<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>
它不起作用(没有调用接收器)。
【问题讨论】:
空间在行动你好吗? 在代码中正确.. "android.os.action" 可能是 M 错误。如果这适用于 API 21,请尝试 developer.android.com/reference/android/os/…! 动态注册开始工作.. 酷!有时在android中就是这样! ***.com/questions/6249023/… .. 标记为 answere.. 【参考方案1】:基于@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
从打盹中唤醒设备。
【讨论】:
我使用完全相同的方法来捕获该广播,但它似乎仅在我调用 deviceidle force-idle 和 unforce 时才有效。如果我将手机放置一个多小时而不触碰它,我的广播接收器将收不到任何东西。有人经历过吗? 同样的问题 @SavaMikalački:电话被拔掉了,对吧?这是进入打盹模式的条件之一。 @BobSnyder 是的,我的手机已断开连接。经过更多测试后,我发现当我的手机闲置几个小时时我确实收到了广播,甚至当我的手机在几个小时后连接到我的充电器时我什至可以在一夜之间收到它。另外,我知道,由于调用 deviceidle step 命令时有步骤,所以我也会在广播中获得这些步骤,但我只有在它进入空闲状态和唤醒时才会得到广播。 @SavaMikalački:感谢您的反馈。广播对我来说同样不一致。令人失望。我原以为它们会更可靠地指示空闲状态的变化。【参考方案2】:为了确认 cmets 中提到的内容,通过 AndroidManifest.xml 定义 android.os.action.DEVICE_IDLE_MODE_CHANGED
广播接收器无效。
注册接收者的唯一方法是动态进行:
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);
【讨论】:
记住,如果使用activity context,需要注销receiver,所以不能创建为匿名类。以上是关于Android M 监听 android.os.action.DEVICE_IDLE_MODE_CHANGED的主要内容,如果未能解决你的问题,请参考以下文章