В онлайн-документации для PowerManager он не упоминается, но последний источник код (версия API 24 1) выглядит так, как должно быть решением этого вопроса:
String ACTION_LIGHT_DEVICE_IDLE_MODE_CHANGED
= "android.os.action.LIGHT_DEVICE_IDLE_MODE_CHANGED"
boolean isLightDeviceIdleMode()
Теоретически вы можете просто зарегистрировать какой-нибудь код в качестве приемника для намерения и проверить текущее значение функции. Некоторое изучение dumpsys activity broadcasts
показывает, что намерение действительно отправляется при изменении состояния легкой дремоты.
Однако в последней платформе SDK (API 24, редакция 2) этих символов нет - я получаю ошибки компиляции (и некоторые тычки с javap
и jar
показывают, что их действительно нет). Когда мы связались с Google, нам сказали, что это предполагаемый дизайн.
Существует обходной путь, который заключается в том, чтобы жестко закодировать ту же строку, упомянутую выше, а затем использовать отражение для вызова той же функции, которая была бы вызвана в API. Как это:
/**
* Check if the device is currently in the Light IDLE mode.
*
* @param context The application context.
* @return True if the device is in the Light IDLE mode.
*/
public static boolean isLightDeviceIdleMode(final Context context) {
boolean result = false;
PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
if (pm != null) {
// result = pm.isLightDeviceIdleMode();
try {
Log.d(TAG, "Trying reflection for isLightDeviceIdleMode");
Field pmServiceField = pm.getClass().getDeclaredField("mService");
pmServiceField.setAccessible(true);
Object pmService = pmServiceField.get(pm);
Method isLightDeviceIdleMode = pmService.getClass().getDeclaredMethod("isLightDeviceIdleMode");
isLightDeviceIdleMode.setAccessible(true);
result = (Boolean) isLightDeviceIdleMode.invoke(pmService);
} catch (NoSuchFieldException | IllegalAccessException | NoSuchMethodException | InvocationTargetException e) {
Log.e(TAG, "Reflection failed for isLightDeviceIdleMode: " + e.toString());
} catch (RemoteException re) {
Log.e(TAG, "Remote exception checking isLightDeviceIdleMode: " + e.toString());
}
}
return result;
}
person
TrevorWiley
schedule
15.09.2016