1.在清单文件中声明Widget,由于widget是基于广播的所以标签名为receiver:
// 为每一个widget执行这个循环,通过PendingIntent给widget绑定延期意图点击事件
for ( int i = 0; i <N; i ++) {
int appWidgetId = appWidgetIds[i];
//创建一个intent用来加载一个activity.
Intent intent = new Intent(context, ExampleActivity. class);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
// 得到widget的布局给他绑定一个点击事件到它的按钮上.
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.appwidget_provider_layout);
views.setOnClickPendingIntent(R.id.button, pendingIntent);
// 告诉AppWidgetManager来更新当前的widget
appWidgetManager.updateAppWidget(appWidgetId, views);
}
}
}
<receiver android
:name
=
"com.example.mobilesafe.widget.ClearWidget"
>
<intent -filter >
<action android :name = "android.appwidget.action.APPWIDGET_UPDATE" / >
< /intent -filter >
<meta -data
android :name = "android.appwidget.provider"
android:resource="@xml/clear_widget" />
< / receiver >
<intent -filter >
<action android :name = "android.appwidget.action.APPWIDGET_UPDATE" / >
< /intent -filter >
<meta -data
android :name = "android.appwidget.provider"
android:resource="@xml/clear_widget" />
< / receiver >
2.在res/xml文件夹下创建一个xml文件,用来定义widget的一些特性:
<?xml version=
"1.0" encoding=
"utf-8"?>
<appwidget-provider xmlns:android= "http://schemas.android.com/apk/res/android"
android:minWidth= "294dp"
android:minHeight= "72dp"
android:updatePeriodMillis= "0"
android:initialLayout= "@layout/process_widget"
android:resizeMode= "horizontal|vertical">
</appwidget-provider>
<!-- minWidth 最小的宽度
minHeight 最小的高度
updatePeriodMillis 更新间隔时间 要求不能小于30分钟 15分钟
previewImage 预览的图标 没有默认采用程序的图标
initialLayout 布局
resizeMode 压缩方式
-->
<appwidget-provider xmlns:android= "http://schemas.android.com/apk/res/android"
android:minWidth= "294dp"
android:minHeight= "72dp"
android:updatePeriodMillis= "0"
android:initialLayout= "@layout/process_widget"
android:resizeMode= "horizontal|vertical">
</appwidget-provider>
<!-- minWidth 最小的宽度
minHeight 最小的高度
updatePeriodMillis 更新间隔时间 要求不能小于30分钟 15分钟
previewImage 预览的图标 没有默认采用程序的图标
initialLayout 布局
resizeMode 压缩方式
-->
3.写一个widget的布局文件,注意:widget只支持一些特定的控件,当布局中有不支持的控件时,widget无法正确显示在界面上.
<?xml version=
"1.0" encoding=
"utf-8"?>
<LinearLayout xmlns:android= "http://schemas.android.com/apk/res/android"
android:layout_width= "fill_parent"
android:layout_height= "wrap_content"
android: background= "@drawable/widget_bg_portrait"
android:gravity= "center_vertical" >
<LinearLayout
android:layout_width= "0.0dip"
android:layout_height= "fill_parent"
android:layout_marginLeft= "5.0dip"
android:layout_weight= "1.0"
android: background= "@drawable/widget_bg_portrait_child"
android:gravity= "center_vertical"
android:orientation= "vertical"
android:paddingBottom= "3.0dip"
android:paddingTop= "3.0dip" >
<TextView
android: id= "@+id/tv_clear_process_count"
android:layout_width= "wrap_content"
android:layout_height= "wrap_content"
android:layout_marginLeft= "10.0dip"
android:singleLine= "true"
android: text= "我是widget"
android:textAppearance= "@style/widget_text" />
</LinearLayout>
</LinearLayout>
<LinearLayout xmlns:android= "http://schemas.android.com/apk/res/android"
android:layout_width= "fill_parent"
android:layout_height= "wrap_content"
android: background= "@drawable/widget_bg_portrait"
android:gravity= "center_vertical" >
<LinearLayout
android:layout_width= "0.0dip"
android:layout_height= "fill_parent"
android:layout_marginLeft= "5.0dip"
android:layout_weight= "1.0"
android: background= "@drawable/widget_bg_portrait_child"
android:gravity= "center_vertical"
android:orientation= "vertical"
android:paddingBottom= "3.0dip"
android:paddingTop= "3.0dip" >
<TextView
android: id= "@+id/tv_clear_process_count"
android:layout_width= "wrap_content"
android:layout_height= "wrap_content"
android:layout_marginLeft= "10.0dip"
android:singleLine= "true"
android: text= "我是widget"
android:textAppearance= "@style/widget_text" />
</LinearLayout>
</LinearLayout>
4.创建一个类,继承AppWidgetProvider(这个类就是Widget):
public
class ExampleAppWidgetProvider
extends AppWidgetProvider {
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
//以下代码是用来给widget绑定事件的,可以不写.
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
//以下代码是用来给widget绑定事件的,可以不写.
final
int
N
=
appWidgetIds.length;
// 为每一个widget执行这个循环,通过PendingIntent给widget绑定延期意图点击事件
for ( int i = 0; i <N; i ++) {
int appWidgetId = appWidgetIds[i];
//创建一个intent用来加载一个activity.
Intent intent = new Intent(context, ExampleActivity. class);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
// 得到widget的布局给他绑定一个点击事件到它的按钮上.
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.appwidget_provider_layout);
views.setOnClickPendingIntent(R.id.button, pendingIntent);
// 告诉AppWidgetManager来更新当前的widget
appWidgetManager.updateAppWidget(appWidgetId, views);
}
}
}
5.widget默认最低刷新间隔为30分钟,如果想要提高刷新速率,可以写一个service来不断的刷新widget的界面.