как запустить фоновый сервис в oreo? - PullRequest
0 голосов
/ 28 сентября 2018

по умолчанию все службы запускаются в фоновом режиме с использованием startService() до версии oreo, но в oreo есть некоторые ограничения для запуска службы в фоновом режиме. Можно ли запустить фоновую службу в oreo using startService()

Ответы [ 2 ]

0 голосов
/ 28 сентября 2018

Вы можете запустить сервис в фоновом режиме.Но если вы хотите запускать фоновые операции независимо от того, находится ли приложение на переднем плане, и вы не привязываете службу к серверу, я бы использовал службу переднего плана.Итак, в вашем основном вызове это:

if(Build.VERSION.SDK_INT >25){
            startForegroundService(new Intent(this, Service.class));
        }else{
            startService(new Intent(this, Service.class));
        }

Затем, когда вы находитесь в вашем сервисе, вы должны документально подтвердить, что сервис переднего плана работает.Вы можете вызвать этот метод для обработки документирования на переднем плане (это немного неуклюже):

 private void startRunningInForeground() {

    //if more than or equal to 26
    if (Build.VERSION.SDK_INT >= 26) {

        //if more than 26
        if(Build.VERSION.SDK_INT > 26){
            String CHANNEL_ONE_ID = "Package.Service";
            String CHANNEL_ONE_NAME = "Screen service";
            NotificationChannel notificationChannel = null;
            notificationChannel = new NotificationChannel(CHANNEL_ONE_ID,
                    CHANNEL_ONE_NAME, NotificationManager.IMPORTANCE_MIN);
            notificationChannel.enableLights(true);
            notificationChannel.setLightColor(Color.RED);
            notificationChannel.setShowBadge(true);
            notificationChannel.setLockscreenVisibility(Notification.VISIBILITY_PUBLIC);
            NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
            if (manager != null) {
                manager.createNotificationChannel(notificationChannel);
            }

            Bitmap icon = BitmapFactory.decodeResource(getResources(), R.drawable.background_running);
            Notification notification = new Notification.Builder(getApplicationContext())
                    .setChannelId(CHANNEL_ONE_ID)
                    .setContentTitle("Recording data")
                    .setContentText("App is running background operations")
                    .setSmallIcon(R.drawable.background_running)
                    .setLargeIcon(icon)
                    .build();

            Intent notificationIntent = new Intent(getApplicationContext(), MainActivity.class);
            notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
            notification.contentIntent = PendingIntent.getActivity(getApplicationContext(), 0, notificationIntent, 0);

            startForeground(101, notification);
        }
        //if version 26
        else{
            startForeground(101, updateNotification());
        }
    }
    //if less than version 26
    else{
        Notification notification = new NotificationCompat.Builder(this)
                .setContentTitle("App")
                .setContentText("App is running background operations")
                .setSmallIcon(R.drawable.background_running)
                .setOngoing(true).build();

        startForeground(101, notification);
    }
}

private Notification updateNotification() {

    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0,
            new Intent(this, MainActivity.class), 0);

    return new NotificationCompat.Builder(this)
            .setContentTitle("Activity log")
            .setTicker("Ticker")
            .setContentText("app is running background operations")
            .setSmallIcon(R.drawable.background_running)
            .setContentIntent(pendingIntent)
            .setOngoing(true).build();
}

вам также придется документировать наличие службы в манифесте (между тегами активности):

<service android:name = ".Service"/>

нравится и комментируйте, если вам нужна помощь в создании значка уведомления

0 голосов
/ 28 сентября 2018

Вы можете использовать startService (), пока ваше приложение находится на переднем плане, если ваше приложение переходит в фоновый режим и вы звоните startService(), вы получите IllegalStateException

В качестве альтернативы вы можете использовать startForeground() для запускасервис

Из документации

Пока приложение находится на переднем плане, оно может свободно создавать и запускать как фоновые, так и фоновые сервисы.Когда приложение переходит в фоновый режим, оно имеет окно в несколько минут, в котором ему по-прежнему разрешено создавать и использовать службы.В конце этого окна приложение считается бездействующим.В это время система останавливает фоновые службы приложения, как если бы приложение вызывало методы Service.stopSelf () служб

, проверьте Документация для получения дополнительной информации

...