任务调度程序在应用程序被杀死后无法工作

3

我看过很多其他帖子。但是,这些都似乎没有帮助。

我需要设置一个作业调度程序,每天下午3点运行。

以下是我的服务类:

public class AttendanceCheckScheduler extends JobService {
    private AttendanceCheckTask mAttendanceCheckTask;

    private static final String TAG = "AttendanceCheckScheduler";

    @Override
    public boolean onStartJob(JobParameters params) {

        mAttendanceCheckTask = new AttendanceCheckTask();
        mAttendanceCheckTask.execute();
        jobFinished(params, false);
        return true;
    }

    @Override
    public boolean onStopJob(JobParameters params) {

        mAttendanceCheckTask.cancel(true);
        return false;
    }

    private class AttendanceCheckTask extends AsyncTask<Void, Void, Void> {

        @Override
        protected Void doInBackground(Void... params) {
            // some long running task...
            Toast.makeText(getApplicationContext(), "Task run", Toast.LENGTH_SHORT).show();

            return null;
        }

        @Override
        protected void onPostExecute(Void s) {
            super.onPostExecute(s);
        }
    }
}

这是我在ActivityHome中如何安排工作的方式。

public class ActivityHome extends AppCompatActivity {

    private static final int JOB_ID = 100;
    private JobScheduler jobScheduler;
    protected JobInfo jobInfo;

    private static final String TAG = "ActivityHome";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home);

        // other irrelevant codes here...

        ComponentName componentName = new ComponentName(this, AttendanceCheckScheduler.class);
        JobInfo.Builder builder = new JobInfo.Builder(JOB_ID, componentName);

        builder.setPeriodic(5000); // every 5 seconds for testing purpose...
        builder.setPersisted(true);

        jobInfo = builder.build();

        jobScheduler = (JobScheduler) getSystemService(JOB_SCHEDULER_SERVICE);
        jobScheduler.schedule(jobInfo);

        Toast.makeText(this, "job scheduled", Toast.LENGTH_LONG).show();
    }
}

一切似乎都正常工作,我正在按照上面设置的每5秒接收到toast消息任务运行

但是当应用程序被杀死(通过清除多任务窗口中的所有任务),我就停止接收toast消息了。

如何即使应用程序被杀死也让它继续运行?

P.S:我希望某些任务每天下午3点执行一次。


你应该首先专注于修复你的JobService。你没有调用jobFinished()(这是必须的),而且你不应该使用AsyncTask(使用普通线程或其他不涉及主应用程序线程的东西)。一般来说,一个写得好的JobService不应该受到概览屏幕的影响。然而,一些设备制造商有自己的任务管理器,它们的行为类似于强制停止(在设置中你的应用程序页面上的按钮),并且会取消作业。对于这些设备,你几乎无能为力。 - CommonsWare
另外,请记住,您不能使用JobScheduler在特定的下午3点执行某些操作,您的5秒轮询周期不适用于所有Android版本,并且使用Toast进行诊断不是一个好主意(请使用LogCat)。 - CommonsWare
Sumit,你知道在杀死应用程序后JobScheduler是如何工作的吗? - Nitish
3个回答

1

如果您的应用程序被杀死时需要长时间运行后台任务,则需要实现AlarmManagerWorkManagerWorkManager曾经是beta版本,但现在仅适用于Android X,只需实现依赖项并从Google复制粘贴WorkManager类代码并放置您的任务即可。

WorkManager最新依赖项:

 implementation "androidx.work:work-runtime:2.2.0"

0
我找到了这篇文章。它说你必须在asyncTask的onPostExecute方法中调用jobFinished(),以便让系统知道工作已完成。

jobFinished()需要两个参数:当前作业,以便它知道可以释放哪个wakelock,以及一个布尔值,指示您是否要重新安排作业。如果传入true,则会为您启动JobScheduler的指数退避逻辑

我希望这有所帮助。

使用JobScheduler专业地安排作业


-1

有一个选项可以不杀死应用程序,但它非常粗鲁,这是个hack: 在您的清单文件中 -> 在 activity 标签内 -> 添加以下行

android:excludeFromRecents="true"

您的应用程序未显示在最近的应用程序历史记录中。因此,用户无法关闭该应用程序。

信息通过引用获得:https://code-examples.net/en/q/26c6cf8


1
那需要添加到该应用程序的每个活动中吗? - Bibaswann Bandyopadhyay
这不是一个好的答案,因为当您使用应用程序并点击应用历史记录按钮时,您可以看到应用程序在后台运行,并且您可以终止它。 - Anice Jahanjoo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接