我构建了一个应用程序小部件,它只是定期获取数据,因此它没有任何 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/