Фоновый сервис для обновления местоположения в фоновом режиме - PullRequest
3 голосов
/ 20 января 2020

это убивает фоновый сервис, чтобы решить вашу проблему, вы должны использовать приоритетный сервис.

мой фоновый закрепленный сервис - убивать на устройствах oreo и heigher. Любое решение для определения местоположения в фоновом сервисе, когда Activity находится на backound

Ответы [ 3 ]

1 голос
/ 20 января 2020

Вы не сможете запускать фоновые службы, долго работающие в Oreo, поскольку есть изменения в поведении, теперь Oreo оптимизирует системную память, батарею и т. Д. c, она убивает фоновый сервис, чтобы решить вашу проблему, вы должны использовать сервис переднего плана.

Посмотрите на пределы фонового выполнения https://developer.android.com/about/versions/oreo/android-8.0-changes

Предложение от меня, если вы можете использовать FCM, тогда go для него, потому что такие приложения, как WeChat, Facebook использует его для доставки уведомлений, и они не сталкиваются с какими-либо проблемами.

Альтернативное решение, которое я выбрал без FCM из-за требования клиента запустить службу, которая обновляет местоположение в фоновом режиме. Вот шаги ниже: -

  • Вам нужно запустить свою фоновую службу с отображением уведомлений в Oreo и выше.
  • После этого вам нужно помнить, что через некоторое время позвоните переходит в режим ожидания, поэтому вам также нужно решить эту проблему:
  • Кроме того, для приложения также должна быть отключена оптимизация батареи.
  • В некоторых пользовательских ПЗУ необходимо управлять разрешением автоматического запуска для перезапустите службу, если служба была прервана android.
  • . И самое главное, если служба прервана системой android, затем отправьте широковещательное сообщение получателю широковещательной рассылки, чтобы перезапустить ваш Служба еще раз

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

0 голосов
/ 20 января 2020

Это из-за Android Изменения в поведении Oreo для фонового выполнения. Предлагаемые альтернативы:

1) Служба Foreground.

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

Пример приложения из документации: LocationUpdatesForegroundService проект на GitHub

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

References
https://developer.android.com/training/location/receive-location-updates

2) Диспетчер работ

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

0 голосов
/ 20 января 2020

вы должны показать уведомление для ForegroundService

    public class ForegroundService extends Service {
    public static final String CHANNEL_ID = "ForegroundServiceChannel";
    @Override
    public void onCreate() {
        super.onCreate();
    }
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        String input = intent.getStringExtra("inputExtra");
        createNotificationChannel();
        Intent notificationIntent = new Intent(this, MainActivity.class);
        PendingIntent pendingIntent = PendingIntent.getActivity(this,
                0, notificationIntent, 0);
        Notification notification = new NotificationCompat.Builder(this, CHANNEL_ID)
                .setContentTitle("Foreground Service")
                .setContentText(input)
                .setSmallIcon(R.drawable.ic_stat_name)
                .setContentIntent(pendingIntent)
                .build();
        startForeground(1, notification);
        //do heavy work on a background thread
        //stopSelf();
        return START_NOT_STICKY;
    }
    @Override
    public void onDestroy() {
        super.onDestroy();
    }
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
}

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

<uses-permissionandroid:name=”android.permission.FOREGROUND_SERVICE” />
...