我遇到错误
Attempt to invoke virtual method on a null object reference 'int com.android.server.job.controllers.JobStatus.getUid()'
Run Code Online (Sandbox Code Playgroud)
有一个类似的问题 android-job-issues
但我不知道该怎么办。
这不是简单的nullpointerexception,看到了吗? 点击这张图片,你可以看到它
我的问题是如何证明这一点。
这是我的错误日志。
#1 main
java.lang.NullPointerException
Attempt to invoke virtual method 'int com.android.server.job.controllers.JobStatus.getUid()' on a null object reference
1 android.os.Parcel.readException(Parcel.java:1580)
2 android.os.Parcel.readException(Parcel.java:1527)
3 android.app.job.IJobCallback$Stub$Proxy.jobFinished(IJobCallback.java:167)
4 android.app.job.JobService$JobHandler.handleMessage(JobService.java:147)
5 android.os.Handler.dispatchMessage(Handler.java:102)
6 android.os.Looper.loop(Looper.java:135)
7 android.app.ActivityThread.main(ActivityThread.java:5413)
8 java.lang.reflect.Method.invoke(Native Method)
9 java.lang.reflect.Method.invoke(Method.java:372)
10 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1037)
11 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:832)
Run Code Online (Sandbox Code Playgroud) 我有点不确定FirebaseJobDispatcher(JobScheduler)是如何工作的.当用户失去互联网连接然后再次获得连接以便我的应用程序运行并在重新获得连接时进行同步以检查内容更新时我想要它.
我知道我们不应该使用连接更改广播监听器并使用JobScheduler,但似乎JobScheduler更像是一个更智能的AlarmManager,即使没有连接更改(我不需要)它也会运行.
是这种情况还是我误解了它是如何工作的?如果没有,只有当用户重新获得互联网连接时才会触发?
我想创建一个具有特定时间和给定周期的正在运行的作业。例如,我想在每个月的第二天安排一个作业,它应该每个月运行。
查看JobInfo.Builder 文档,我还没有找到设置初始延迟的方法。
关于如何实现这一目标的任何想法?
这是以正确的周期运行但不以我想要的初始延迟运行的代码:
fun build(application: Application, periodicity: Days, startDay: Days) {
val serviceComponent = ComponentName(application, GenerateDebtJobService::class.java)
val builder = JobInfo.Builder(1, serviceComponent)
.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)
.setPeriodic(TimeUnit.DAYS.toMillis(periodicity.days.toLong()))
(application.getSystemService(Context.JOB_SCHEDULER_SERVICE) as JobScheduler).schedule(builder.build())
Run Code Online (Sandbox Code Playgroud) 如何在打盹或非打盹模式下运行jobscheduler,即我想一直运行bg作业.可能吗?
JobInfo jobInfo
= new JobInfo.Builder(MYJOBID, jobService).setPeriodic(15 * 60 * 1000L)
.setExtras(bundle)
.setPersisted(true)
.build();
Run Code Online (Sandbox Code Playgroud) 我正在努力使我的闹钟应用程序与即将发布的 Android 12 兼容,最近我偶然发现了一个问题。似乎自 Android 12 更新以来,锁定/直接启动期间在作业计划程序中安排的作业只有在设备解锁后才会启动。我已经审查了 Android 12 中所做的更改,但没有发现任何适用于我的情况的更改,并且是在随机测试中发现的。
这是一个主要问题,因为我需要在设备重新启动时为我的应用程序重新安排闹钟,并且迫不及待地等待用户首先解锁设备,因为重新启动可能会在夜间自动发生,从而使用户在早上没有预定的闹钟。
运行以下测试应用程序(针对Android 11)时,结果如下:
除了手动运行整个作业(例如使用 WakeLock)之外,还有关于如何处理此问题的建议吗?或者也许有人知道 Android 12 的哪些变化实际上在这里生效?
这是一个用于观察这种情况的简单测试类:
class TestScheduler : JobService() {
companion object {
fun addScheduledJob(context: Context){
JobInfo.Builder(1111, ComponentName(context, TestScheduler::class.java))
.setOverrideDeadline(TimeUnit.SECONDS.toMillis(1))
.build().let {
val result = (context.getSystemService(Context.JOB_SCHEDULER_SERVICE) as JobScheduler).schedule(it)
when(result){
JobScheduler.RESULT_SUCCESS -> "success"
else -> "failure"
}.also {
Log.d("MyTAG", "jobScheduled: $it")
}
}
}
}
override fun onStartJob(params: JobParameters?): Boolean {
Log.d("MyTAG", "onStartJob: ${params?.jobId}")
jobFinished(params, false)
return true
}
override fun onStopJob(params: …Run Code Online (Sandbox Code Playgroud) 我正在开发一个应用程序,只要收到短信,就需要运行一些代码(网络).
在API 25和更低版本中它很好,我receiver在Manifest文件中注册了一个隐式文件,并在扩展的指定类中启动我的服务BroadcastReceiver.但是在API 26中,您无法注册android.provider.Telephony.SMS_RECEIVED,receiver因为它不起作用.
来自Android文档:
注意:如果您的应用程序的目标是API级别26或更高级别,则不能使用清单来声明隐式广播的接收者(特定于您的应用程序的广播),除了一些免于该限制的隐式广播.在大多数情况下,您可以使用预定作业.
我在媒体上看过几篇像这样的文章.有喜欢的解决方案,JobScheduler或者Explicit Receiver,但是第一个被用于网络状态的变化,我无法找到一个方法来触发任务SMS_RECEIVED的事件,第二个是有效的,直到你的活动启动并运行.
由于我的应用程序的性质,我需要监听传入的短信,无论应用程序是否正在运行.如何在API 26+中做到这一点?
编辑
也许Android网站上的JobInfoBuilder doc中的代码可以提供帮助.它监视设备上照片的变化,并在更改时启动作业.但是我找不到合适的Uri用短信做同样的事情(甚至不确定是否有可能通过短信监听短信ContentObserver)
我正在关注视频JobScheduler:
https://www.youtube.com/watch?v=XFN3MrnNhZA
但是lint给了我那context.getSystemService(class)是api 23.因为我错过了一些东西或者是否有机器人用api改变了什么?
注意:大多数人想知道是否JobScheduler介绍了api 21如何在没有它的情况下工作getSystemService(Class)
谢谢.
电池电量低于15%时,Job Scheduler不会触发.有没有办法超越电池问题.该设备仅用于特定的应用程序,其他任何东西都不会运行.
该设备是Lenovo Tab 3 A7-10,在Android Lollipop(5.0.1)上运行.
jobScheduler.schedule(new JobInfo.Builder(MY_JOB_ID,
new ComponentName(applicationContext, MyJob.class))
.setPeriodic(syncInterval)
.build());
Run Code Online (Sandbox Code Playgroud)
谢谢
我试图用来JobScheduler每3秒安排一次作业。我已经做好了Job.Builder准备,但是当我安排工作时,onStartJob()仍然没有接到电话。
我不确定我缺少什么,请帮助我。
JobBuilder:
ComponentName componentName = new ComponentName(this,JobSchedulerService.class);
JobInfo.Builder builder = new JobInfo.Builder(0,componentName)
.setPeriodic(5 * 1000);
JobScheduler jobScheduler = (JobScheduler) getBaseContext().getSystemService(Context.JOB_SCHEDULER_SERVICE);
int id = jobScheduler.schedule(builder.build());
Log.i("Service","ID is :"+id);
Run Code Online (Sandbox Code Playgroud)
里面JobService,
public class JobSchedulerService extends JobService {
@Override
public boolean onStartJob(JobParameters jobParameters) {
Message message = new Message();
message.what = Utils.JOB_SCHEDULER_WHAT;
message.obj = jobParameters;
handler.sendMessage(message);
return true;
}
@Override
public boolean onStopJob(JobParameters jobParameters) {
return false;
}
private final Handler handler = new …Run Code Online (Sandbox Code Playgroud) 我遵循了googles codelabs关于WorkManager实现和作业调度的指导原则.
PeriodicWorkRequest workRequest =
new PeriodicWorkRequest.Builder(Is30DaysOldWorker.class, PERIODIC_WORKREQUEST_INTERVAL, TimeUnit.SECONDS)
.addTag(IS_30_DAYS_OLD_WORKER)
.build();
getWorkManager().enqueue(workRequest);
Run Code Online (Sandbox Code Playgroud)
从谷歌文档中WorkManager使用JobSchedulerAPI 23+(我的情况) - 所以有可能在设备重启后使预定作业持久化吗?
在JobScheduler场景中,您通常会通过指定JobInfo.setPersisted(true)标志来执行此操作.