Android:从小部件注册和取消注册广播接收器(ACTION_TIME_CLICK)

时间:2011-08-25 03:01:33

标签: android broadcastreceiver

我从widget.But动态注册了ACTION_TIME_TICK意图的接收器.10 / 15分钟后应用程序崩溃并重启设备。以下是代码:

@Override
public void onUpdate(Context context) {
        IntentFilter intentFilter = new IntentFilter(Intent.ACTION_TIME_TICK);
        context.getApplicationContext().registerReceiver(mReceiver, intentFilter);
}

我的广播接收器用于更新我的所有小部件:

    public class WReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        //Toast.makeText(context, "[onReceive]", 5).show();
            AppWidgetManager widgetMgr = AppWidgetManager.getInstance(context);
            int [] widgetIds = widgetMgr.getAppWidgetIds(new ComponentName(context, WidgetManager.class));
            //
            for(int appWidgetId : widgetIds) {
                WidgetManager.updateAppWidget(context, widgetMgr, appWidgetId, "World Clock");
            }
    }
      }

仅适用于约15至20分钟。我应该取消注册接收器,如果是这样我应该在小部件中注册?

1 个答案:

答案 0 :(得分:0)

AndroidManifest.xml而不是onUpdate中进行接收者注册:如果你在那里注册,你将在每次小部件提供者呼叫时重复注册相同的接收者,这将耗尽可用的您设备上的资源。

编辑:正如@haimg所指出的那样(见http://developer.android.com/reference/android/content/Intent.html#ACTION_TIME_TICK),这实际上应该在onEnabled而不是onUpdate中完成。您的崩溃是因为您每次onUpdate被调用时都会重复注册Intent,而不是一次(onEnabled会这样做)。