应用:如桌面天气、桌面时钟、桌面音乐等等。被很多应用所采用。方便用户操作,更好的得到消息。如下图
你需要知道一下两个对象:
AppWidgetProviderInfo对象
描述了一个小部件的元数据,如小部件的布局,更新频率,和AppWidgetProvider类。这需要在XML中自定义。
AppWidgetProvider类的实现
自定义基本方法,允许你实现App Widget接口。基于广播事件。通过此方法,当Widget更新、启动、禁用和删除时,将接收到广播。
对于Widget小部件的界面通过自定义XML文件进行实现。
一、在App的AndroidManifest.xml对AppWidgetProvider类的声明
例如:
<receiver android:name="ExampleAppWidgetProvider" >
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data android:name="android.appwidget.provider"
android:resource="@xml/example_appwidget_info" />
</receiver>
The <receiver> element requires the android:name attribute, which specifies the AppWidgetProvider used by the App Widget.
The <intentfilter> element must include an <action> element with the android:name attribute. This attribute specifies that the AppWidgetProvider accepts the ACTION_APPWIDGET_UPDATE broadcast. This is the only broadcast that you must explicitly declare. The AppWidgetManager automatically sends all other App Widget broadcasts to the AppWidgetProvider as necessary.
The <meta-data> element specifies the AppWidgetProviderInfo resource and requires the following attributes:
android:name - 指定元数据名称。 使用android。 窗口小部件。数据提供程序确定为theAppWidgetProviderInfo描述符。
android:resource -指定AppWidgetProviderInfo的布局文件.xml
二、该AppWidgetProviderInfo定义了小部件的基本信息,如其最小尺寸布局,其初始布局资源时,小部件的更新频率,和(可选)创建时配置活动正在展开。AppWidgetProviderInfo对象定义在XML资源使用单个元素并将其保存在xml项目的res/xml/文件夹下。
例如:
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:minWidth="40dp"
android:minHeight="40dp"
android:updatePeriodMillis="86400000"
android:previewImage="@drawable/preview"
android:initialLayout="@layout/example_appwidget"
android:configure="com.example.android.ExampleAppWidgetConfigure"
android:resizeMode="horizontal|vertical"
android:widgetCategory="home_screen">
</appwidget-provider>
三、对widget布局文件xml的自定义,这里就不在阐述。
四、AppWidgetProvider类的实现,通过继承AppWidgetProvider进行实现,
例如:
public class ExampleAppWidgetProvider extends AppWidgetProvider {
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
final int N = appWidgetIds.length;
// Perform this loop procedure for each App Widget that belongs to this provider
for (int i=0; i<N; i++) {
int appWidgetId = appWidgetIds[i];
// Create an Intent to launch ExampleActivity
Intent intent = new Intent(context, ExampleActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
// Get the layout for the App Widget and attach an on-click listener
// to the button
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.appwidget_provider_layout);
views.setOnClickPendingIntent(R.id.button, pendingIntent);
// Tell the AppWidgetManager to perform an update on the current app widget
appWidgetManager.updateAppWidget(appWidgetId, views);
}
}
}
注意点:由于AppWidgetProvider是一个以广播的形式进行的,您的线程不能保证在该回调方法返回后,继续运行(见广播支持有关广播的信息生命周期)。
如果您的应用程序构件安装过程可能需要几秒钟(也许在执行web请求),并且需要您的流程仍在继续,考虑启动一个Service在onUpdate()方法中进行。从服务中,您可以执行您自己的小部件的更新,不用担心AppWidgetProvider关闭由于应用程序没有响应(ANR)错误。
五、接收Widget的广播
可以通过实现自己的BroadcastReceiver或者重写onReceiver(Context,Intent)返回,对于意图你需要关心如下:
· ACTION_APPWIDGET_UPDATE
· ACTION_APPWIDGET_DELETED
· ACTION_APPWIDGET_ENABLED
· ACTION_APPWIDGET_DISABLED
· ACTION_APPWIDGET_OPTIONS_CHANGED
具体实现可以参考以下widgetDemo示例:
点击打开链接
更多帮助可以参照google官方文档。