Android Foreground Services - PullRequest
0 голосов
/ 09 марта 2019

У меня есть сервис, который называется

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    getActivity().startForegroundService(new Intent(getActivity(), 
Background.class));
} else {
    getActivity().startService(new Intent(getActivity(), Background.class));
}

и обслуживание само по себе

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    Toast.makeText(this,"Creating Notification",Toast.LENGTH_SHORT).show();

    //
    initChannels(this);

    Intent notificationIntent = new Intent(this, MainActivity.class);

    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0,
            notificationIntent, 0);

    Notification notification = new NotificationCompat.Builder(this, "default")
            .setContentTitle("Zeep!?")
            .setTicker("Zeep!?")
            .setContentText("We're currently working in the background")
            .setSmallIcon(R.mipmap.zeep_icon_b)
            .setOngoing(true)
            .setPriority(Notification.PRIORITY_MIN)
            .setContentIntent(pendingIntent)
            .build();

    startForeground(1337, notification);
    //

    return START_NOT_STICKY;
}

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

Ответы [ 2 ]

0 голосов
/ 10 марта 2019
START_NOT_STICKY

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

START_STICKY

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

START_REDELIVER_INTENT

Если система завершает работу службы после возврата onStartCommand (), заново создайте службуи вызовите onStartCommand () с последним намерением, которое было доставлено в службу.Любые ожидающие намерения доставляются по очереди.Это подходит для служб, которые активно выполняют работу, которая должна быть немедленно возобновлена, например, для загрузки файла.

Вы можете использовать START_NOT_STICKY, но тогда вам придется вручную обработать остановку службы.Также помните, что когда вы вызываете службу из действия, onCreate() не всегда вызывается.Только когда вы вызываете службу из неактивной деятельности, она вызывается, иначе вызывается onStartCommand().

Я думаю, что эта библиотека имеет лучшую реализацию сервиса для Android.Проверьте это MockGeoFix .

0 голосов
/ 09 марта 2019

Мой onStartCommand () выглядит следующим образом:

     @Override
public int onStartCommand(Intent intent, int flags, int startId) {
    // Tells the system to not try to recreate the service after it has been killed.
    return START_NOT_STICKY;
}

Я забочусь о вещах уведомлений в onCreate ().Кроме того, вам нужно вызвать startForeground () сразу после вызова startForegroundService ():

     @Override
public void onCreate() {
    mPrefs = PreferenceManager.getDefaultSharedPreferences(this);
    NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

    // Android O requires a Notification Channel.
    if (Build.VERSION.SDK_INT >= 26) {
        CharSequence name = getString(R.string.app_name);
        // Create the channel for the notification
        @SuppressLint("WrongConstant")
        NotificationChannel mChannel = new NotificationChannel(CHANNEL_ID, name, NotificationManager.IMPORTANCE_LOW);
        // Set the Notification Channel for the Notification Manager.
        if (notificationManager != null) {
            notificationManager.createNotificationChannel(mChannel);
        }

        //Since MainActivity binds with the service and calls onCreate, we can actually call startForegroundService from within the service itself.
        startForegroundService(new Intent(ForegroundService.this, ForegroundService.class));
        //We only need to call this for SDK 26+, since startForeground always has to be called after startForegroundService.
        startForeground(NOTIFICATION_ID, getNotification());
    }
    else {
        //Since MainActivity binds with the service and calls onCreate, we can actually call startService from within the service itself.
        startService(new Intent(ForegroundService.this, ForegroundService.class));
    }

Не сказать, что это решение, но оно работает для меня.

...