




已阅读5页,还剩27页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
桌面组件之Widget 讲解人:杨培栋 时间:2010-06-24 常见桌面组件介绍 桌面组件: 第一次启动android模拟器时,很多的图标如:Google搜索栏、联系人、 浏览器等都是桌面组件。它们和pc机上的桌面快捷方式很像,但它们不全是 快捷方式,还包括实时文件夹(LiveFolder)和桌面插件(appwidget)。 快捷方式 Android快捷方式和pc上快捷方式一样,用以启动对应应用。 实时文件夹(Live Folder) 实时文件夹非常类似快捷方式,但是它提供拉应用的实时更新功能。 如:联系人信息实时文件夹、电子邮件实时文件夹。 Appwidget Appwidget主要应用在web2.0服务或互联网内容前端。自android1.5版本中加 入Appwidget开发框架后无疑使Appwidget开发成为此版本开发的一个重要的 亮点。 第一节 快捷方式 1.1启用方法: 添加快捷方式的方法是非常简单的。在android桌面空白处长按桌面或 “Menu” 上长按弹出桌面组件选项( Menu先选择Add) 。选择“Shortcuts”,进入对应选项 可添加快捷方式。 1.2开发流程: a 在Activity注册时添加一个Action为ent.action.CREATE_SHORTCUT的 IntentFilter b 为快捷方式设置名称、图标、事件等属性。 Intent.EXTRA_SHORTCUT_NAME对 应快捷方式名字; Intent.EXTRA_SHORTCUT_ICON_RESOURCE对应快捷方式图标; Intent.EXTRA_SHORTCUT_INTENT为快捷方式事件。 注意: Android提供Intent.ShortcutIconResource.fromContext专门为快捷方式提供图标。 第二节 实时文件夹(Live Folder) 2.1 启用方法 和启用快捷方式的方法类似,在弹出的桌面组件中选择Folders,再选择需要添 加的Live Folders。 2.2 开发流程 a 在Activity注册时加入Action动作为ent.action.CREATE_LIVE_FOLDER的 IntentFilter。 b 设置数据源intent.setData()方法来设置要读取的数据源。 c 设置显示图标和名字等信息 LiveFolders.EXTRA_LIVE_FOLDER_NAME :设置名称 LiveFolders.EXTRA_LIVE_FOLDER_ICON :设置图标 2.3 LiveFolders常用属性 属性描述 EXTRA_LIVE_FOLDER_BASE_INTENT选中选项执 行事件 EXTRA_LIVE_FOLDER_DISPLAY_MODE显示模式(表格和宫格) EXTRA_LIVE_FOLDER_ICON名称 EXTRA_LIVE_FOLDER_NAME图标 2.4 Live Folders实现实时显示内容原理 Live Folders本身并不储存任何信息,它是以映射 的方式查看其ContentPrivider所指向的数据,并 自定义拉显示格式,所以当原数据改变后, Live Folders可以实时更新内容。因此我们要确保指定 数据信息URI的ContentPrivider支持实时文件夹 的查询。 建Android工程 注册时加入action 返回Home程序 LiveFolders应加入数据源 ,显示格式,事件 设置图标,名称 图1 快捷方式和实时文件夹开发流程 第三节 Widget开发 Widget概述 每个Widget就是一个BroadcastReceiver,它们用XML metadata 来描述Widget的细 节。AppWidget framework 通过Broadcast intents和 Widget通信,Widget的更新 使用RemoteViews来发送。RemoteViews被包装成一个Layout和特定内容来显示到 桌面上。 Widget举例 时钟程序:添加时钟Widget 显示实时的时间信息 日历: 显示当天的日期 天气预报: 显示当日天气 股市信息: 股票信息图 音乐播放器:播放后台音乐 3.1 开发前需要了解的基础知识 1AppWidget 和 Android.Widget AppWidget是桌面组件的一部分,是Home的一个插件。 Android.Widget是 Android控件的聚合包,它提供Android常用的控件如:TextView,Button, EditText。 AppWidget通过继承Appwidgetprovider实现控制,而Appwidgetprovider 是继 承BroadcastReceiver的,因此AppWidget是一个特殊的BroadcastReceiver。 2它是Appwidget,它不是我们平常所用的Activity 也就是说,很多适用于Activity的东西,Appwidget绝大多数都无法使用。 我们最常用的获取控件Id的方式,就是findviewbyid()。 Appwidget不支持这 种方法!而这个方法很重要,没了它很多东西基本上就类似判了死刑。 点菜 交给后厨处理 服 务 生 老板 处 理 图 2 一般应用处理 UI .java 后台 代 码 用 户 图 3 对应程序设计 Widget处理 点菜 交给后厨处理 服 务 生 老板 处 理 图 4 widget处理 解决方法: 使用RemoteViews RemoteViews类描述了一个View对象能够显示在 其他进程中,可以融合从一个 layout资源文件实现布 局。虽然该类在android.widget.RemoteViews而不是 appWidget下面但在Android Widgets开发中会经常用 到它,主要是可以跨进程调用(appWidget由一个服务 宿主来统一运行的)。 详见: /androidkaifa/320.html 3.2 widget艺术设计标准: 典型的android widget由三个部分组成:一个bounding box (包围盒),一 个frame(边框),还有widget的部分图形控件和其它部分。精心设计的 widget,填充在bounding Box和frame的边缘,还有些填充在frame边缘和 widget控制的内部。widget的设计,在主屏幕视觉上要适应其他widget,与 其它元素进行调整;也使用一些标准阴影效果。横向(320*480) 3.3 Widget标准尺寸 有六种标准widget尺寸,基于网格的主屏幕4 4 (人像)或4 4 ( 景观)单元格。这些外形尺寸是六个标准widget尺寸的bounding boxes。典型的 widget内容不画出返些尺寸的封装条,但适合一个在bounding box里面的frame 。 在纵向,每个单元格是80像素(pixels)宽100像素(pixels)高 分别为: 4*1 3*3 2*2 在横向,每个单元格是106像素(pixels)宽74像素(pixels)高 分别为: 4*1 3*3 2*2 横向: 3.4 Widget框架 3.4.1 AppWidget框架 AppWidget是Android 1.5平台推出的一种崭新的应用程序框架。基于该框架 ,开发者可以在Android及模拟器上开发“外形”类似传统Widget的小应用程序 ,并将其嵌入到其他应用中。一个最典型的应用场景就是在主屏上灵活的添加 ,拖动和删除AppWidget应用。 3.4.2 AppWidget应用框架中,常用的几个类如下: AppWidgetProvider: 继承自BroadcastReceiver,在AppWidget应用update, enable, disable和deleted时接受通知。其中,onUpdate,onReceive是最常用到的方法, 它们接受更新通知。 AppWidgetProviderInfo: 描述AppWidget的大小,更新频率和初始界面等信息。以 XML文件形式存在于应用的res/xml/目录下。 AppWidgetManager: 负责管理AppWidget, 向AppWidgetProvider发送通知 RemoteViews: 一个可以在其他应用进程中运行的类,是构造AppWidget的核心。 目前, Android平台上的RemoteViews支持的布局(Layout)类暂时只有Frame- Layout, LinearLayout和RelativeLayout,并且不支持自定义类。 3.4.3 AppWidgetProvider类的几个方法 AppWidgetProvider类继承BroadcastReceiver作为一个 便捷类来捕获App Widget广播(broadcasts). AppWidgetProvider只接收于这个App Widget有关的事件广 播(event broadcasts),例如当该App Widget被更新、删除、启用或禁用。当这些广 播事件发生,AppWidgetProvider进行以下方法调用: onUpdate(Context, AppWidgetManager, int) 这个方法在AppWidgetProviderInfo中的属性updatePeriodMillis定义的时间 间隔被调用来更新App Widget。该方法当用户添加返个App Widget时也被调用, 因此,它应履行基本设置,例如为Views定义事件捕捉器(event handlers),如果必要 并启动一个临时的Service。 然而,如果你已经声明了一个配置Activity, 当用户添 加该App Widget时此方法不会被调用,但是随后的更新时会被调用。当配置完成 时,配置Activitiy(configuration Activity)的任务是执行第一次更新。 onDeleted(Context, int) 当一个App Widget自App Widget host中被删除,这个方法每次被调用. onEnabled(Context) 当一个实例 App Widget首次被创建时,这个方法被调用。例如,如果用户添加你 的两个App Widget实例,这个方法只在第一次被调用。如果你需要开启一个新的 数据库或是执行其他对于所有 App Widget 实例只需要发生一次的安装,那这个方 法中是一个很好的地方来做这个事情。 onDisabled(Context) 当你的最后一个App Widget实例被在App Widget host中删除时,此方法被调用。返 是你应该清理任何在onEnabled(Context)中做的事情,例如删除一个临时的数据库。 onReceive(Context, Intent) 每一个广播此方法都被调用,并且先于以上回调方法。你一般不需要实现此方法 ,因为默认的AppWidgetProvider 实例过滤所有的App Widget broadcasts 并且在适 当时调用以上方法。一个可以捕捉其他App Widgets的应用程序组件被叫做App Widget host。 3.5 AppWidget 的布局 创建App Widget布局你必须在XML中为你的App Widget定义一个初始布局并且把它 保存在工程的res/layout/目录。你可以使用以下列出的View对象来设计你的App Widget。 如果你熟悉在XML中声明布局,那创建App Widget布局很简单. 然而,你必须意识 到App Widget布局基于RemoteViews,它不支持所有种类的布局Layout或是view widget。 一个RemoteViews对象(并且, 必然地,一个App Widget)能支持以下布局 Layout 类 : FrameLayout LinearLayout RelativeLayout 和以下 widget 类: AnalogClock Button Chronometer ImageButton ImageView ProgressBar TextView 3.6 AppWidgetHost 和 AppwidgetProvider AppWidget 允许应用向别的应用提供一个可视的小部件(widget),本质上是一个 BrodaReceiver,接受系统广播的APPWIDGET_CONFIGURE, APPWIDGET_DELETED, APPWIDGET_UPDATE,APPWIDGET_DISABLED,APPWIDGET_ENABLED,APPWIDGET_PICK 消息做相应的回应,以更新所提供小部件的参数,包括但不限于小部件外形,对单 击事件的回应。 AppWidgetHost APPWIDGET_CONFIGURE AppwidgetProvider APPWIDGET_UPDATE AppWidgetManager.upateViews() APPWIDGET_ENABLED AppWidgetManager.upateViews() 通常我们要响应的动作是APPWIDGET_UPDATE 图 5 。 3.7 App Wiget生命周期 首次添加Widget到桌面: 1 public void onEnabled(Context context) 2 public void onReceive(Context context, Intent intent) 3 public void onUpdate(Context context, AppWidgetManager appWidgetManager, int appWidgetIds) 第二次再加入Widget到桌面 调用过程: 1public void onUpdate(Context context, AppWidgetManager appWidgetManager, int appWidgetIds) 2public void onReceive(Context context, Intent intent) 删除多个桌面Widget 中的一个 调用过程: 删除多个桌面Widget中的最后一个 过程调用 : 1public void onReceive(Context context, Intent intent) 1public void onReceive(Context context, Intent intent) 2public void onDisabled(Context context) 3public void onReceive(Context context, Intent intent) 3.8 Widget开发步骤 步骤1:实现appwidget的layout 在android上编程的人都知道,android的界面离不开layout,appwidget也 不例外。建立appwidgetlayout的方式与建立其他layout的方式相同。在 reslayout目录中建立一个firstappwidget.xml文件,代码如下: 步骤2:编写AppWidgetProvider类 appwidget需要一个AppWidgetProvider类的子类,该类的代码如下: public class TestWidget extends AppWidgetProvider public void onUpdate(Context context, AppWidgetManager appWidgetManager, int appWidgetIds) final int N = appWidgetIds.length; for (int i = 0; i 元素 appwidget还需要一个元素来描述appwidget的大小、布 局、更新频率等信息。在res目录下建立一个xml目录,在resxml目录下建立一个 appwidget_provider.xml,并输入如下的代码: android:minWidth=“220dip“ android:minHeight=“30dip“ android:updatePeriodMillis=“500“ android:initialLayout=“layout/firstappwidget“/ 备注: AppWidget的像素大小取决于它所占的方块多少,其计算公式是 (块数 * 74) 2,因此,我们取高度是30像素,宽度220像素(H 0.5Cell,W 3Cell)。android:initialLayout设置了AppWidget的布局文件是 mywidget_frame.xml。 步骤4:配置清单文件 appwidget需要在AndroidManifest.xml文件中配置receiver,从这一点可以 看出,android是通过Broadcast来通知每一个appwidget的。 AndroidManifest.xml文件的配置主要代码如下: 在上面的配置代码中使用元素的子元素来指定appwidget 接收的动作。使用元素指定appwidget的layout。 3.9 Widget和activity通信 3.9.1 如何开启Activity 首先,在OnUpdate()方法定义一个Intent,用来开启Activity 的Intent。 Intent startActivityIntent=new Intent(context ,WidgetLife.class); 第一个参数上下文,第二个参数要开启的Activity类 用该Intent实例化一个PendingIntent PendingIntent Pintent = PendingIntent.getActivity(context, 0, startActivityIntent, 0); 实例化RemoteView,其对应相应的Widget布局 RemoteViews ActivityView= new RemoteViews( context.getPackageName(), R.layout.widget_layout); 给RemoteView上的Button设置按钮事件 ActivityView.setOnClickPendingIntent(R.id.Button, Pintent); 更新Widget appWidgetManager.updateAppWidget(appWidgetIds, ActivityView); 3.10 Widget和Service通信 3.10.1 如何开启Service 首先,在OnUpdate()方法定义一个Intent,用来开启Service的Intent Intent startServiceInten=new Intent(“zyf.temp.Service.START“); 参数是一个开启Service的动作 用该Intent实例化一个PendingIntent PendingIntent Pintent= PendingIntent.getService(context, 0, startServiceInten, 0); 实例化RemoteView,其对应相应的Widget布局 RemoteViews ServiceView= new RemoteViews(context.getPackageName(), R.layout.widget_layout); 给RemoteView上的ImageButton设置按钮事件 ActivityView.setOnClickPendingIntent(R.id.ImageButton, Pintent); 更新Widget appWidgetManager.upd
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年哈尔滨市急救中心编制外合同制工作人员招聘5人考前自测高频考点模拟试题完整参考答案详解
- 2025年滁州职业技术学院公开招聘工作人员56人考前自测高频考点模拟试题完整参考答案详解
- 2025湖北恩施市福牛物业有限公司招聘恩施市公路事业发展中心工作人员4人模拟试卷及答案详解(历年真题)
- 2025贵州铜仁市石阡县参加第十三届贵州人才博览会引进事业单位高层次及急需紧缺人才26人考前自测高频考点模拟试题附答案详解(典型题)
- 2025湖南娄底市冷水江市城发实业有限公司招聘实验室试验员3人考前自测高频考点模拟试题及完整答案详解
- 2025年六安市人民医院公开招聘69人模拟试卷完整参考答案详解
- 闲鱼酒店协议书
- 协议书源代码
- 委托建房协议书范本
- 2025年福建省儿童医院招聘6人模拟试卷及参考答案详解一套
- 隧道施工应急预案方案
- 植物鉴赏课件
- 安徽省华师联盟2026届高三上学期9月开学质量检测物理试卷(含答案)
- 肿瘤热疗中国专家共识
- 2025年甘肃省药品检查员资格考试(药械化流通)历年参考题库含答案详解(5套)
- 2025年泸州职业技术学院招聘考试笔试试卷【附答案】
- 自来水企业内部管理规范
- 2025新热处理工程师考试试卷及答案
- 硬笔书法全册教案共20课时
- 工会兼职补助管理办法
- 纸箱不合格品管理制度
评论
0/150
提交评论