当用户从最近的任务列表中关闭应用程序时,如何保持作业服务运行

时间:2019-01-19 15:18:38

标签: java android service android-jobscheduler

我正在应用中使用Job Scheduler 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 :(得分:1)

当在后台定期执行某些工作(例如JobSchedulerWorkManagerAlarmManager,FCM推送消息等)时,您必须考虑到在以下情况下您的过程可能不存在现在是时候做您的工作了。 Android将为您分叉一个过程,但这是“从头开始”。您的UI可能已在内存中设置的任何内容(例如数据库)都将用于某些先前的过程,而可能不会在新过程中进行设置。