首页 > 解决方案 > 我可以用 JobScheduler 做所有 BroadcastReceiver 可以做的事情吗?

问题描述

我有一个使用BroadcastReceiverBR简称)在清单中注册的应用程序intent-filter ACTION_POWER_CONNECTEDACTION_POWER_DISCONNECTED

这会在手机插入时BR启动Service,当手机拔出时它将停止Service

这个Service注册另一个BR,我这样做是因为我ACTION_BATTERY_CHANGED想在手机充电时注册,即使应用程序关闭/销毁,我也使用它来保持注册。ACTION_BATTERY_CHANGEDBRService

该应用程序适用于所有API级别,除了 27。

我知道在API 27 中有BRs一些限制,所以我试图弄清楚什么是有效的,什么不是。

我认为第一个BR清单中的那个)从未注册过,而另一个正在工作(我也启动了主活动的ServiceinonCreate方法,所以第二个BR在打开应用程序时注册)但是当我关闭应用程序Service会自动停止/销毁,因此第二个BR将注销。

API级别低于 27Service时,不会自动停止/销毁。

有人告诉我:

你为什么不试试IntentService...

然后他说:

你知道,这个想法很愚蠢,不要尝试。

所以我没有尝试。

网上大家都在说用JobScheduler,看了一下JobScheduler觉得JobSchedulerBRs

所以我的问题是我可以做所有BroadcastReceiver可以做的事情JobScheduler吗? 我的意思是我可以在没有BRs但使用JobScheduler.

标签: androidbroadcastreceiverandroid-jobscheduler

解决方案


不,JobScheduler不是来代替BroadcastReceiver的。

BroadcastReceiver让您通知已System/Custom定义的事件集,以便您可以基于此执行某些任务。

JobScheduler允许您Schedule执行某些任务,该任务将在遇到意愿时执行Defined Criteria

看看定义,他们的工作区域可能有一些重叠,但两个执行非常独立的功能。

编辑评论:-

您可以使用 来执行此操作JobScheduler,因为这提供了在 Charger Plug-In 时执行某些任务的方法。

val jobBuilder = JobInfo.Builder(JOB_ID, ComponentName(this, SyncServices::class.java))
jobBuilder.setRequiresCharging(true)
val ss = getSystemService(Context.JOB_SCHEDULER_SERVICE) as JobScheduler
ss.schedule(jobBuilder.build())

这将SyncServices在充电器插件时启动。

现在,您可以从同步服务执行某些任务并最终返回任务完成或未完成的状态,具体取决于它将再次调用。您可以JobScheduler在 ( https://developer.android.com/reference/android/app/job/JobScheduler)[这里]找到有关详细信息。


推荐阅读