gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 23:59:36 26 4
gpt4 key购买 nike

实际上,我想使用 JobScheduler 来通知应用程序是否处于 Activity 状态。我是 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;
}
}

异步任务类:

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

主要 Activity 代码:

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

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

<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() 存在一些问题(尽管我没有问题的官方链接)。您需要使用 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检查它是如何实现的

关于android - onStartJob 和 onStopJob 在 android 中无法运行后台线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50099403/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com