通过activity控制widget更新。
做过widget的朋友肯定知道,widget是多么的贫弱。连最起码的findViewById方法都不支持。当android1.5的时候,大家还可以通过设置android:updatePeriodMillis="1000" 来定期更新widget,当升级到2.0以后,甚至不能控制小于30分钟的更新(1.6不太清楚)。这个是我在做《我的宠物》时,遇到的一个卡了比较久的地方。下面就来介绍一下我是解决方法。
思路: 在activity中,发生一个点击事件时,由activity发送一个广播(broadcast),因为AppWidgetProvider本身就是一个receiver。所以在AppWidgetProvider中的onReceive方法中接收这个广播就行了。
具体做法: activity中创建,并且发送一个广播
- Intent intent = new Intent("com.android.CLICK");
- this.sendBroadcast(intent);
复制代码
"com.android.CLICK"就是一个字符串,可以随意定义,但是不要跟系统广定义播重复了。
这个动作,要在AndroidManifest.xml中注册,注册以后,你的widget才会接收到这个广播
- <receiver android:name=".widget.MyWidget"
- android:label="@string/widget_text"
- android:icon="@drawable/icon">
- <intent-filter>
- <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
- <action android:name="com.android.CLICK"></action>
- </intent-filter>
- <meta-data android:name="android.appwidget.provider" android:resource="@xml/appwidget_info" />
- </receiver>
复制代码
注册好了以后,就要在你的AppWidgetProvider的onReceive方法中对齐进行捕获。
- @Override
- public void onReceive(Context context, Intent intent) {
- super.onReceive(context, intent);
- Log.i("a", "onReceive");
- if(intent.getAction().equals("com.android.CLICK")){
- Log.i("a", "ok,捕获到了这个广播");
- }
- }
复制代码
仅仅是捕获到广播,还没完,因为我们还有一个目的,是要更新widget。所以在if语句中写入如下代码:
- RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.main_widget);
- views.setTextViewText(R.id.widget_Message, showMsg);
- AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
- appWidgetManager.updateAppWidget(new ComponentName(context, PetWidget.class), views);
复制代码
好了,打完-收功。 |
转载于:https://blog.51cto.com/bingking/962207