您可以使用
WorkManager来更新小部件。在API 14+的设备上使用WorkManager。您需要像这样覆盖fun onReceive(context: Context?, intent: Intent?):
val ACTION_AUTO_UPDATE : String = "AUTO_UPDATE";
override fun onReceive(context: Context?, intent: Intent?) {
super.onReceive(context, intent)
if(intent?.action.equals(ACTION_AUTO_UPDATE))
{
val appWidgetManager = AppWidgetManager.getInstance(context)
val thisAppWidgetComponentName = ComponentName(context!!.getPackageName(), javaClass.name)
val appWidgetIds = appWidgetManager.getAppWidgetIds(thisAppWidgetComponentName)
for (appWidgetId in appWidgetIds) {
}
}
}
你需要创建一个PeriodicWorkRequest。这个请求用来重复执行工作。周期性工作的最小间隔为15分钟。当小部件被启用时,我们将周期性工作排队执行:
override fun onEnabled(context: Context) {
val periodicWorkRequest = PeriodicWorkRequest.Builder(YourWorker::class.java, 15, TimeUnit.MINUTES).build()
WorkManager.getInstance(context).enqueueUniquePeriodicWork("YourWorker", ExistingPeriodicWorkPolicy.REPLACE,periodicWorkRequest)
}
当小部件被禁用时,请取消它:
override fun onDisabled(context: Context) {
WorkManager.getInstance(context).cancelAllWork()
}
最后我们创建一个工作者类:
class YourWorker(ctx: Context, params: WorkerParameters) : Worker(ctx, params) {
var context : Context? = null
init {
context = ctx
}
override fun doWork(): Result {
val alarmIntent = Intent(context, YourWidget::class.java)
alarmIntent.action = YourWidget().ACTION_AUTO_UPDATE
context?.sendBroadcast(alarmIntent)
return Result.success()
}
如果您想使用WorkerManager,需要在build.gradle中添加implementation 'androidx.work:work-runtime:2.3.1'。您可以在此处找到示例:
链接。