1. 什么是AppWidget
Android系统允许某个应用把它自己的控件嵌入到其它的应用之中,这些被嵌入的控件就是”widget”,发布控件的应用是”:appwidget providers”,而合成控件并显示的应用是”AppWidget host”.
widget常被译作小应用,小控件,小部件。最常见的widget是显示在桌面上时钟,日历,搜索,相框,音乐等,使用户不用进入应用,就可以方便地使用某种功能。桌面也是一个应用程序(packages/apps/Launcher),代码中实现了”AppWidget host”,而时钟,日历是分别实现了不同功能的”appwidget provider”(packages/apps/Calendar)
2. 建立第一个AppWidget
长篇大论不如立竿见影地看到效果,用以下方法,建立你的第一个widget
$ cd $ANDROID_SRC/development
$ cp $ANDROID_SRC/frameworks/base/tests/appwidgets/AppWidgetProviderTest MyWidget -R
$ cd MyWidget
$ mm
$ adb install $ANDROID_SRC/out/target/product/qsd8250_surf/system/app/AppWidgetProvider.apk
注意:
1) android 2.1因为加载widget时需要提供的图标和文字,而此例中没有,所以会在加载小控件时报错,需要修改AndroidManifest.xml如下:
把改为
并在drawable下放icon.png,作为出现在小控件列表中的图标
2) 不能全部ANDROID代码一起编,否则会因为类重名而报错
只编此项目没有问题,把文件名,目录名,类名等都改成你定义的名字即可全编
3. 代码分析
1) AndroidManifest.xml
主要描述由哪个AppWidgetProvider提供Widget,最好在其中加入图标和名字,以免android 2.0以上系统中出问题
2) Android.mk
编译规则
3) src/com/android/tests/appwidgetprovider/TestAppWidgetProvider.java
实现AppWidgetProvider(继承自BroadcastReceiver)或BroadcastReceiver,在AppWidget应用update, enable, disable和deleted时接受通知。其中onUpdate()(或onReceive()中的UPDATE部分)最重要的方法,由它接受通知并更新,一般实现如下:
ComponentName thisWidget = new ComponentName(context, MyProvider.class);
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
RemoteView views = new RemoteViews(context.getPackageNmae(), R.layout.provider) // 设定布局;
appWidgetManager.updateAppWidget(thisWidget, views); // 请求widgethost刷新
真正的刷新在widgethost所在应用中实现(AppWidgetHostView.updateAppWidget()),即在widgetprovider中只做描述,而在widgethost中把描述的资源inflate成为真正控件。
4) res/xml/appwidget_info.xml
AppWidgetProviderInfo: 描述AppWidget的大小,更新频率和初始界面等信息,注意Android 1.6版本对更新频率支持有问题。
5) res/layout/xxxx.xml
widget的布局文件
6) res/values/strings.xml
widget中使用到的字串
4. 说明
1) 设置界面
有时需要设置界面(configure activity)在第一次运行前被调出,用于设置AppWidget,它在res/xml/xxx.xml中设定,示例代码见:
$ANDROID_SRC/development/samples/ApiDemos/src/com/example/android/apis/appwidget/
5. 参考代码
1) 从market下了几个电量显示控件,觉得不是太大就是太小,太难看,要不就是更新有问题……,于是做了一个Widget,截取了iphone的电池控件图标,大小与icon一致,仅供学习参考,代码及apk下载地址:
http://cid-f8aecd2a067a6b17.skydrive.live.com/self.aspx/.Public/android/widget^_demo.zip