java - 如何在没有应用程序小部件 Activity 的情况下注册广播接收器?

标签 java android android-appwidget

我构建了一个应用程序小部件,它只是定期获取数据,因此它没有任何 Activity ;甚至不是配置 Activity 。是否可以使用以下代码注册广播接收器而不使用 Activity ?

context.registerReceiver(networkChangeReceiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));

基本上,我希望该小部件在设备重新连接到网络时自动刷新,而不是等待下一次刷新。

我尝试在 AppWidgetProvider 的 onEnabled() 和 onUpdate() 方法中执行此操作,但它会抛出 android.content.ReceiverCallNotAllowedException 所以,我不知道还能在哪里执行此操作。

list 也不是一个选项,因为 ConnectivityManager.CONNECTIVITY_ACTION 在 SDK 24+ 中被忽略。

最佳答案

首先让我们确定应用程序小部件的生命周期。 AppWidgetProvider 默认情况下是一个 BroadcastReceiver,因此它可以存活很短的时间(onReceive() 有 10 秒超时 - 所以 onUpdate ()onEnabled(),以及 AppWidgetProvider 的所有其他回调都将在 onReceive() 回调上执行。因此,注册动态广播接收器不是一个选项。你只有一个选择(因为你没有任何 Activity ,并且你想在没有 ui 的情况下更新你的小部件) - 前台服务(是的,你需要 oreo+ 设备的通知,但没有其他方法)。您可以注册您的接收器并在 ConnectivityManager.CONNECTIVITY_ACTION 上进行更新,并更新小部件,例如:

val intent = Intent(this, YourAppWidgetProvider::class.java)
intent.action = AppWidgetManager.ACTION_APPWIDGET_UPDATE
val ids = AppWidgetManager.getInstance(application).getAppWidgetIds(ComponentName(getApplicationContext(), YourAppWidgetProvider::class.java)
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, ids)
sendBroadcast(intent)

就您而言,如果您需要对动态接收器操作使用react,这是更新小部件的唯一方法。

关于java - 如何在没有应用程序小部件 Activity 的情况下注册广播接收器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60760409/

相关文章:

java - Android - 更改ListView项目的TextStyle

android - 实现 AsyncQueryHandler

android - 边距不起作用

java - 使用 jar 中的@entity 时,Spring Data Jpa Repository 不工作

java - java代码的解释?

java - 从 stdin 读取并使用 UDP 发送,创建双向通信

android - 双击 ListView 项时获取选定项

android-layout - Jetpack Glance 小部件如何在没有 XML 的情况下工作?它如何转换为 RemoteViews?

android - 手机锁定时显示小部件

android - Android 默认锁屏上的应用程序小部件?