0

В Android «N» Doze был расширен с помощью «Doze on the Go».Можно ли отслеживать, когда приложение входит в «Doze on the Go» (AKA Doze Light, Doze Extended и Doze 2)?

Я ищу способ обнаружить, когда устройство входит и покидает эти новые световые доза, IDLE и IDLE_MAINTENANCE. (В основном тот же вопрос, который был задан для обычной Doze here.)

ответ

1

Реализация в ответе TrevorWiley работает, но может быть упрощена. Да, у PowerManager от Nougat есть 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".

+0

Я больше не занимаюсь Android, поэтому я не могу проверить, что это работает, но выглядит разумно, поэтому я перехожу к принятому ответу. Если кто-то сталкивается с проблемой, он всегда может вернуться к моему ответу. – TrevorWiley

2

В онлайн-документации для PowerManager не упоминается об этом, но последний исходный код (версия 24 API 1) имеет то, что выглядит, должно быть решением этого вопрос:

String ACTION_LIGHT_DEVICE_IDLE_MODE_CHANGED 
     = "android.os.action.LIGHT_DEVICE_IDLE_MODE_CHANGED" 
boolean isLightDeviceIdleMode() 

В теории, можно просто зарегистрировать код в качестве приемника для намерения и проверить текущее значение функции. Некоторые, выкапывающие dumpsys activity broadcasts, показывают, что намерение действительно отправляется при изменении состояния легкой дозы.

Однако последний SDK Platform (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; 
} 
+0

См. Https://code.google.com/p/android/issues/detail?id=222595 для моего расследования недостающих API. – TrevorWiley

+0

Мы обратились в Google в автономном режиме, поэтому проблема, упомянутая в моем последнем комментарии, в это время, содержат какой-либо официальный ответ. – TrevorWiley

 Смежные вопросы

  • Нет связанных вопросов^_^