注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

民主与科学

独立之人格,自由之思想

 
 
 

日志

 
 

Widgets基础篇(上)  

2011-07-25 17:21:04|  分类: 开发专题 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
文章参照自:http://developer.android.com/guide/topics/appwidgets/index.html
一、前言
所谓App Widgets就是微型应用程序的意思,它可以嵌入在其他应用程序(如主屏幕),并能定期更新其View。
这些View被当成用户界面的小部件,您可以使用App Widget provider来发布App Widgets。
一个能容纳其他的App Widgets的应用程序的组件,我们称之为App Widget host。图1就是一个音乐App Widget的截图。
图1
Widgets基础篇(上) - hubingforever - 民主与科学
 在下面的文章中,我们将讲述如何使用App Widget provider来发布App Widget
二、基本原理
为了创建一个App Widget,你需要以下三部分:
AppWidgetProviderInfo
AppWidgetProviderInfo用于对App Widgets的元数据(metadata)进行描述,如App Widgets的布局,更新频率,和AppWidgetProvider类。它应该是在XML中定义。
AppWidgetProvider
AppWidgetProvider定义了一些基本方法,通过这些方法你可以很方便和App Widget进行交互。
AppWidgetProvider基于广播事件。当App Widget进行更新,启用,禁用和删除时,在AppWidgetProvider中,您将收到其对应的广播。
视图布局文件
为了让App Widget能进行显示,我们还需要为App Widget的提供一个布局文件
另外,你还可以实现一个用于对App Widget进行配置的Activity.该Activity是可选的,当用户添加App Widget时,该Acitivity将被启动。通过它可以在App Widget被创建时,做一些对App Widget的设置。这里的设置是指和App Widget的事务相关的设置,不是指AppWidgetProviderInfo的内容。
三、在Manifest中声明App Widget
首先,需要在你的应用程序的AndroidManifest.xm文件中声明一个AppWidgetProvider类,比如示例1.
示例1
<receiver android:name="ExampleAppWidgetProvider" >
    <intent-filter>
        <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
    </intent-filter>
    <meta-data android:name="android.appwidget.provider"
               android:resource="@xml/example_appwidget_info" />
</receiver>
<receiver>元素的android:name属性必须要进行设置, 该属性说明了我将使用哪个AppWidgetProvidere来提供App Widget。
<intent-filter>元素必须包含android:name属性为"android.appwidget.action.APPWIDGET_UPDATE"的Action,
即<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />。该属性说明了AppWidgetProvider可以接收ACTION_APPWIDGET_UPDATE广播。
该广播是唯一你必须要声明接受的广播。AppWidgetManager能自动的把其他所有的App Widget广播发送到AppWidgetProvider
在<meta-data>元素中,必须要指定AppWidgetProviderInfo资源文件,必须要定义以下2个属性:
    * android:name - 它用于定义metadata元素的名字. 必须把该属性设置为“android.appwidget.provider”以表明该<meta-data>元素是用于描述AppWidgetProviderInfo资源文件位置的.
    * android:resource -该属性用于说明AppWidgetProviderInfo资源文件的位置。
四、编写AppWidgetProviderInfo配置文件
AppWidgetProviderInfo用于定义App Widget的基本属性,如显示的最小尺寸,其初始布局资源,更新频率,
和(可选)configuration Activity,该Activity将在其App Widget被创建时被启动。 
AppWidgetProviderInfo的定义必须在一个只有单一的<appwidget-provider>元素的XML资源文件中进行,该文件必须放在res/xml目录下。
示例2
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:minWidth="294dp"
    android:minHeight="72dp"
    android:updatePeriodMillis="86400000"
    android:previewImage="@drawable/preview"
    android:initialLayout="@layout/example_appwidget"
    android:configure="com.example.android.ExampleAppWidgetConfigure" 
    android:resizeMode="horizontal|vertical">
</appwidget-provider>
以下是关于<appwidget-provider>一些属性的介绍:
minWidthminHeight属性用于说明App Widget在屏幕上至少要占用多大的空间 。
默认的Home screen在放置App Widgets时,是以网格为基本单位,而不是以像素,这里的网格是指拥有一定的像素的长方形区域。
因为home屏幕的布局方向可能改变(网格的大小就会随之改变),所以你应该考虑最坏的情况,此时网格拥有74个像素的长和高。
然而你必须减去2个像素,以便避免在计算网格数量时,对像素进行取整,发生错误。
你应该使用下面的公式计算android:minWidthandroid:minHeight
(number of cells * 74) - 2
根据上面的公式,如果想你的App Widget占用4个网格的宽,1个网格的高话,那么android:minWidthandroid:minHeight应该分别为"294dp""72dp"
注意:为了让你的App Widget能在各类平台上运行,你的App Widget不要超过4X4网格的尺寸。关于App Widget的设计的更多内容请参考App Widget Design Guidelines
updatePeriodMillis属性用于说明App Widget框架请求AppWidgetProvideronUpdate()方法来更新App Widget的频率。但是这个频率是无法完全保证的,我们建议尽量减少更新的频率。有时可能一小时才更新一次,以便节约电池。你也可以提供一个配置,让用户自己设置更新的频率。有些人可能想15分钟就更新股票的价格,而有些人仅想1天就更新股票4次。
注意:如果手机在处于休眠状态时,而对App Widget进行更新的时间有到了,这时设备将醒来以便进行App Widget的更新。如果更新频率低于一个小时一次的话,并不会引起明显的电池消耗。如果你的更新非常频繁或你不想手机在处于休眠时还进行App Widget更新的话,请通过一个alarm来进行更新。你可以用AlarmManager来设置一个定期发送AppWidgetProvider的Intent的Alarm,且把Alarm的类型设置为ELAPSED_REALTIME or RTC这两种类型的Alarm只有在系统处于awake状态才会发送。
另外此时,要把android:updatePeriodMillis设置为"0".
当使用AlarmManager来控制刷屏时,可以在系统处于锁屏时可以忽略此时刷新。
判断锁屏的代码如下所示:

        android.app.KeyguardManager kgm = (android.app.KeyguardManager) getSystemService(KEYGUARD_SERVICE);
        boolean isLocked = kgm.inKeyguardRestrictedInputMode();
Note: Updates requested with updatePeriodMillis will not be delivered more than once every 30 minutes.
initialLayout属性用于设置App Widget的布局文件。
configure属性用于说明在App Widget在被添加到Home Screen时,哪个configure Activity将首先启动。这是一个可选属性,关于次的更多内容请阅读后文。
previewImage属性在Android 3.0版本中才被添加,它用于指明 App  Widget的预览图片,它用于在用户选中该App Widget的图标,打算添加该App Widget时,进行显示,以便用户了解该App Widget的界面。如果没提供预览图标的话,显示的将是你的App Widget的启动图标。该属性和AndroidManifest.xml中的<receiver>元素的android:previewImage的属性一致。关于此的更多内容请参照后文。
The autoAdvanceViewId attribute specifies the view ID of the app widget subview that should be auto-advanced by the widget's host. Introduced in Android 3.0.
resizeMode属性在Android 3.1中才被添加,它用于说明App Widget重新调整大小的规则。通过该属性,你可以设置在什么方向允许调整App Widget的大小,可以是垂直、水平、或同时垂直和水平两个方向。用户可以按住App Widget来显示大小调整handle,通过在水平或垂直方向拖动handle来调整
App Widget在垂直或水平方向的尺寸。resizeMode属性的值可以是"horizontal", "vertical", "none"和"horizontal|vertical"
icon属性用于说明你的AppWidget在AppWidget picker列表中显示的图标,它应该和AndroidManifest.xml中的<receiver>元素的android:icon的属性一致
label属性用于说明你的AppWidget在AppWidget picker列表中显示的名字,它应该和AndroidManifest.xml中的<receiver>元素的android:label的属性一致。
关于<appwidget-provider>属性的更多内容请参照AppWidgetProviderInfo
五、编写App Widget布局文件
你必须在XML文件中定义你的App Widget的布局文件,并把它保存在res/layout/目录下。你可以在 App Widget中使用如下的View,但是请你在开始你的App Widget的布局时请阅读App Widget Design Guidelines.
如果你熟悉在XML中如何进行布局文件的编写,那么编写App Widget布局文件将非常的简单。因为App Widget的布局是基于RemoteViews对象,所以它并不能支持所有的View.
RemoteViews对象支持如下的一些View及其子类:
接下文
  评论这张
 
阅读(1540)| 评论(1)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017