通过activity控制widget更新。

      做过widget的朋友肯定知道,widget是多么的贫弱。连最起码的findViewById方法都不支持。当android1.5的时候,大家还可以通过设置android:updatePeriodMillis="1000" 来定期更新widget,当升级到2.0以后,甚至不能控制小于30分钟的更新(1.6不太清楚)。这个是我在做《我的宠物》时,遇到的一个卡了比较久的地方。下面就来介绍一下我是解决方法。

思路:
      在activity中,发生一个点击事件时,由activity发送一个广播(broadcast),因为AppWidgetProvider本身就是一个receiver。所以在AppWidgetProvider中的onReceive方法中接收这个广播就行了。

具体做法:
      activity中创建,并且发送一个广播
  1. Intent intent = new Intent("com.android.CLICK");
  2.             this.sendBroadcast(intent);
复制代码
"com.android.CLICK"就是一个字符串,可以随意定义,但是不要跟系统广定义播重复了。

      这个动作,要在AndroidManifest.xml中注册,注册以后,你的widget才会接收到这个广播
  1. <receiver android:name=".widget.MyWidget"
  2.                         android:label="@string/widget_text"
  3.                         android:icon="@drawable/icon">
  4.                         <intent-filter>
  5.                                 <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
  6.                                 <action android:name="com.android.CLICK"></action>
  7.                         </intent-filter>
  8.                         <meta-data android:name="android.appwidget.provider" android:resource="@xml/appwidget_info" />
  9.                 </receiver>
复制代码
注册好了以后,就要在你的AppWidgetProvider的onReceive方法中对齐进行捕获。
  1. @Override 
  2.         public void onReceive(Context context, Intent intent) {
  3.                 super.onReceive(context, intent); 
  4.                 Log.i("a", "onReceive");
  5.                 if(intent.getAction().equals("com.android.CLICK")){
  6.                       Log.i("a", "ok,捕获到了这个广播");
  7.                 }
  8.         }
复制代码
仅仅是捕获到广播,还没完,因为我们还有一个目的,是要更新widget。所以在if语句中写入如下代码:
  1. RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.main_widget);
  2.                  views.setTextViewText(R.id.widget_Message, showMsg);
  3.                  AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
  4.                  appWidgetManager.updateAppWidget(new ComponentName(context, PetWidget.class), views);
复制代码
好了,打完-收功。