做需求中遇到AppWidget相关知识,所以学习了官方文档和网上中文材料,并简单学习做了一个相关的Demo。
- Widget了解
- Widget主要组件
- 创建自定义Widget
Widget了解
App Widget是应用程序窗口小部件(Widget)是微型的应用程序视图,它可以被嵌入到其它应用程序中(比如桌面)并接收周期性的更新。你可以通过一个App Widget Provider来发布一个Widget
Widget组成
AppWidgetProviderInfo
描述一个App Widget元数据,比如App Widget的布局,更新频率,这个应该在XML里定义AppWidgetProvider
Android中提供的用于实现桌面小工具的类,其本质是一个广播,即BroadcastReceiver,用它来管理widget接收到广播后做出对应的响应处理widget_layout
用来设置widget的相关布局,但是Widget并不支持所有的布局和控件,这点需要注意。
创建一个Widget
建立一个Widget示例,要求Widget能被添加到主屏中,widget包含3个成分:文本、按钮和图片。文本要求:显示提示信息;按钮要求:点击按钮,弹出一个Toast提示框;图片要求:每个5秒随机更新一张图片
1.在修改Manifest中配置,在Manifest中注册AppWidgetProvider和负责发送更新图片广播的Service
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<!-- 声明widget对应的AppWidgetProvider -->
<receiver android:name=".ExampleAppWidgetProvider" >
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
<action android:name="com.leeds.widget.UPDATE_ALL"/>
</intent-filter>
<meta-data android:name="android.appwidget.provider"
android:resource="@xml/example_appwidget_info" />
</receiver>
<service android:name=".ExampleAppWidgetService" >
<intent-filter>
<action android:name="android.appwidget.action.EXAMPLE_APP_WIDGET_SERVICE" />
</intent-filter>
</service>
</application>
android.appwidget.action.APPWIDGET_UPDATE,必须要显示声明的action!因为所有的widget的广播都是通过它来发送的;要接收widget的添加、删除等广播,就必须包含它。
com.leeds.widget.UPDATE_ALL,是自定义的action,是为了接收服务所发送的更新图片的广播。
ExampleAppWidgetService 是用于更新widget中的图片的服务。
android.appwidget.action.EXAMPLE_APP_WIDGET_SERVICE 用于启动服务的action
2.编辑AppWidgetProviderInfo对应的资源文件
<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:minWidth="180dp"
android:minHeight="180dp"
android:previewImage="@mipmap/ic_note"
android:initialLayout="@layout/activity_main"
android:resizeMode="horizontal|vertical"
android:widgetCategory="home_screen