因为仿制的一个项目中需要实现一个AppWidget,就去学习了Widget是怎么实现的,总结起来其实也很简单。
实现AppWidget的步骤有三:
1.在Manifest文件中注册你的AppWidgetProvider类
2.定义AppWidgetInfo(即widget的ui界面)。在xml中定义。
3.实现你的AppWidgetProvider类。
步骤解析:
1.在Manifest文件中注册你的AppWidgetProvider类
<receiver
android:name="DemoAppWidgetProvider">
<intent-filter >
<action android:name="android.appwidget.action.APPWIDGET_UPDATE"/>
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/demo_appwidget_info"
/>
</receiver>
provider
实际上是一个broadcast接收器,根据接收器的特性,它必须要注册。
属性解析:
1、receiver里的name属性:你的AppWidgetProvider的名称。
2、intent-filter里的action 显式声明接受action,这个APPWIDGET_UPDATE也是唯一一个必须要显式声明的intent-filter。别的actino当你要用到的时候才要声明。
3、meta-data的resource属性指明了widget的info的源。
2.定义AppWidgetInfo(即widget的ui界面)。在xml中定义。
demo_appwidget_info.xml:
<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:minWidth="250dp"
android:minHeight="40dp"
android:initialLayout="@layout/widget_4x1"
></appwidget-provider>
layout/widget_4x1.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="@dimen/widget_horizontal_padding"
android:paddingRight="@dimen/widget_horizontal_padding"
android:paddingTop="@dimen/widget_vertical_padding"
android:paddingBottom="@dimen/widget_vertical_padding"
android:orientation="horizontal" >
<Button
android:id="@+id/button"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="DemoWidget" />
</LinearLayout>
minWidth和minHeight属性指定widget的默认最小尺寸。主屏幕放置widget是基于一个个有默认长和宽的小单元(你在安排放置你手机上的应用图标能看到)。如果widget的最小宽度或高度值与小单元不匹配,widget的尺寸会调整到最接近的单元尺寸。
(详细的Widget的UI设计请点击这里进行查阅)
initialLayout属性指向定义了widget布局的布局资源。
updatePeriodMillis属性指定了Widget更新的时间间隔(本例不用)
configure属性定义了当用户添加widget时启动的activity,为了让他(她)来配置widget的属性。这是可选的(本例不用)
还有别的一些包括定义为锁屏显式的widget还是主页显式的widget等。更多属性,请点击这里。
3.通过继承AppWidgetProvider定义自己的WidgetProvider。
package com.example.appwidgetdemo;
import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.widget.RemoteViews;
public class DemoAppWidgetProvider extends AppWidgetProvider {
/* 当到达更新周期时间的时候和初次添加该空间的时候(如果该widget含有configure Activity的时候除外)系统会调用该方法更新Widget*/
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds) {
final int N = appWidgetIds.length;
for (int i = 0; i < N; i++) {
int appWidgetId = appWidgetIds[i];
Intent intent = new Intent(context, MainActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0,
intent, 0);
RemoteViews views = new RemoteViews(context.getPackageName(),
R.layout.widget_4x1);
views.setOnClickPendingIntent(R.id.button, pendingIntent);
appWidgetManager.updateAppWidget(appWidgetId, views);
}
}
/*
* 当Widget被初次放置在屏幕上或者每当Widget的显示大小被更改的时候调用
* */
@Override
public void onAppWidgetOptionsChanged(Context context,
AppWidgetManager appWidgetManager, int appWidgetId,
Bundle newOptions) {
super.onAppWidgetOptionsChanged(context, appWidgetManager, appWidgetId,
newOptions);
}
/*当Widget被移除的时候调用*/
@Override
public void onDeleted(Context context, int[] appWidgetIds) {
super.onDeleted(context, appWidgetIds);
}
/*当屏幕上最后一个Widget被移除的时候调用*/
@Override
public void onDisabled(Context context) {
super.onDisabled(context);
}
/*当该Widget的一个实例被创建的时候(当屏幕上被放置了多个本Widget,该方法只会调用一次*/
@Override
public void onEnabled(Context context) {
super.onEnabled(context);
}
}
本例只是简单的实现了按Widget进入MainActivity的功能。只为示例。