我最近正在更新一个应用程序,我使用JobIntentService而不是常规的IntentService处理来自push的通知,因为它似乎是在棒棒糖前设备和帖子上处理此问题的正确方法.我这样排队工作:
JobIntentService
这是清单声明:
IntentService
我从未在onHandleWork中看到任何回调或在我的logcat中看到任何错误日志.是否有人成功整合了这可能有所帮助?
更新:我在api level 21设备上测试了它并且它工作..但它似乎没有在我的android O像素XL设备上调用..任何线索为什么?
更新#2:我似乎也看到了intentservice的onCreate被调用,但没有其他生命周期方法(包括onHandleWork).有人遇到过这个吗?
我does not require android.permission.BIND_JOB_SERVICE permission
在调度时遇到错误JobService
,我已经拥有绑定权限.以下是我的代码.
JobScheduler jobScheduler = (JobScheduler) getSystemService(JOB_SCHEDULER_SERVICE);
ComponentName componentName = new ComponentName(MainActivity.this,MyJobService.class);
JobInfo.Builder jobInfo = new JobInfo.Builder(101, componentName).setPeriodic(2000);
jobScheduler.schedule(jobInfo.build())
<service
android:name=".MyJobService"
android:permission="android:permission.BIND_JOB_SERVICE"
android:exported="true"/>
Run Code Online (Sandbox Code Playgroud)
错误:
java.lang.IllegalArgumentException:计划服务ComponentInfo {services.acadglid.com.acadgildservices/services.com.es.MyJobService}不需要android.permission.BIND_JOB_SERVICE权限
我在我的项目中使用JobService.它运作良好.但有时服务停止了.它不会再次重启.因此,如果没有运行,我正试图策划JobService.但我不知道如何检查JobService是否已经运行.请让我知道如何检查JobService是否正在运行.
我的职业服务班:
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public class JobService extends android.app.job.JobService {
@Override
public boolean onStartJob(JobParameters params) {
if (NetworkHandler.getInstance().isNetworkAvailable()) {
TaskHandler.getInstance().getTaskListFromServer(PreferenceManagerForPlannedRoute.getInstance().getLastSyncTime(), PreferenceManagerForPlannedRoute.getInstance().getInProgressMoveTask());
NotificationUtils.getInstance().CreateNotification();
Logger.d("Scheduler", "Working!!");
} else {
Logger.d("Network", "not available");
}
return false;
}
@Override
public boolean onStopJob(JobParameters params) {
Logger.d("onStopJob", "Stopped");
return true;
}
}
Run Code Online (Sandbox Code Playgroud)
我的Util类:
public class JobSchedulerUtils {
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public static void scheduleJob(Context context) {
ComponentName serviceComponent = new ComponentName(context, JobService.class);
JobInfo.Builder builder = new JobInfo.Builder(0, serviceComponent);
builder.setRequiresDeviceIdle(false);
builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY);
builder.setPeriodic(5000);
builder.setPersisted(true);
JobScheduler jobScheduler = …
Run Code Online (Sandbox Code Playgroud) 我JobService
这样扩展:
public class MyJobService extends JobService {
@Override
public boolean onStartJob(JobParameters params) {
return false;
}
@Override
public boolean onStopJob(JobParameters params) {
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
整个类代码以黄色突出显示。
警告说:
指定 WorkManager 使用的作业 ID 的有效范围。
我做错了什么以及我应该做什么?
我想从Activity类获取lat和经度值到JobService.我怎样才能做到这一点?我尝试过使用Intent和putExtras等(请看下面的代码),但是无法正确使用.
MainActivity.class
protected void createLocationRequest(Bundle bundle) {
LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, new LocationCallback() {
@Override
public void onLocationResult(final LocationResult locationResult) {
Log.i("onLocationResult", locationResult + "");
latitude = locationResult.getLastLocation().getLatitude() + "";
longitude = locationResult.getLastLocation().getLongitude() + "";
Log.e("onLocationResult lat", latitude);
Log.e("onLocationResult Lon", longitude);
//I need to send latitude and longitude value to jobService?
//how to do that?
//tried using intent but didn't seem to work
//Intent mIntent = new Intent();
//mIntent.putExtra("lat", latitude);
//mIntent.putExtra("lon", longitude);
}
}, null);
}
Run Code Online (Sandbox Code Playgroud)
MyJobService类
public class MyJobService extends JobService …
Run Code Online (Sandbox Code Playgroud) 我在一些设备上有一个小问题我的通知是没有背景,有时在Android O上没有激发(特别是在小米上).我正在使用Awareness API,我从BroadcastReceiver接收数据.所以...我想做的是将我的通知放在JobService中,也许可以获得一些处理时间,然后调用它:
PersistableBundle bundle = new PersistableBundle();
bundle.putString("KEY1", "Test");
JobInfo job = new JobInfo.Builder(0, new ComponentName(context, AppNotification.class))
.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)
.setExtras(bundle)
.build();
JobScheduler jobScheduler = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE);
jobScheduler.schedule(job);
Run Code Online (Sandbox Code Playgroud)
但是当我没有它的时候
.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)
Run Code Online (Sandbox Code Playgroud)
我发现了一个错误"你正试图建立一个没有约束的工作,这是不允许的".但我不需要任何限制,这是我发现最有可能始终有效的.但实际上总是有效的约束是什么?如何在没有任何约束的情况下触发JobService?
我正在检查Android-L开发人员SDK中的最新示例.有一个android-L/ui/views/Clipping/ClippingBasic
名为TestJobService的示例类.它从JobService扩展而来,后者又从Service扩展.我看到JobService是android.jar中的一个类,但我在开发指南中找不到任何关于它的信息,也没有在Android源代码www.androidxref.com中找到它.有没有人见过这个班级或知道它的目的是什么?
我有一个JobService,我想定期开始.目前,为了测试,我使用的是一个微不足道的:
public class SenderService extends JobService {
@Override
public boolean onStartJob(final JobParameters params) {
new Thread(new Runnable(){
public void run(){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
jobFinished(params, false);
}
}).start();
return true;
}
@Override
public boolean onStopJob(JobParameters params) {
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
我安排这样的工作:
ComponentName serviceName = new ComponentName(this, SenderService.class);
JobInfo jobInfo = new JobInfo.Builder(JOB_ID, serviceName)
.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)
.setRequiresDeviceIdle(false)
.setRequiresCharging(false)
.setPersisted(true)
.setPeriodic(10000)
.build();
scheduler = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE);
int result = scheduler.schedule(jobInfo);
if (result == JobScheduler.RESULT_SUCCESS) {
Log.d(LOGTAG, …
Run Code Online (Sandbox Code Playgroud) 我正在尝试让我的应用程序在 Android 9 上运行。以下代码在 Android 8 之前都可以正常工作,但出于某种原因,JobService 不会在 android 9 上重新安排。它第一次被安排,但不会根据到设置周期。
class RetrieveJobService : JobService() {
override fun onStartJob(params: JobParameters): Boolean {
doBackgroundWork(params)
return true
}
private fun doBackgroundWork(params: JobParameters) {
Thread {
try {
doRetrieveBackgroundStuff(this)
jobFinished(params, false)
} catch (e: Exception) {
jobFinished(params, false)
}
}.start()
}
override fun onStopJob(params: JobParameters): Boolean {
return false
}
}
Run Code Online (Sandbox Code Playgroud)
这里是我的 JobInfo.Builder
val builder = JobInfo.Builder(jobID, componentName)
.setPersisted(true)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
builder.setPeriodic(millis, 15 * 60 * 1000) //15 min
} …
Run Code Online (Sandbox Code Playgroud) 我已经在Android中实现了一个使用JobService来检查更新的应用程序。我已经在一些设备上进行了测试:Samsung J3,RedMi 5 +,RedMi note pro,MI A2 lite。它在J3中正常工作,但是在我测试过的其他电话中,如果某个应用程序处于非活动状态或该应用程序不在最近的应用程序列表中,则不会计划JobService。
这是我的实现方式。
MainActivity.java
public static void scheduleJob(Context context) {
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
JobScheduler js =
(JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
JobInfo job = new JobInfo.Builder(
MY_BACKGROUND_JOB,
new ComponentName(context, CheckAdService.class))
.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)
.setPersisted(true)
.setPeriodic(15 * 60 * 1000)
.build();
int resultCode = js.schedule(job);
if (resultCode == JobScheduler.RESULT_SUCCESS) {
Log.d("JOB", "Scheduled");
} else {
Log.d("JOB", "Not Scheduled");
}
}
}
Run Code Online (Sandbox Code Playgroud)
Service.java
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public class CheckAdService extends JobService {
@Override …
Run Code Online (Sandbox Code Playgroud)