实验目的
- 复习 Broadcast 编程基础。
- 复习动态注册 Broadcast 和静态注册 Broadcast 。
- 掌握 AppWidget 编程基础。
先上效果图

创建一个AppWidget
File -> New -> Widget -> AppWidget
自定义命名,我命名为MyWidget

就会多出三个文件

my_widget_info.xml这是小部件的一些属性设置
1 | <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" |
my_widget.xml这是小部件的外观
1 | <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" |
下面就主要处理好AppWidgetProvider中的这些方法了

通过静态广播更新
静态比较好理解,就是直接把管理Widget的java类放进Android的manifest配置文件中,以后有什么需要更新的就去找这个类
打开AndroidManifest.xml,添加
1 | <receiver android:name=".MyWidget"> |
为了让小部件显示“当前没有任何信息”,修改MyWidget.java,添加
1 | static void updateAppWidget(Context context, AppWidgetManager appWidgetManager, |
为了让SecondActivity一打开就会在更新小部件,显示“今日推荐 xxx”,打开SecondActivity.java,添加
1 |
|
因为
SecondActivity设置了单例模式,所以在onCreate发送广播不一定成功,而每次唤醒这个Activity时onStart()总是被调用
然后处理接收广播的事件,打开MyWidget.java,添加
1 |
|
就可以实现点击小部件跳转到Detail详情页面了,其中的数据传送跟之前的差不多,都是通过Intent中的Bundle
通过动态广播更新
本来我是打算学动态广播的办法,新创建一个java类在代码中动态注册,确实那么做了,但是一直没有效果,想了想,如果新建一个继承AppWidgetProvider的话,又要写onUpdate,onReceive等方法,如果在多写几个这样的类,岂不是乱套了,通知该由谁接收?
仔细一想之后,还是放在之前的DynamicReceiver里面吧,毕竟只要处理一下显示和pendingIntent就好了
所以,打开DynamicReceiver.java文件,在if语句后面添加
1 | //if(....) |
上面是处理了点击收藏按钮之后Widget的更新
现在在Detail.java里面添加注册动态广播
1 | //注册广播 |
并在收藏按钮的点击事件中添加
1 | collect.setOnClickListener(new View.OnClickListener() { |
笔记
上次把动态广播取消注册放在了OnPause里面,然后运行的时候抛出了异常
1 | java.lang.RuntimeException: Unable to pause activity {com.janking.sysuhealth.DetailActivity}: java.lang.IllegalArgumentException: Receiver not registered |
参考了这篇博客(但其实情况不一样)
发现应该在onDestory里面取消注册,把onPause删了,然后像这样
1 |
|
完美!
好吧,其实不完美,Widget好多跳转来跳转去的复杂东西没有考虑好,就这样吧,核心功能实现了就好!