Как приложение WhiteList в режиме «Доза» Android 6.0

Этот вопрос связан с Android 6.0 Preview 3, который будет окончательно выпущен в конце этого месяца.

Я тестирую некоторые вещи в Android 6.0 в предварительном просмотре 3 из Google на Nexus 5 ‘hammerhead’.

Новая функция – режим «доза» – что-то вроде глубокого спящего режима, когда сеть отключена и телефон спит, только SMS, звонки или сообщения с высоким приоритетом GCM могут разбудить его. Но, как и WhatsApp – в режиме «доза» он получает сообщения через 2 часа и более, зависит от таймеров. Но есть список «не оптимизированных» приложений под названием «белый список», где можно вручную добавить приложение.

Хорошо, я бы хотел найти способ добавить свое приложение программно, без взаимодействия с пользователем, в список «список белых списков», который существует в устройстве в настройках батареи.

Пытаясь использовать reflection, чтобы войти в него, я обнаружил:

Внутри android.os.IDeviceIdleController существует метод:

public abstract void addPowerSaveWhitelistApp (String packageNameOfApp)

Но это интерфейс … Поэтому мы не можем создать экземпляр интерфейса.

Пока нет документации об этом интерфейсе или о методах или любом дереве наследования.

Может быть, у вас есть идея, где я должен искать возможность программно добавить туда свое приложение?

Существует также метод

public abstract boolean isPowerSaveWhitelistApp (String packageName)

Который, я думаю, должен быть доступ к каким-то образом ?! чтобы проверить, существует ли приложение в белом списке, и, возможно, в самом конце, надеюсь, пользователь ASK добавит его в Белый список.

Поэтому мой вопрос: кто-нибудь из вас пытался сделать что-то с лучшим результатом? Потому что я застрял, и я думаю, что это тупик.

для получения дополнительной информации: https://newcircle.com/s/post/1739/2015/06/12/diving-into-android-m-doze

Невозможно отключить оптимизацию батареи (= приложение с белым списком для режима доз) без взаимодействия с пользователем на предварительном просмотре Android M 3.

Это можно сделать с помощью взаимодействия пользователя таким образом:

Intent intent = new Intent(); String packageName = context.getPackageName(); PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); if (pm.isIgnoringBatteryOptimizations(packageName)) intent.setAction(Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS); else { intent.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS); intent.setData(Uri.parse("package:" + packageName)); } context.startActivity(intent); 

Добавить разрешение

  

запрос белого списка вашего приложения

  if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { Intent intent = new Intent(); String packageName = getPackageName(); PowerManager pm = (PowerManager) getSystemService(POWER_SERVICE); if (!pm.isIgnoringBatteryOptimizations(packageName)) { intent.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS); intent.setData(Uri.parse("package:" + packageName)); startActivity(intent); } } 

Я думаю, что этот вспомогательный class должен охватывать все ваши потребности.

Чтобы использовать его для запроса ОС на белый список вашего приложения, вы можете использовать prepareIntentForWhiteListingOfBatteryOptimization. Если вы получите null, это означает, что вам это не нужно, или что вы не можете его использовать. Вы можете использовать другую функцию для запроса лучшего состояния того, в чем вы находитесь.

 public class PowerSaverHelper { public enum PowerSaveState { ON, OFF, ERROR_GETTING_STATE, IRRELEVANT_OLD_ANDROID_API } public enum WhiteListedInBatteryOptimizations { WHITE_LISTED, NOT_WHITE_LISTED, ERROR_GETTING_STATE, UNKNOWN_TOO_OLD_ANDROID_API_FOR_CHECKING, IRRELEVANT_OLD_ANDROID_API } public enum DozeState { NORMAL_INTERACTIVE, DOZE_TURNED_ON_IDLE, NORMAL_NON_INTERACTIVE, ERROR_GETTING_STATE, IRRELEVANT_OLD_ANDROID_API, UNKNOWN_TOO_OLD_ANDROID_API_FOR_CHECKING } @NonNull public static DozeState getDozeState(@NonNull Context context) { if (VERSION.SDK_INT < VERSION_CODES.LOLLIPOP) return DozeState.IRRELEVANT_OLD_ANDROID_API; if (VERSION.SDK_INT < VERSION_CODES.M) { return DozeState.UNKNOWN_TOO_OLD_ANDROID_API_FOR_CHECKING; } final PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); if (pm == null) return DozeState.ERROR_GETTING_STATE; return pm.isDeviceIdleMode() ? DozeState.DOZE_TURNED_ON_IDLE : pm.isInteractive() ? DozeState.NORMAL_INTERACTIVE : DozeState.NORMAL_NON_INTERACTIVE; } @NonNull public static PowerSaveState getPowerSaveState(@NonNull Context context) { if (VERSION.SDK_INT < VERSION_CODES.LOLLIPOP) return PowerSaveState.IRRELEVANT_OLD_ANDROID_API; final PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); if (pm == null) return PowerSaveState.ERROR_GETTING_STATE; return pm.isPowerSaveMode() ? PowerSaveState.ON : PowerSaveState.OFF; } @NonNull public static WhiteListedInBatteryOptimizations getIfAppIsWhiteListedFromBatteryOptimizations(@NonNull Context context, @NonNull String packageName) { if (VERSION.SDK_INT < VERSION_CODES.LOLLIPOP) return WhiteListedInBatteryOptimizations.IRRELEVANT_OLD_ANDROID_API; if (VERSION.SDK_INT < VERSION_CODES.M) return WhiteListedInBatteryOptimizations.UNKNOWN_TOO_OLD_ANDROID_API_FOR_CHECKING; final PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); if (pm == null) return WhiteListedInBatteryOptimizations.ERROR_GETTING_STATE; return pm.isIgnoringBatteryOptimizations(packageName) ? WhiteListedInBatteryOptimizations.WHITE_LISTED : WhiteListedInBatteryOptimizations.NOT_WHITE_LISTED; } @TargetApi(VERSION_CODES.M) @RequiresPermission(permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS) @Nullable public static Intent prepareIntentForWhiteListingOfBatteryOptimization(@NonNull Context context, @NonNull String packageName, boolean alsoWhenWhiteListed) { if (VERSION.SDK_INT < VERSION_CODES.LOLLIPOP) return null; if (ContextCompat.checkSelfPermission(context, permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS) == PackageManager.PERMISSION_DENIED) return null; final WhiteListedInBatteryOptimizations appIsWhiteListedFromPowerSave = getIfAppIsWhiteListedFromBatteryOptimizations(context, packageName); Intent intent = null; switch (appIsWhiteListedFromPowerSave) { case WHITE_LISTED: if (alsoWhenWhiteListed) intent = new Intent(Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS); break; case NOT_WHITE_LISTED: intent = new Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS).setData(Uri.parse("package:" + packageName)); break; case ERROR_GETTING_STATE: case UNKNOWN_TOO_OLD_ANDROID_API_FOR_CHECKING: case IRRELEVANT_OLD_ANDROID_API: default: break; } return intent; } /** * registers a receiver to listen to power-save events. returns true iff succeeded to register the broadcastReceiver. */ @TargetApi(VERSION_CODES.M) public static boolean registerPowerSaveReceiver(@NonNull Context context, @NonNull BroadcastReceiver receiver) { if (VERSION.SDK_INT < VERSION_CODES.M) return false; IntentFilter filter = new IntentFilter(); filter.addAction(PowerManager.ACTION_DEVICE_IDLE_MODE_CHANGED); context.registerReceiver(receiver, filter); return true; } } 

Насколько я знаю, вы не можете «белыми» от Doze. Игнорировать оптимизацию батареи не отключает дозу. См. Здесь: https://code.google.com/p/android-developer-preview/issues/detail?id=2225 ОБНОВЛЕНИЕ. В сборке релизов M вы можете запросить игнорировать оптимизацию батареи, которая, по крайней мере, даст вам нормальный доступ в Интернет в режиме Doz.

ОБНОВИТЬ

Когда устройство снова остановится, с выключенным экраном и включенным аккумулятором в течение определенного периода времени, Doze применяет полные ограничения по ЦП и сети для сигналов PowerManager.WakeLock, AlarmManager и GPS / Wi-Fi .

Посетите примеры использования для белого списка для более подробной информации.

В приведенной ниже таблице показаны приемлемые варианты использования для запроса или включения белого списка исключений Battery Optimization. В общем, ваше приложение не должно быть в белом списке, если Doze или App Standby не нарушают основную функцию приложения, или есть техническая причина, по которой ваше приложение не может использовать высокоприоритетные сообщения GCM.

Разработчик android n говорит

Doze, скорее всего, повлияет на действия, которые срабатывают AlarmManager и таймеры , поскольку сигналы тревоги в Android 5.1 (уровень API 22) или ниже не срабатывают, когда система находится в режиме Doze .

Android 6.0 (API-уровень 23) вводит два новых метода setAndAllowWhileIdle() : setAndAllowWhileIdle() и setExactAndAllowWhileIdle() . С помощью этих методов вы можете установить аварийные сигналы, которые будут срабатывать, даже если устройство находится в режиме Doze.

Примечание . Ни setAndAllowWhileIdle() ни setExactAndAllowWhileIdle() могут setExactAndAllowWhileIdle() аварийные сигналы более одного раза за 15 минут на приложение.

Тестирование с помощью Doze и App Standby

Если у нас есть права root, то белый список можно сделать программным путем. Чтобы добавить устройство в приложениях с белым списком, выполните следующую команду из приложения:

 adb shell dumpsys deviceidle whitelist + 

Чтобы удалить устройство из приложений с белым списком, выполните следующую команду из приложения:

 adb shell dumpsys deviceidle whitelist - 
  • WebView и Cookies на Android
  • HashMap с несколькими значениями под одним и тем же ключом
  • Android - SPAN_EXCLUSIVE_EXCLUSIVE охватывает не может иметь нулевую длину
  • Воспроизведение музыки BG через действия в Android
  • Как я могу генерировать случайное число в определенном диапазоне в Android?
  • Spring Boot - невозможно определить встроенный class драйвера базы данных для типа базы данных NONE
  • warning: путь к bootstrap, не установленный вместе с -source 1.5
  • Как получить день месяца?
  • Нарисуйте прозрачный круг за пределами
  • Устаревшая проблема с ManagedQuery ()
  • Библиотека PDF для рендеринга файлов PDF в Android
  • Давайте будем гением компьютера.