实际上我想使用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";
}
}
MainActivity Code:
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。请指导我在哪里弄错了。在此先感谢
答案 0 :(得分:1)
Android版本上的setPeriodic()
存在一些问题&lt; 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以了解如何实现