Java 牛轧糖-JobScheduler结果\u成功,但没有来自作业的输出
我开始这样的工作:Java 牛轧糖-JobScheduler结果\u成功,但没有来自作业的输出,java,android,android-studio,android-studio-3.0,Java,Android,Android Studio,Android Studio 3.0,我开始这样的工作: JobScheduler scheduler = (JobScheduler) getSystemService(JOB_SCHEDULER_SERVICE); if(scheduler.getPendingJob(JOB_NUMBER) == null) { ComponentName componentName = new ComponentName(this, mService.class); JobInfo info = n
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");
我得到的输出是“服务正在运行”,但不是“服务已启动”。应用程序也没有收到服务应该发送的广播
这一切在安卓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>
请注意,这里有一个对周期性最小间隔的限制,不幸的是,它是15分钟,当我们将其设置得更小时,SDK将其更改为15分钟,并将弹性间隔设置为5分钟,最后,我们在作业调度时间约7-8分钟后启动服务。就是这样)
这对我有用
祝你好运)请试试这个:
// 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>
请注意,这里有一个对周期性最小间隔的限制,不幸的是,它是15分钟,当我们将其设置得更小时,SDK将其更改为15分钟,并将弹性间隔设置为5分钟,最后,我们在作业调度时间约7-8分钟后启动服务。就是这样)
这对我有用
祝您好运)请尝试设置.setPeriodic(20*1000)并等待20秒以进行设置ensure@HovanesMosoyan谢谢,我尝试了一下,但仍然没有输出。是的,我也尝试过),我认为有些权限我们不允许,我们应该对此进行研究,我尝试了一个全新的空白服务,我无法让它在v7中运行。新代码与上面的代码相同吗?请尝试设置.setPeriodic(20*1000)并等待20秒ensure@HovanesMosoyan谢谢,我试过了,但还是没有输出。是的,我也试过了),我想有些权限是我们不允许的,我们应该对此进行研究,我尝试了一个全新的空白服务,但无法在v7中运行。新代码与上面的代码相同吗?非常感谢您的帮助!!似乎唯一缺少的位是
setMinimumLatency
和setOverrideDeadline
。我不知道为什么,但在安卓N中,出于某种原因,它们是必需的。我不记得在文档中的任何地方看到过。是的,设置截止日期并不是那么重要)虽然上面的代码确实起作用,但它没有将其设置为定期运行。请为迟交的答案感到抱歉,最后我得到了护目镜示例,请注意我答案中的更改。非常感谢您的帮助!!似乎唯一缺少的位是setMinimumLatency
和setOverrideDeadline
。我不知道为什么,但在安卓N中,出于某种原因,它们是必需的。我不记得在文档中的任何地方看到过。是的,设置截止日期并不是那么重要)虽然上面的代码确实起作用,但它没有将其设置为定期运行。请为迟交的答案感到抱歉,最后我得到了护目镜示例,请注意我答案中的更改。
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);