onStartJob 和 onStopJob 无法在 android 中运行后台线程

use*_*969 2 android job-scheduling android-asynctask

实际上我想使用 JobScheduler 进行通知,无论应用程序是否处于活动状态。我是 android 新手,首先只是尝试运行后台 AsyncTask 来检查它是否工作正常,但它不起作用。

这是我的 JobService 代码:

public class JobSchedularClass extends JobService {
    private static final String TAG = "JobSchedularClass";

   private BackgroundJob backgroundJob;
    @Override
    public boolean onStartJob(final JobParameters params) {

        Log.d(TAG, "onStartJob: ");

         backgroundJob=new BackgroundJob(){
            @Override
            protected void onPostExecute(String s) {
                Toast.makeText(getApplicationContext(),s+"kjk",Toast.LENGTH_SHORT).show();
                jobFinished(params,false);

            }
        };

        backgroundJob.execute();
        return true;
    }

    @Override
    public boolean onStopJob(JobParameters params) {
        Log.d(TAG, "onStopJob: ");
        backgroundJob.cancel(true);
        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

异步任务类:

public class BackgroundJob extends AsyncTask<Void,Void,String> {
    private static final String TAG = "BackgroundJob";
    @Override
    protected String doInBackground(Void... voids) {
        Log.d(TAG, "doInBackground: ");
        return "BackGround Job is running";
    }
}
Run Code Online (Sandbox Code Playgroud)

主要活动代码:

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ComponentName componentName=new ComponentName(MainActivity.this,JobSchedularClass.class);
         jobInfo =new JobInfo.Builder(code,componentName)
        .setPeriodic(5000)
        .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)
        .setPersisted(true)
         .build();
      jobScheduler=(JobScheduler)getSystemService(JOB_SCHEDULER_SERVICE);

    }

    public void Startjob(View view) {
       int code_result= jobScheduler.schedule(jobInfo);
        Toast.makeText(this," Job scheduling...",Toast.LENGTH_SHORT).show();
       if(code_result==JobScheduler.RESULT_SUCCESS){
           Toast.makeText(this," Job scheduling done...",Toast.LENGTH_SHORT).show();
       }
       else{
           Toast.makeText(this," Job scheduling  failed...",Toast.LENGTH_SHORT).show();
       }

    }

    public void Stopjob(View view) {

        jobScheduler.cancel(code);
        Toast.makeText(this," Job cancel...",Toast.LENGTH_SHORT).show();
    }
Run Code Online (Sandbox Code Playgroud)

这是清单权限和服务注册代码:

<uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
  <service android:name=".JobSchedularClass"
            android:permission="android.permission.BIND_JOB_SERVICE"
            android:exported="true"
      />
Run Code Online (Sandbox Code Playgroud)

注意:我按照要求使用 API 21。请指导我哪里出错了。提前致谢

Sag*_*gar 7

Android 版本 < N 上存在一些问题setPeriodic()(尽管我没有问题的官方链接)。您需要使用setMinimuLatency()它才能在所有版本中工作

    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
        jobInfo = new JobInfo.Builder(id, name)
                .setMinimumLatency(5000)
                .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)
                .setPersisted(true)
                .build();
    } else {
        jobInfo = new JobInfo.Builder(id, name)
                .setPeriodic(5000)
                .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)
                .setPersisted(true)
                .build();
   }
Run Code Online (Sandbox Code Playgroud)

工作正常,但再次执行的时间超过 5 秒

基于setMinimumLatency()的文档:

在此之前的毫秒数,将不考虑执行该作业

基于setPeriodic()的文档:

您无法控制该作业在此时间间隔内何时执行,只能保证在此时间间隔内最多执行一次

总的来说,您无法控制计划作业的执行时间。系统将决定何时执行它。

在我的代码中,我想每 5 分钟检查一次并发送 FCM 通知,即使应用程序是否处于活动状态

这样做并不是一个好主意。当打瞌睡模式启动时,您永远无法保证每 5 分钟就能成功执行任务。

尽管有一些替代方案,例如创建前台服务或每 5 分钟触发一次 AlarmManager,但这些方法会耗尽电池电量。

您可以减少通知服务器的频率。假设每 2 小时或一天两次。但是使用 JobScheduler 您将无法确定确切的时间。如果您的要求是准确的时间,那么请选择 AlarmManager。请参阅此链接以检查如何实现