我有一个时钟小部件Android应用程序,我现在正在尝试更新到API 26要求.
到目前为止,我使用了一个后台服务,它在onCreate方法a中开始注册,BroadcastReceiver以接收系统广播,例如android.intent.action.SCREEN_ON, android.intent.action.SCREEN_OFF, android.intent.action.TIME_SET, android.intent.action.TIMEZONE_CHANGED.然后,当屏幕关闭时,此服务暂停时钟,并在屏幕重新打开时将其唤醒以节省电池电量.
在Oreo中,这种服务似乎不是一种选择,因为它必须在前台运行,并且通知对用户来说真的没有意义.另外,据我在文档中看到,JobScheduler无法帮助我,因为我还没有发现可以在屏幕打开时安排作业.
我试图创建一个BroadcastReceiver的内AppWidgetProvider类,并在对其进行注册AppWidgetProvider的onUpdate方法来接收所述系统广播.这很好用,广播确实收到了,但直到屏幕保持关闭一段时间; 之后,似乎应用程序以某种方式被系统杀死,或者在没有任何报告错误或崩溃的情况下停止工作; 但是,如果我点击它,它将正常打开配置活动.
我的问题:
如果我不想运行前台服务,如何在API 26+上正确收听屏幕开/关广播?
是否可以从AppWidgetProvider类本身监听系统广播,通过BroadcastReceiver在其中注册,或甚至注册AppWidgetProvider自己接收系统事件(无论如何AppWidgetProvider是扩展BroadcastReceiver).
为什么我AppWidgetProvider会在一段睡眠期后暂时停止接收广播的系统意图?
编辑:
我在Android文档中找到了以下registerReceiver方法中的以下内容,这似乎是我的问题2和3的答案.
注意:无法从BroadcastReceiver组件调用此方法; 也就是说,来自在应用程序清单中声明的BroadcastReceiver.但是,从另一个在运行时使用registerReceiver(BroadcastReceiver,IntentFilter)注册的BroadcastReceiver调用此方法是可以的,因为这样的已注册BroadcastReceiver的生命周期与注册它的对象相关联.
我会得出结论,我对BroadcastReceiver内部的使用和注册AppWidgetProvider与此规范相反.
我将保留这篇文章,因为其他人可能会发现这些信息有用,我的问题1仍然有效.