Признание деятельности продолжает услуги в Орео - PullRequest
0 голосов
/ 25 мая 2018

Я ломаю голову вокруг этого, пока нет решения.Я видел много руководств, как это сделать ( Documentation , Tutorial ), и успешно выполнил это в Android 7. Что мне удалось сделать, это успешно получить уведомление, когда служба работает в фоновом режиме, когда пользовательактивность изменилась.Мое приложение работает отлично.Проблема с андроидом 8 и управлением батареей гугл.Мой сервис всегда убит.Итак ... Что я уже пытался преодолеть эту проблему:

  1. Объясните пользователю, как отключить оптимизацию батареи для моего приложения, чтобы оно не убивало мой сервис.Проблема слишком сложна для пользователя Cummon.

  2. Добавьте

    uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"
    

и проверьте его с помощью кода:

Intent intent = new Intent();
            String packageName = context.getPackageName();
            PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                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);

Но я недооценил, что мое приложение может быть заблокировано в магазине игр, и это большая проблема.

Использовать службу переднего плана с постоянным уведомлением.Проблема заключается в том, что пользователю очень удобно видеть это текущее и иногда нерелевантное уведомление.

Так как я могу использовать ActivityRecognitionClient и всегда получать уведомление, когда активность меняется, даже когда мое приложениев фоновом режиме в Android 8?Может, подключить напрямую сервис гугл для этого как-нибудь?

1 Ответ

0 голосов
/ 03 июня 2018

Рассмотрите возможность использования DetectedActivityFence, части API Awareness.В этом случае именно система контролирует и отправляет вам широковещательные сообщения, поэтому вам не нужно запускать собственную фоновую службу.

После получения трансляции для забора вы можете использовать startForegroundService для ответа на трансляцию.Это работает, даже если ваше приложение работает в фоновом режиме, и соответствующее уведомление пользователя будет отображаться только в течение короткого времени.

...