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。请指导我哪里出错了。提前致谢
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。请参阅此链接以检查如何实现
| 归档时间: |
|
| 查看次数: |
5070 次 |
| 最近记录: |