android应用开发(十):widget的使用

本文详细介绍了Android平台上的Widget开发流程,包括自定义Widget的基本步骤、AndroidManifest.xml配置方法、Widget生命周期及其关键方法如onEnabled、onUpdate等的用途。此外还提供了完整的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 作者:近乎团队

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)


  该方法会在用户添加widget后调用


  (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);


  }


  }


  8、 widget生命周期(android1.6)


  (1) 当用户拖拽widget到界面时,会按照顺序分别调用如下几个方法:onReceive-onEnabled-onReceive-onUpdate-onReceive-onReceive


  (2) 当用户拖拽widget删除时,会按照顺序分别调用如下几个方法:


  onReceive-onDeleted-onReceive-onDisabled

更多详情:近乎sns开发分享社区

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值