onStartJob 和 onStopJob 在 android 到 运行 后台线程中不工作
onStartJob and onStopJob Not Working in android to run background Thread
实际上我想使用 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 Class:
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();
}
这是清单权限和服务注册码:
<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 版本 < N 上的 setPeriodic()
存在一些问题(虽然我没有正式的 link 来发布)。您需要使用 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();
}
working fine but time is taking longer than 5 second to execute again
基于 setMinimumLatency() 的文档:
Milliseconds before which this job will not be considered for execution
基于 setPeriodic() 的文档:
You have no control over when within this interval this job will be executed, only the guarantee that it will be executed at most once within this interval
总的来说,您无法控制计划的作业何时执行。系统会决定什么时候执行。
In my code I want to check and send FCM notification after every 5
minutes even app is active or not
这样做不是一个好主意。您永远无法保证在打瞌睡模式启动时每 5 分钟就会成功执行一次任务。
虽然有创建前台服务或每 5 分钟触发一次 AlarmManager 等替代方法,但这些方法会耗尽电池电量。
您可以改为降低通知服务器的频率。让我们说一天中每 2 小时或两次。但是使用 JobScheduler 您将无法确定确切的时间。如果您的要求是准确的时间,那么请选择 AlarmManager。参考this link查看如何实现
实际上我想使用 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 Class:
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();
}
这是清单权限和服务注册码:
<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 版本 < N 上的 setPeriodic()
存在一些问题(虽然我没有正式的 link 来发布)。您需要使用 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();
}
working fine but time is taking longer than 5 second to execute again
基于 setMinimumLatency() 的文档:
Milliseconds before which this job will not be considered for execution
基于 setPeriodic() 的文档:
You have no control over when within this interval this job will be executed, only the guarantee that it will be executed at most once within this interval
总的来说,您无法控制计划的作业何时执行。系统会决定什么时候执行。
In my code I want to check and send FCM notification after every 5 minutes even app is active or not
这样做不是一个好主意。您永远无法保证在打瞌睡模式启动时每 5 分钟就会成功执行一次任务。
虽然有创建前台服务或每 5 分钟触发一次 AlarmManager 等替代方法,但这些方法会耗尽电池电量。
您可以改为降低通知服务器的频率。让我们说一天中每 2 小时或两次。但是使用 JobScheduler 您将无法确定确切的时间。如果您的要求是准确的时间,那么请选择 AlarmManager。参考this link查看如何实现