同事QJL找的,还没看

 

 

widget的使用

1、自定义widget必须继承AppWidgetProvider

2、AndroidManifest.xml中必须注册

<receiver android:name=".widget.AppWidget" >
            <meta-data
                android:name="android.appwidget.provider"
                android:resource="@xml/guide_widget" />

            <intent-filter>
                <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
            </intent-filter>
        </receiver>

(1)receiver的name必须为自定义widget类名

(2)meta-data的name必须为android.appwidget.provider 

(3)meta-data 的resource为该widget的描述文件,该文件必须放在res/xml路径下

(4)需要添加action增加监听receiver种类android.appwidget.action.APPWIDGET_UPDATE

3、 res/xml

<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:initialLayout="@layout/guide_widget"
    android:minHeight="294.0dip"
    android:minWidth="294.0dip"
    android:updatePeriodMillis="1801000" />


(1)最外层标签必须为appwidget-provider

(2) android:initialLayout指定了widget使用的布局文件

(3)android:minHeight指定了widget的高度,android:minWidth指定了widget的宽度。这两个数值不能随意指定,最好根据需要放置的widget所占据的屏幕行列数设定。例如,某widget为3行2列,则minHeight应为(3*74)-2=220,minWidth应为(2*74)-2=146

(4)android:updatePeriodMillis该值为widget刷新时间,最好设置1小时以上,否则会严重浪费系统资源,耗电量会很大。每隔固定的该时间,系统就会调用该widget的onUpdate方法,如果该值为0,则表示不更新widget

4、widget继承自父类方法

(1)onEnabled(Context context)

该方法只会在程序被安装到手机后调用一次,因此可以在里面执行一些初始化

(2)onUpdate(Context context, AppWidgetManager 

appWidgetManager,int[] appWidgetIds)

该方法会在用户添加widget后调用;另外在程序被安装后,也会调用一次,用来刷新界面已经安装的widget(在onEnabled之后调用)。

appWidgetManager参数用来执行刷新界面的操作

appWidgetIds是该应用程序所有widget的id(用户可能添加多个,因此此处为数组)

(3)onDeleted(Context context, int[] appWidgetIds)

该方法会在widget被删除后调用(注意,是删除后,也就是说,该方法不是执行删除动作的)

(4)onReceive(Context context, Intent intent)

该方法是继承自receiver的,尽量不要使用,如果要使用,就需要你自己处理一些特殊代码,否则widget就会出问题

5、界面widget的刷新及点击事件

(1)在widget中,不能再使用findviewbyid方法获取组件,需要使用其他的方式。RemoteViews rv = new RemoteViews(context.getPackageName(),

R.layout.guide_widget);

RemoteViews 是一个虚构的组件,用它来承载layout。

(2) 点击layout中的某个组件启动activity或service

Intent intent = new Intent(context, WidgetDemoActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
rv.setOnClickPendingIntent(R.id.guide_0, pendingIntent);

(3) 界面刷新

appWidgetManager.updateAppWidget(appWidgetId, rv);

6、 widget支持在layout中使用的组件

FrameLayout、LinearLayout、RelativeLayout
AnalogClock、Button、Chronometer、ImageButton、ImageView、ProgressBar、TextView

7、 自定义widget类完整代码

public class AppWidget extends AppWidgetProvider {
RemoteViews rv;

@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds) {
System.out.println(context.getPackageName());
final int N = appWidgetIds.length;
// 因为有可能用户添加了多个窗口小部件,所以这里需要遍历appWidgetIds
for (int i = 0; i < N; i++) {
System.out.println(appWidgetIds[i]);
int appWidgetId = appWidgetIds[i];
rv = new RemoteViews(context.getPackageName(),
R.layout.guide_widget);
Intent intent = new Intent(context, WidgetDemoActivity.class);
intent.setAction(context.getPackageName() + appWidgetId);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0,
intent, 0);
rv.setOnClickPendingIntent(R.id.guide_0, pendingIntent);
appWidgetManager.updateAppWidget(appWidgetId, rv);
}
super.onUpdate(context, appWidgetManager, appWidgetIds);
}
}


转载于:https://blog.51cto.com/3387980/936432