android视图学习---添加窗⼝⼩部件以及AppWidget的创建详解
和快捷⽅式
今天给⼤家展现的如何创建⼀个窗⼝⼩部件(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发⽣变化时,我们需要
同步其他实例,保持同步性。
AppWidgetProviderInfo类补充说明:
public configure:⼀般为⼀个Activity,表明该Activity复杂需要管理AppWidget的创建操作。
public int updatePeriodMillis:⽤来更新AppWidget,但该属性在SDK1.5已废除
AppWidgetProvider类介绍:
常⽤⽅法:
()  :当该类型的AppWidget每次被删除时,调⽤此⽅法
() :当该类型的窗⼝⼩部件(AppWidget)全被删除时,调⽤此⽅法
() :当第⼀次创建该类型的AppWidget时,调⽤此⽅法
() :⼴播接受者⽅法,⽤来接受⼴播消息
()  :每次创建该类型的AppWidget都会调⽤此⽅法,通常来说我们需要在该⽅法⾥为该AppWidget指定
RemoteViews对象。
AppWidgetManager类介绍:
常⽤常量:
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对象。
第⼆部分:在⾃⼰的应⽤程序中添加窗⼝⼩部件(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以及对象去构建⼀个对象(具体该对象,
参见下⽂)。
android学习教程与 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截图:主⼯程流程如下:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。