onStartJob和onStopJob不能在android中运行后台线程

问题描述 投票:1回答:1

实际上我想使用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;
    }
}

AsyncTask类:

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";
    }
}

主要活动代码:

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();
    }

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

<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"
      />

注意:我正在使用API​​ 21。请指导我在哪里弄错了。提前致谢

android android-asynctask job-scheduling
1个回答
1
投票

setPeriodic()在Android版本<N上存在一些问题(虽然我没有官方链接问题)。您需要使用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();
   }

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

根据setMinimumLatency()的文档:

毫秒,此作业将不会被考虑执行

根据setPeriodic()的文档:

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

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

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

这样做并不是一个好主意。当打盹模式启动时,您永远不能保证您将在5分钟内成功执行任务。

虽然有其他选择,比如创建前台服务或每隔5分钟触发一次AlarmManager,但这些方法会耗尽电量。

您可以改为通知服务器的频率。让我们说每天每2小时或两次。但是使用JobScheduler你将无法确定准确的时间。如果您的要求是准确的时间,那么请转到AlarmManager。请参阅this link以了解如何实现

© www.soinside.com 2019 - 2024. All rights reserved.