本文共 9143 字,大约阅读时间需要 30 分钟。
今天给大家展现的如何创建一个窗口小部件(AppWidget)以及如何在自己的应用程序中添加窗口小部件(AppWidget)。
本文组织如下:
第一部分:创建一个窗口小部件;
第二部分:在自己的应用程序中添加窗口小部件(AppWidget)。
整个功能其实实现起来也是很简单的,只望大家能耐着性子点看 。
网上资料已经许多了 ,在此先给大家推荐几个不错的Blog ,大家可以先去看看:
1、
2、
从中我们知道:
1、每个AppWidget都有一个AppWidgetProviderInfo对象,该对象描述了每个AppWidget的基本数据(meta-data)信息 ,
其定义在<appwidget-provider>
节点信息。
2
、
每个AppWidget都对应一个RemoteViews视图对象,该RemoteViews提供了特定AppWidget的展示(View视图)和操作
(例如,点击该RemoteViews会跨进程处理一些事情)。
关于RemoteViews类请参考:
3、AppWidgetManager类维护了应用程序中所有的AppWidget,并且为给每个AppWidget特定的Id去标识他们(一般我们
用 appWidgetId去标识)。通过给定的appWidgetId,AppWidgetManager可以管理对应的AppWidget,例如:更新该
AppWidgetId的RemoteViews视图,删除该AppWidget对象等 。
4、AppWidgetProvider广播类从来说是一个监听器,系统把对AppWidget的操作(例如,创建和更新等)分发给
AppWidgetProvider类去处理。
对每个AppWidget,我们可以创建多个其多个实例,当然这些实例对应于不同的appWidgetId。 假设存在这么个
MyAppWidgetProvider广播类,以及对应的MyAppWidgetProviderInfo对象。 那么,则存在如下关系:
MyAppWidgetProvider.class : 代表了由该MyAppWidgetProvider创建的窗口小部件(AppWidget)的类型,一般用
CompontentName对象形式表示 。 那么存在如下关系:
从上图可是,每个appWidget都对应于一个MyAppWidgetProvider类,于是当任何一个appWidgetId发生变化时,我们需要
同步其他实例,保持同步性。
publicconfigure: 一般为一个Activity,表明该Activity复杂需要管理AppWidget的创建操作。
public int updatePeriodMillis:用来更新AppWidget,但该属性在SDK1.5已废除
常用方法:
() : 当该类型的AppWidget每次被删除时,调用此方法
() : 当该类型的窗口小部件(AppWidget)全被删除时,调用此方法
() : 当第一次创建该类型的AppWidget时,调用此方法
() : 广播接受者方法 , 用来接受广播消息
() : 每次创建该类型的AppWidget都会调用此方法 , 通常来说我们需要在该方法里为该AppWidget指定
RemoteViews对象。
常用常量:
ACTION_APPWIDGET_PICK= "android.appwidget.action.APPWIDGET_PICK“
说明:列出所有能够创建AppWidget的对象,该对象一般为自定义的AppWidgetProvider广播接受者。
注意:发送该Intent必须添加附加值: 。
该含义:该appWidgetId与我们发送Action为ACTION_APPWIDGET_PICK 后
所选择的AppWidget绑定。因此,我们可以通过这个appWidgetId获取该AppWidget的信息了。
ACTION_APPWIDGET_CONFIGURE= "android.appwidget.action.APPWIDGET_CONFIGURE”
说明: 如果选择的AppWidget配置了android:configure 属性,需要再次启动性对应的Activity,继而进一步去选择
AppWidget。同时发送该Intent必须添加附加值:,含义同上。
常用方法:
public int[] getAppWidgetIds( provider)
功能:获取对应类型的所有appWidgetId
参数说明: provider 通常为 XXXAppProvider.class类型
public getAppWidgetInfo(int appWidgetId)
功能: 获取特定appWidgetId对应的对象
public static getInstance(context)
功能: 获取 对象
public void updateAppWidget(int appWidgetId, views)
功能: 以特定的views视图更新appWidgetId的窗口小部件(AppWidget) 。同时会发送广播
public void updateAppWidget(int[] appWidgetIds, views)
功能:以特定的views视图更新所有appWidgetIds的窗口小部件(AppWidget),同时发送
广播
public void updateAppWidget( provider, views)
功能: 已特定的views更新组件类型为provider的所有窗口小部件(AppWidget),同时发送
广播。
示例Demo :
说明:创建一个简单的AppWidget实例,点击按钮后可以更该图片资源显示 ,具体代码在
截图为:
关于如何创建一个AppWidget的教材,我也不再多说了,大家可以参考上面我提到的两篇重量级博客去学习:
1、
2、
PS: 具体代码可在后面下载 。
再次强调一点,每个AppWidget都对应与AppWidgetProvider , 我们需要同步更新这些AppWidget对象。
本部分的主要功能是像Launchcer那样添加AppWidget 。 知识点介绍如下:
1、AppWidgetHost 类
功能:对每个应用程序App,该类提供了和AppWidgetService(该AppWidgetService用来管理所有AppWidget,类似于
NotificationManagerService系统服务管理所有Notifciation,不懂?其实我也不懂,知其大意即可)交互,用来更新、管理
AppWidget。打个比喻:AppWidgetHost是宿主对象,每个AppWidget都是寄生虫,可以附加在(显示)AppWidgetHost上。
每个能添加、显示AppWidget的Activity都是一个AppWidgetHost对象,比如Launcher.java(Activity对象),以及我们后面自定
义的MainActivity.java(Activity对象)。
常用方法为:
public AppWidgetHost( context, int hostId)
功能:构造一个AppWidgetHost对象
参数: hostId 大意是该AppWidgetHost(宿主对象)对应的Id号,一般赋予一整数即可。
public int allocateAppWidgetId()
功能:申请一个新的appWidgetId ,该id会与新创建的AppWidget绑定。
public void startListening()
功能:监听所有AppWidget的变化 ,该方法必须在Activity的onCreate()/onStart()调用,否则 AppWidget是不会得到更新的
public void stopListening()
功能: 对应于startListening(),即停止对AppWidget的更新监听。可以在Activity的onStop()方法里调用 ,
一般无需调用此方法去停止监听。
public final createView( context, int appWidgetId, appWidget)
功能: 根据指定的appWidgetId以及对象去构建一个对象(具体该对象,
参见下 文)。
与 RemoteViews的区别
对每个AppWidget内部而言,都有一个RemoteViews对象,用于视图显示;而对于外部而已,则以
形式代言 这个RemoteViews视图。换句话来说就是,AppWidgetHost对象而言,它并不知道RemoteViews存在,而只是知
RemoteViews 的代言人AppWidgetHostView。
好了 ,该说明的都说明了,下面最后给大家补充一下如何利用在自己的应用程序里添加窗口小部件(AppWidget) 。
也是两步走:
第一步: 发送Action为的 Intent ,则所有能创建窗口小部件的AppWidgetProvider的广播
接收者都会显示 ,同时为该新创建的AppWidget分配一个appWidgetId ,该appWidgetId即可唯一标记我们选择的
AppWidget。
第二步:如果选择的AppWidget对应地AppWidgetProviderInfo对象配置了android:configure属性,则需要在此启动该配置
属性(一般为一个Activity类) ,然后在完成添加AppWidget的操作 ; 否则,没有配置android:configure属性,就可以添加
AppWidget的操作。
示例Demo截图:
主工程流程如下:
最后 ,关于AppWidget点击后触发的相应事件,是通过设置该AppWidget的RemoteViews的某个控件点击事件而触发的。
本文转自wanqi博客园博客,原文链接:http://www.cnblogs.com/wanqieddy/archive/2012/05/05/2484533.html如需转载请自行联系原作者