




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
详解从零开始创建Android主屏幕Widget创建Android主屏幕Widget是本文要介绍的内容,主要是来了解AndroidWidget的创建过程,文中很详细的讲解了AndroidWidget创建过程,一起来看本文详解。当最基本的控件,如Clock和PictureFrameHomeScreen,随有第一款Android手机的发布后,Android用户就开始尝试编写各种应用Widget(小工具)了,随着WidgetAPI的公开,为开发人员带来了全新有趣的开发模式,除了传统的电话应用外,还可以做其它方面的应用开发。开发人员可以使用WidgetAPI(包含在Androidl.5中,最新版本已经到Android2.0了)创建简单的控件,然后在新的Widget中显示和使用这些控件。本文向你介绍如何从零开始创建一个主屏幕应用Widget,通过使用AlarmManager接口,以用户设定的时间间隔更新图片。你将看到如何创建一个Widget,以及如何随机地从一组图片中选择一张图片显示,根据用户设定的时间间隔周期性改变显示的图片。创建一个简单的Widget包括以下几个步骤:1、 创建一个RemoteView,由它为Widget提供用户界面;2、 将RemoteView绑定一个Activity(行为)实现AppWidgetProvider接口;3、 在Androidmanifest配置文件中提供Widget的关键配置信息。项目准备一个Widget就是一个处理特定行为的BroadcastReceiver,AppWidgetProvider接口为开发人员提供了一个框架来简化处理这些行为,它包括以下方法:1、 onEnabled():创建第一个Widget时调用,如果可以,应在这里进行全局初始化。2、 onDisabled():它和onEnabled()相反,创建最后一个Widget时才调用它,如果可以,应在这里进行全局清理。3、 onUpdate():当Widget需要更新它的View时调用,用户第一次创建Widget时也需要调用它。4、 onDeleted():当Widget的一个特定实例被删除时调用,清理特定实例应放在这里进行。5、onReceive():此方法默认情况下处理BroadcastReceiver行为,并调用上面的方
法(警告:根据相关文档记载,需要开发人员自己处理某些特殊情况,更多信息请看下面的说明)。作 者 注: 点 击 此 链 接(http:///group/android-developers/browse_thread/thread/365dled3aac30916/e405cal9df2170e2?pli=1)检查有关AppWidget框架的缺陷信息,讨论内容包括解决此问题的代码(也可从本文下载示例代码,/img/2009/08/3833306_appwidget_code.zip),如果它们并不存在,可以将Widget标识符传递给onUpdate()方法。为了让Android识别Widget,需要在manifest文件中加入一个标准的标记,下面的代码片段显示了一个示例:receiverandroid:name=“ImagesWidgetProvider”intent-filteractionandroid:name=“android.appwidget.action.APPWIDGET_UPDATE”//intent-filtermeta-dataandroid:name=“vider”android:resource=“@xml/imageswidget_info”//receiver你可能已经注意到,和常见的定义不一样,小节引用了一个XML文件资源,这个文件为Widget定义了额外的数据,与AppWidgetProviderlnfo类一致,这里定义的信息是不变的,因此这个例子不包括updatePeriodMillis的值,因为这个程序允许用户修改与更新时间,如果你在这里分配updatePeriodMillis,它就不能这样做。下面是imageswidget_info.xml文件的完整代码:?xmlversion=“1.0”encoding=“utf-8”?appwidget-providerxmlns:android=“/apk/res/android”android:minWidth=“146dp”android:minHeight=“146dp”android:initialLayout=“@layout/widget”android:configure=“com.mamlambo.imageswidget.ImagesWidgetConfiguration”/标记定义了Widget的大小,默认布局和创建Widget实例时的启动行为配置,为了让Widget在主屏幕上更好地显示,Widget必须保持一定的大小,主屏幕分为特定大小的单元格,Google提供的基本原则是用你想占用的单元格数量乘以74,再减去2。在这个例子中,
Widget应该是一个正方形,长和宽都各占两个单元格,因此大小就是74*2-2=146.实现onUpdate()不显示内容的Widget是没有用的,幸好这个Widget的RemoteView对象很容易实现,它使用一组存储在应用程序的 drawable资源目录下的图片,程序使用 R.drawable.:imagename]引用这些图片资源,代码需要创建一个数组容纳图片的名字,这样从这些图片名字中随机选择一个就可以了。下面的代码片段显示了onUpdate()的实现,它随机显示一张图片:@OverridepublicvoidonUpdate(Contextcontext,AppWidgetManagerappWidgetManager,int[]appWidgetIds) {for(intappWidgetId:appWidgetIds){intimageNum= (newjava.util.Random().nextInt(IMAGES.length));RemoteViewsremoteView=newRemoteViews(context.getPackageName(),R.layout.widget);remoteView.setImageViewResource(R.id.image,IMAGES[imageNum]);appWidgetManager.updateAppWidget(appWidgetId,remoteView);}}注意onUpdate()方法使用Widget实例列表作为最后的参数,每个实例必须分开处理,由于AppWidget框架的现有缺陷,有些实例可能不可见或不能启用,但在这个例子中可以忽略这些问题。请记住,你自己在实现时可能想跟踪哪个Widget是真正激活的。你可以下载本文提供的代码(http:///img/2009/08/3833306_appwidget_code.zip),查看其中的R.layout.widgetXML布局定义,它基本上只是一个ImageView,RemoteViews只能使用一组有限的View对象,包括Button,ImageButton,ImageView,TextView,AnalogClock,Chronometer和ProgressBar,并且只能在FrameLayout,LinearLayout或RelativeLayout内使用。请保持RemoteView简单,因为访问是通过setImageViewResource()和setTextViewText()方法控制的,它们的目的是在另一个进程内画一个View,因此你的应用程序比正常布局要少些控制。自此,Widget最基本的部分完成了,但为了让用户配置图片更新之间的时间间隔,你
必须要实现配置Activity,然后处理RemoteView更新的调度问题。实现Widget的Activity配置和manifest文件中定义的ImagesWidgetConfiguration类似,任何Activity配置都有两个特殊情况:1、 只要一启动,它的目的就是返回结果,因此必须要调用setResult()方法返回一个适当的结果(结果要么是RESULT_CANCELED或RESULT_0K)。2、 在设置结果时,Widget标识值必须放在额外引用的AppWidgeManager.EXTRA_APPWIDGET_ID中。下面的代码片段显示了如何处理这两个例外,如果用户中途退出 Activity,调用setResult()将默认值设为RESULT_CANCELED。Bundleextras=launchintent.getExtras();if(extras!=null) {appWidgetId=extras.getint(AppWidgetManager.EXTRA_APPWIDGET_ID,AppWidgetManager.INVALID_APPWIDGET_ID);intentcancelResultValue=newintent();cancelResultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,appWidgetId);setResult(RESULT_CANCELED,cancelResultValue);}除了这两个限制外,你可能还要实现你喜欢的Activity配置,图1显示了这个例子的简单Activity配置,如果你RESULT_CANCELED,Widget不会显示给用户,如果你返回RESULT_0K,用户才看得见Widget,你可以使用任意存储机制保存Widget实例的配置数据,这个例子使用的是SharedPreferences接口,存储Widget标识更新之间的时间,你可以下载本文配套的代码查看完整的实现(http:///img/2009/08/3833306_appwidget_code.zip)。图1配置界面:这个简单的配置界面让用户设置图片刷新间隔时间实现更新调度正如前面提到的,AppWidgetProviderlnfo类中的配置值是不变的,因为updateTimeMillis值就在这个类中,任何有AppWidgetProviderlnfo的Widget实例,只要设置了这个值,Widget就会根据其频率更新,没有办法修改它,因为这个应用程序应该让
用户配置Widget中图片刷新的频率,因此你必须自动动手实现。AlarmManager类是最常用的更新机制,因为它支持重复通知,这些通知是将被触发的简单的Pendingintent对象。你可能会想你可以创建一个具有 AppWidgetManager.ACTION_APPWIDGET_UPDATE的Intent对象,然后给特定的Widget标识符设置额外的值,接着你就可以通过调用AlarmManager的setRepeating()方法,采用调度机制反复地更新,遗憾的是,这种做法行不通,Android系统反复使用Intents匹配行为和方案值,那些“额外的”值是不会拿去对比的。实际上,解决方案非常简单:首先为你的Widget定义一个方案,然后用它定义唯一的Intent实例。下面的代码片段显示如何实现这个目标:IntentwidgetUpdate=newIntent();widgetUpdate.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);widgetUpdate.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS,newint[]{appWidgetId});//makethispendingintentuniquewidgetUpdate.setData(Uri.withAppendedPath(Uri.parse(ImagesWidgetProvider.URI_SCHEME+“://widget/id/”),String.valueOf(appWidgetId)));PendingIntentnewPending=PendingIntent.getBroadcast(getApplicationContext(),0,widgetUpdate,PendingIntent.FLAG_UPDATE_CURRENT);//nowscheduleitAlarmManageralarms= (AlarmManager)getApplicationContext()。getSystemService(Context.ALARM_SERVICE);alarms.setRepeating(AlarmManager.ELAPSED_REALTIME,SystemClock.elapsedRealtime(),updateRateSeconds*1000,newPending);在ImagesWidgetConfigura
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 湖南中考怀化数学试卷
- 广西小学数学试卷
- 湖南初三期末数学试卷
- 黑龙江初三上期中数学试卷
- 东北大学2000-2026年攻读硕士学位研究生考试试题617管理学基础
- 2025企业办公空间租赁合同格式范本
- 高校实验教学部职责
- 电商平台售后服务岗位职责归纳
- 河北语文数学试卷
- 2025年中国风能设备行业市场深度研究及投资战略规划报告
- 美罗培南课件
- 128个常用自然拼读发音规则和1000句生活口语
- 异口同音公开课
- 专利代理人资格考试实务试题及参考答案
- 运用信息技术助力劳动教育创新发展 论文
- GB/T 602-2002化学试剂杂质测定用标准溶液的制备
- GB/T 4074.8-2009绕组线试验方法第8部分:测定漆包绕组线温度指数的试验方法快速法
- 2023年涉县水库投资管理运营有限公司招聘笔试模拟试题及答案解析
- 重症医学科常用知情告知书
- 二等水准测量记录表
- 母线槽安装检验批质量验收记录
评论
0/150
提交评论