Служба останавливается при закрытии приложения - PullRequest
0 голосов
/ 05 июля 2018

Я работаю над приложением для обоев, в котором я устанавливаю галерею изображений на обои с эффектом перемешивания в течение 5 минут, 10 минут и т. Д. Я использую сервис для этой задачи. Мой сервис работает хорошо, когда приложение остается в фоновом режиме, но сервис останавливается, когда приложение останавливается. Это мой код класса обслуживания:

public class WallpaperService extends Service {
ArrayList<String> arrayList;int counter = 0;

boolean serviceStopped;

private IBinder binder = new WallpaperServiceBinder();

public WallpaperService() {
}

private Handler mHandler;

private Runnable updateRunnable = new Runnable() {
    @Override
    public void run() {
        if (serviceStopped == false)
        {
            createNotificationIcon();
        }
        queueRunnable();
    }
};

public class WallpaperServiceBinder extends Binder {
    public WallpaperService getService() {
        return WallpaperService.this;
    }
}

private void queueRunnable() {
    // 600000 : cada 10 minutos, comprueba si hay nuevas notificaciones y actualiza la
    // notification BAR
    mHandler.postDelayed(updateRunnable, 5000);
}

@Override
public int onStartCommand(Intent intent,int flag, int start_id){
    super.onStartCommand(intent,flag,start_id);
    arrayList = intent.getStringArrayListExtra("image_url");
    return START_STICKY;
}

@Override
public void onRebind(Intent intent) {
    Log.v("Service","in onRebind");
    super.onRebind(intent);
}

@Override
public IBinder onBind(Intent intent) {
    return binder;
}

@Override
public void onCreate() {
    serviceStopped = false;
    mHandler = new Handler();
    queueRunnable();
}

@Override
public void onStart(Intent intent, int startid) {

}

public void createNotificationIcon()
{
    counter += 1;
    Toast.makeText(this, "Hello", Toast.LENGTH_SHORT).show();
    Picasso.with(getApplicationContext()).load(arrayList.get(counter)).into(new Target() {
        @Override
        public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
            try {
                final WallpaperManager wallpaperManager =
                        WallpaperManager.getInstance(getApplicationContext());
                wallpaperManager.setBitmap(bitmap);
                wallpaperManager.suggestDesiredDimensions(1080, 1920);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        @Override
        public void onBitmapFailed(Drawable errorDrawable) {

        }

        @Override
        public void onPrepareLoad(Drawable placeHolderDrawable) {
            //Here you should place a loading gif in the ImageView to
            //while image is being obtained.
        }
    });
}}

Это код, который я использую для запуска службы:

Intent intent = new Intent(CategoryActivity.this,WallpaperService.class);
            intent.putExtra("image_url",img_urls);
            intent.setAction(Constants.ACTION.STARTFOREGROUND_ACTION);
            startService(intent);
            bindService(intent,mServiceConnection, Context.BIND_AUTO_CREATE);

Ответы [ 2 ]

0 голосов
/ 05 июля 2018

Вы добавили эти строки в файл манифеста

<application> <service  android:name=".ExampleService" /></application>

1004 *

0 голосов
/ 05 июля 2018

Важный факт о bindService

Если компонент вызывает bindService () для создания службы, а onStartCommand () не вызывается, служба работает только до тех пор, пока компонент привязан к ней. После того, как служба не связана со всеми своими клиентами, система уничтожает ее.

Попробуйте использовать запущенную службу

Запущенная служба - это та, которую запускает другой компонент, вызывая startService (), что приводит к вызову метода onStartCommand () службы.

Когда служба запускается, ее жизненный цикл не зависит от компонента, который ее запустил. Служба может работать в фоновом режиме неограниченное время, даже если компонент, который ее запустил, уничтожен. Таким образом, служба должна остановить себя, когда ее работа будет завершена путем вызова stopSelf (), или другой компонент может остановить ее, вызвав stopService ().

Компонент приложения, такой как действие, может запустить службу, вызывая startService () и передавая Намерение, которое определяет службу и включает в себя любые данные для использования службы. Служба получает это намерение в методе onStartCommand ().

Обработка onStartCommand

Обратите внимание, что метод onStartCommand () должен возвращать целое число. Целое число - это значение, которое описывает, как система должна продолжать обслуживание в случае, если система его убивает. Реализация по умолчанию для IntentService обрабатывает это для вас, но вы можете изменить его. Возвращаемое значение из onStartCommand () должно быть одной из следующих констант:

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

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

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

Примечание. В вашем случае вы должны использовать Started Service и возвращать START_STICKY или START_REDELIVER_INTENT (в зависимости от ваших требований) в onStartCommand ()

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

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...