Как сохранить работоспособность службы заданий, когда приложение закрыто из списка недавних задач пользователем - PullRequest
0 голосов
/ 19 января 2019

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

Теперь я хочу, чтобы кто-нибудь помог мне сохранить выполнение заданий, даже если приложение закрыто или удалено из списка недавних задач.

Если есть альтернативное решение, скажите, пожалуйста.

Я ищу решение за последние 3 дня. Перепробовал все сказанное разработчиками на StackOverFlow и других сайтах, и ни один из них не помог мне.

Это график работы!

ComponentName componentName = new 
ComponentName(getActivity().getBaseContext(),WallpaperJobService.class);
        JobInfo jobInfo = new JobInfo.Builder(777,componentName)

.setRequiresCharging(sharedPreferences.getBoolean("Charging",false))

.setRequiredNetworkType(sharedPreferences.getBoolean("Wifi",false) ? 
JobInfo.NETWORK_TYPE_UNMETERED : JobInfo.NETWORK_TYPE_ANY)
                .setPeriodic(sharedPreferences.getInt("Duration",15) * 60 * 
1000)
                .setPersisted(true)
                .build();

        JobScheduler scheduler = (JobScheduler) 
getContext().getSystemService(Context.JOB_SCHEDULER_SERVICE);
        scheduler.schedule(jobInfo);

Мой класс обслуживания:

public class WallpaperJobService extends JobService {

private boolean jobCancelled;
private SharedPreferences sharedPreferences;
private SharedPreferences.Editor editor;

@Override
public boolean onStartJob(JobParameters params) {
    Log.i("WallpaperJobService", "Job started!");
    changeWallpaper(params);
    return true;
}

private void changeWallpaper(final JobParameters params) {
    final ArrayList<Image> images = (ArrayList<Image>) 
MainActivity.favoritesRoomDatabase.roomDao().getAllFavoriteWallpapers();
    sharedPreferences = getSharedPreferences("GridSize", MODE_PRIVATE);
    editor = sharedPreferences.edit();

    if (images != null && images.size() != 0) {
        if (sharedPreferences.getInt("Index", 0) == images.size()) {
            editor.putInt("Index", 0);
            editor.commit();
        }
        Picasso.get().load(Constants.domain + 
images.get(sharedPreferences.getInt("Index", 0)).getImage_url()).into(new 
Target() {
            @Override
            public void onBitmapLoaded(final Bitmap bitmap, 
Picasso.LoadedFrom from) {
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        if (jobCancelled) {
                            Log.i("WallpaperJobService","Returned");
                            return;
                        }
                        try {
                           //Doing some work here 

                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                        Log.i("WallpaperJobService", "Job finished!");
                        jobFinished(params, false);
                    }
                }).start();
            }

            @Override
            public void onBitmapFailed(Exception e, Drawable errorDrawable) 
{
                Log.i("WallpaperJobService", "Bitmap load failed " + 
e.getMessage());
            }

            @Override
            public void onPrepareLoad(Drawable placeHolderDrawable) {

            }
        });
    } else {
        Log.i("WallpaperJobService", "Favorite database is null!");
    }
}

@Override
public boolean onStopJob(JobParameters params) {
    Log.i("WallpaperJobService", "Job cancelled before completion!");
    jobCancelled = true;
    return true;
}


}

1 Ответ

0 голосов
/ 19 января 2019

Периодически делая вещи в фоновом режиме - JobScheduler, WorkManager, AlarmManager, push-сообщения FCM и т. Д. - вы должны учитывать, что ваш процесс может отсутствовать, когда пришло время для васты работаешь.Android раскроет вам процесс, но он «начинается с нуля».Все, что ваш пользовательский интерфейс мог установить в памяти, например, база данных, было бы для какого-то предыдущего процесса и не могло бы быть настроено в новом процессе.

...