Как приложение WhiteList в режиме «Доза» Android 6.0
Этот вопрос связан с Android 6.0 Preview 3, который будет окончательно выпущен в конце этого месяца.
Я тестирую некоторые вещи в Android 6.0 в предварительном просмотре 3 из Google на Nexus 5 ‘hammerhead’.
Новая функция – режим «доза» – что-то вроде глубокого спящего режима, когда сеть отключена и телефон спит, только SMS, звонки или сообщения с высоким приоритетом GCM могут разбудить его. Но, как и WhatsApp – в режиме «доза» он получает сообщения через 2 часа и более, зависит от таймеров. Но есть список «не оптимизированных» приложений под названием «белый список», где можно вручную добавить приложение.
- Android Studio не смог найти действительный Jvm (относящийся к MAC OS)
- Преобразование JSONArray в String Array
- Преобразование String в Uri
- Неустранимая ошибка: неверный макет java.lang.String по значению
- как переопределить кнопку панели действий в андроиде?
Хорошо, я бы хотел найти способ добавить свое приложение программно, без взаимодействия с пользователем, в список «список белых списков», который существует в устройстве в настройках батареи.
Пытаясь использовать 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
- AlertDialog с пользовательским представлением: изменение размера, чтобы обернуть содержимое представления
- Как сериализовать объект в JSON?
- Чтобы использовать строковое значение в качестве имени переменной
- Разделить строку на отдельные слова Java
- Как установить фоновые рисунки программно в Android
- Как получить текущий момент в формате ISO 8601 с датой, часом и минутой?
- Передавать данные из Java Servlet в JSP?
- Лучший способ parseDouble с запятой в качестве десятичного разделителя?
Невозможно отключить оптимизацию батареи (= приложение с белым списком для режима доз) без взаимодействия с пользователем на предварительном просмотре 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 -