我在AppWidgetProvider的onUpdate()方法中声明了broadcastReceiver。广播接收器将收听连接更改。
IntentFilter intentFilter = new IntentFilter(connectivityChange);
context.getApplicationContext().registerReceiver(mReceiver, intentFilter);
每次onUpdate()方法启动时,是否都会创建一个新的broadcastReceiver吗?
如果是这样,我如何注销先前的广播,以使我没有几十个广播接收器?
context.getApplicationContext().unregisterReceiver(mReceiver);
不起作用,因为AppWidgetProvider丢失了mReceiver的实例。
编辑:我无法在清单中声明接收者,因为清单中对于最新的Android API级别禁用了连接更改操作,因此我必须以编程方式进行注册
答案 0 :(得分:0)
解决方案: 回答。是的,在onUpdate()中注册一个BroadcastReceiver,将每次都注册一个新的。我通过在OnEnabled()中创建一个广播接收器解决了太多的问题,因为该代码仅在创建第一个窗口小部件时运行。
这是我计划注销在onEnabled中创建的broadcastReceiver的方式。注册时,我会将意图过滤器:ACTION_APPWIDGET_DISABLED添加到broadcastReceiver。在自定义broadcastReceiver的OnReceive()方法中,我将执行:
@Override
public void onReceive(Context context, Intent intent){
if(intent.getAction().equals("ACTION_APPWIDGET_DISABLED"){
context.unregisterReceiver(this);
}
else{
...
//Rest of my method
{
{
答案 1 :(得分:0)
在AppWidgetProvider中监听连接更改确实是个坏主意,因为他的寿命与BroadcastReceiver相同。 AppWidgetProvider是类固醇上的BroadcastReceiver,但是如果您在onEnabled()中动态注册接收器,则您的AppWidgetProvider实例将很快生效,因此一段时间后您将不会获得任何真实的连接更改回调。您可以找到here更好的选择。