我像这样开始工作:
JobScheduler scheduler = (JobScheduler) getSystemService(JOB_SCHEDULER_SERVICE);
if(scheduler.getPendingJob(JOB_NUMBER) == null) {
ComponentName componentName = new ComponentName(this, mService.class);
JobInfo info = new JobInfo.Builder(JOB_NUMBER, componentName)
.setRequiresCharging(false)
.setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)
.setPersisted(true)
.setPeriodic(60 * 60 * 1000)
.build();
int resultCode = scheduler.schedule(info);
if (resultCode == JobScheduler.RESULT_SUCCESS) {
Log.d(TAG, "Service is not running, Job " + String.valueOf(JOB_NUMBER) + " Scheduled.");
} else {
Log.d(TAG, "Service is not running, However job scheduling failed.");
}
} else{
Log.d(TAG, "Service is already scheduled.");
}
在服务中:
@Override
public boolean onStartJob(JobParameters jobParameters) {
Log.d("Service", "v1.2 Started");
我得到输出“服务正在运行”,但没有得到“服务已启动”。并且应用程序也没有接收服务应该发送的广播。
这一切在 Android 8 中都能完美运行,但在 7 中则不然。
编辑:我猜该服务必须正在运行,因为当我关闭并重新启动应用程序时,我收到消息“服务已安排”。那么为什么我看不到服务的任何日志输出呢?在牛轧糖中,它会像在奥利奥中一样立即运行吗?或者我必须等待一个小时才能开始?
最佳答案
请尝试这个:
// the service class
import android.app.job.JobParameters;
import android.app.job.JobService;
import android.util.Log;
/**
* JobService to be scheduled by the JobScheduler.
* start another service
*/
public class mService extends JobService {
private static final String TAG = "SyncService";
@Override
public boolean onStartJob(JobParameters params) {
Log.d("TAG", "onStartJobb");
return true;
}
@Override
public boolean onStopJob(JobParameters params) {
Log.d("TAG", "onStopJob");
return true;
}
}
// in main activity
@RequiresApi(api = Build.VERSION_CODES.N)
public void onResume(){
super.onResume();
JobScheduler scheduler = getSystemService(JobScheduler.class);
if(scheduler.getPendingJob(1) == null) {
ComponentName componentName = new ComponentName(this, mService.class);
//JobInfo.Builder builder = new JobInfo.Builder(0, serviceComponent);
JobInfo.Builder info = new JobInfo.Builder(1, componentName)
.setRequiresCharging(false)
.setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)
.setPersisted(true)
.setMinimumLatency(1 * 1000)
.setOverrideDeadline(3 * 1000)
//.setPeriodic(60 * 60 * 1000)
//.build()
;
int resultCode = scheduler.schedule(info.build());
if (resultCode == JobScheduler.RESULT_SUCCESS) {
Log.d("TAG", "Service is not running, Job " + String.valueOf(1) + " Scheduled.");
} else {
Log.d("TAG", "Service is not running, However job scheduling failed.");
}
} else{
Log.d("TAG", "Service is already scheduled.");
}
}
// and in manifest
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<service
android:name=".mService"
android:enabled="true"
android:exported="true"
android:label="Word service"
android:permission="android.permission.BIND_JOB_SERVICE">
</service>
请下载this示例并从那里导入NotificationScheduler新项目并检查它。请相应地更改您的项目。
我注意到的:
list 条目是:
android:name=".mService" android:permission="android.permission.BIND_JOB_SERVICE" ></service>
作业调度程序:
ComponentName serviceName = new ComponentName(getPackageName(), mService.class.getName()); long min = JobInfo.getMinPeriodMillis(); JobInfo.Builder builder = new JobInfo.Builder(JOB_ID, serviceName) .setRequiredNetworkType(NETWORK_TYPE_NONE) .setRequiresDeviceIdle(false) .setPeriodic(5000) .setRequiresCharging(false); builder.setPeriodic(5 * 1000); JobInfo myJobInfo = builder.build(); JobScheduler jobScheduler = (JobScheduler) getSystemService(JOB_SCHEDULER_SERVICE); jobScheduler.schedule(myJobInfo);
请注意,这里对Periodic min Interval有一个限制,不幸的是它是15分钟,当我们将其设置得更小时,SDK将其更改为15分钟,并且还将Flex间隔设置为5分钟,最后我们得到服务在作业调度时间大约 7-8 分钟后开始。就是这样)。
这对我有用,
祝你好运)
关于java - Nougat - JobScheduler RESULT_SUCCESS 但作业没有输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52424400/