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

08-16 04:32