在Android“ N”中,Doze已扩展为“ Doze on the Go”。
我正在寻找一种方法来检测设备何时进入和离开这些新的休眠状态IDLE和IDLE_MAINTENANCE。 (基本上是与定期打here相同的问题。)
最佳答案
TrevorWiley的答案中的实现有效,但可以简化一点。是的,牛轧糖的PowerManager具有isLightDeviceIdleMode()
,并带有@hide
注释。我们可以使用反射来调用它,它更加简洁并且独立于PowerManager的内部实现细节。
public static boolean isLightDeviceIdleMode(final Context context) {
boolean result = false;
PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
if (pm != null) {
try {
Method isLightDeviceIdleModeMethod = pm.getClass().getDeclaredMethod("isLightDeviceIdleMode");
result = (boolean)isLightDeviceIdleModeMethod.invoke(pm);
} catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
Log.e(TAG, "Reflection failed for isLightDeviceIdleMode: " + e.toString(), e);
}
}
return result;
}
多数同意TrevorWiley使用String进行广播注册。与上述方法相同,您可以使用反射来获取字段
ACTION_LIGHT_DEVICE_IDLE_MODE_CHANGED
的值,然后返回硬编码的字符串"android.os.action.LIGHT_DEVICE_IDLE_MODE_CHANGED"
。