`
smallsmile
  • 浏览: 135300 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

android widget 总结【转】

 
阅读更多

Android Widget开发总结
AppWidget 就是HomeScreen上显示的小部件,提供直观的交互操作。通过在HomeScreen中长按,在弹出的对话框中选择Widget部件来进行创建,长按部件后并拖动到垃圾箱里进行删除。同一个Widget部件可以同时创建多个。 

AppWidget的实现主要涉及到以下类: 
AppWidgetProvider 
RemoteViews 
AppWidgetManager 

1. 
首先需要提供一个定义了Widget界面布局的XML文件(位于res/layout/..),【注意!!】使用的组件必须是RemoteViews所支持的,目前原生API中支持的组件如下: 
FrameLayout 
LinearLayout 
RelativeLayout 

AnalogClock 
Button 
Chronmeter 
ImageButton 
ImageView 
ProgressBar 
TextView 


*如果使用了除此之外的组件,则在Widget创建时会导致android.view.InflateExceptionn异常。 

PS:这就导致有一些功能或样式无法实现,如很基本的list或文本编辑框都是无法直接实现的。如果想自定义Widget中的View的话只能通过修改framework来提供相应组件的支持。 

2. 
然后需要提供一个xml文件来定义Widget的基本属性,放置到res/xml/..目录下。 
如果使用的是Eclipse可按如下操作: 
1) 在res/目录下创建xml/目录 
2)创建xml文件(名字可任意),选择类型为AppWidgetProvider 
3)在弹出的便捷界面进行参数设置 

主要设置的参数如下: 
minWidth: 定义Wdiget组件的宽度 
minHeight: 定义Wdiget组件的高度 
updatePeriodMillis: 更新的时间周期 
initialLayout: Widget的布局文件 
configure: 如果需要在启动前先启动一个Activity进行设置,在这里给出Activity的完整类名(后面会说到,与一般Activity的实现有些许差别) 

*Widget大小的计算单元格数*74)-2,API上说是为了防止像素计算时的整数舍入导致错所以-2...不是很明白 

一个完整的样例: 
Xml代码  收藏代码 

    <?xml version="1.0" encoding="utf-8"?>  
    <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"  
          android:minWidth="80dp"  
          android:minHeight="32dp"  
          android:updatePeriodMillis="86400000"  
          android:initialLayout="@layout/widget_provider"  
          android:configure="com.demo.widget.MyWidgetConfiguration" >  
    </appwidget-provider>  



3. 
xml都定义好后,接下来就是创建一个继承自AppWidgetProvider的子类,AppWidgetProvider实际上就是一个BroadcastReceiver,里面提供了以下函数: 
onReceive(Context, Intent) 
onUpdate(Context , AppWidgetManager, int[] appWidgetIds) 
onEnabled(Context) 
onDeleted(Context, int[] appWidgetIds) 
onDisabled(Context) 
可通过重写以上函数来监听Widget状态的变化并进行相应的处理。 

以上函数具体调用情况归纳如下: 
[启动 - 无confiure Activity] 
onReceive 
onEnabled —— 第一个widget被显示 
onReceive 
onUpdate —— 刷新界面 

[启动 - 带confiuration Activity] 
onReceive 
onUpdate 

[拖动] 
<无状态变化> 

[周期更新] 
onReceive 
onUpdate 

[删除] 
onReceive 
onDeleted —— widget被删除 
onReceive 
onDisabled —— 最后一个widget被移除 

[启动时位置不够] 
onReceive 
onEnabled 
onReceive 
onUpdate 
onReceive 
onDeleted 
onReceive 
onDisabled 

*每次状态的变化会触发onReceive,一般该函数是不需要重写的。 

简单了解AppWidgetProvider之后,我们来看具体实现。 
这里创建一个MyAppWidgetProvider继承AppWidgetProvider: 
Java代码  收藏代码 

    public class MyWidgetProvider extends AppWidgetProvider {  
      
          static final String TAG = "widget";  
           
          /** 
           * 更新 
           */  
          public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds){  
                Log.i(TAG, "onUpdate");  
          }  
           
          /** 
           * 第一个Widget组件启动时触发 
           */  
          public void onEnabled(Context context){  
                Log.i(TAG, "onEnabled");  
          }  
           
          /** 
           * 最后一个Widget组件关闭时触发 
           */  
          public void onDisabled(Context context){  
                Log.i(TAG, "onDisabled");  
          }  
           
          /** 
           * 任一Widget组件被删除时触发 
           */  
          public void onDeleted(Context context, int[] appWidgetIds){  
                Log.i(TAG, "onDeleted");  
          }  
           
          /** 
           * 以上函数触发前会先触发该函数,一般不需要重写 
           */  
          public void onReceive(Context context, Intent intent){  
                Log.i(TAG, "onReceive");  
                super.onReceive(context, intent);  
          }  
           
    }  



其中onUpdate顾名思义是对Widget进行更新的,前面定义的更新周期就是作用于该函数的。 
Widget的更新与Activity不同,必须借助于RemoteViews和AppWidgetMananger。具体实现如下: 
Java代码  收藏代码 

    public void onUpdate(Context context, AppWidgetMananger appWidgetManager, int[] appWidgetIds){  
        int N = appWidgetIds.length; // 可能启动了多个Widget,appWidgetIds记录了这些Widget的ID  
        for(int i=0; i<N; i++){  
            RemoteViews  views = new RemoteViews(getPackageName(), R.layout.widget_views);  
            appWidgetManager.updateAppWidget(appWidgetIds[i], views);  
        }  
    }  


其中需要注意的是,虽然RemoteViews参数都是一样的,但是对于每个Widget最好都新创建一个再进行传递,否则会导致一些错误。具体可参考AppWidget RemoteViews 内存溢出 。 

其他函数的可以根据需要实现。 

由于无法获取到RemoteViews创建的界面中的元素,对于Widget中组件的操作只能通过RemoteViews所提供的有限的函数进行,常用的有: 
setOnClickPendingIntent(int viewId, PendingIntent pendingIntent) 
setProgressBar(int viewId, int max, int progress, boolean indeterminate) 
setTextViewText(int viewId, CharSequence text) 
setViewVisibility(int viewId, int visibility) 
详细函数列表可参考API中的RemoteViews类 。 

4. 
最后,更新AndroidManifest.xml。 
AppWidgetProvider对应一个receiver属性: 
Xml代码  收藏代码 

    <receiver android:name="MyWidgetProvider">  
                <intent-filter>  
                    <action android:name="android.appwidget.action.APPWIDGET_UPDATE"></action>  
                </intent-filter>  
                <meta-data android:resource="@xml/widget_property" android:name="android.appwidget.provider"></meta-data>  
            </receiver>  



5. 
提供Configuration Activity 
Configuration Activity是一个在Widget启动前先启动的Activity,方便用户对Widget的属性进行设置。 

在res/xml/...下对应的"属性文件"中添加configure字段指定启动的Activity,并在AndroidManifest.xml中该Activity下提供一个action为android.appwidget.action.APPWIDGET_CONFIGURE 的IntenFilter。 

需要注意的是, 
如果设置了Configure属性,则必须在指定的Activity中进行如下处理: 
1.在onCreate中setContentView()函数前添加setResult(RESULT_CANCLE) ,这样如果在Activity初始化完成前按下了BACK按键,则Widget不会启动; 
2.在setContentView()函数之后(不一定要在onCreate中,在Activity退出前即可),添加如下设置以指定需要启动的Widget: 
Java代码  收藏代码 

    int mAppWidgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID);  
    Intent resultValue = new Intent();  
    resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId);  
    setResult(RESULT_OK, resultValue);  

否则会导致退出Activity后Widget不启动。 

>> Widget创建步骤汇总: 
1.定义Widget布局XML -> res/layout/... 
2.定义Widget属性文件(xml) -> res/xml/... 
3. 创建AppWidgetProider子类,实现onUpdate()等函数,在manifest中注册receiver,添加一个action为 android.appwidget.action.APPWIDGET_UPDATE 的IntentFilter,并添加如下<meta- data>标识: 
Xml代码  收藏代码 

    <meta-data android:resource="@xml/<属性文件xml>" android:name="android.appwidget.provider"></meta-data>  



4. 创建Coniguration Activity(注意处理好setResult),添加到属性文件中的Configure属性,在manifest中注册activity,添加一个 action为android.appwidget.action.APPWIDGET_CONFIGURE 的IntentFilter 

分享到:
评论

相关推荐

    android的widget桌面开关例子

    总结起来,这个“android的widget桌面开关例子”涵盖了Android Widget的基础知识,包括创建AppWidgetProvider、定义Widget布局、处理用户交互以及权限管理。虽然由于权限限制未能实现完整的功能,但它为我们提供了...

    android axure widget包

    总结来说,这个“android axure widget包”是设计Android应用时的一大助力,它提供了丰富的Android组件模板,让设计师能够专注于功能和用户体验的设计,而不是花费大量时间在基础元素的绘制上。通过Axure的库功能,...

    android Widget

    总结,创建一个集成高德地图定位API的天气Widget需要对Android的Widget机制、地图API的使用、以及服务和广播接收器的交互有深入理解。通过以上步骤,你可以构建一个实用且美观的桌面小部件,为用户提供便捷的天气...

    android widget日历小插件

    总结来说,创建一个“android widget日历小插件”涉及到布局设计、Widget提供者、BroadcastReceiver、点击事件处理等多个环节。通过理解并实践这些知识点,开发者可以开发出功能丰富、用户友好的Android桌面Widget。

    android AppWidget ListView

    总结,`android AppWidget ListView`的使用涉及到AppWidget框架、RemoteViews、ListView与Adapter的结合以及事件处理等多个核心概念。通过源码学习,可以深入理解这些组件的协同工作方式,提升Android开发技能。

    appWidget启动Activity

    总结起来,`appWidget`启动`Activity`的核心在于正确设置`BroadcastReceiver`,以及在`AppWidgetProvider`中为`appWidget`的事件绑定合适的`PendingIntent`。这种机制使得`appWidget`不仅仅是一个静态展示信息的窗口...

    android appwidget使用说明及示例程序

    总结起来,Android AppWidget是一种强大的工具,能够为用户提供便捷的桌面服务,通过合理的布局设计和事件处理,开发者可以打造出功能丰富、用户体验良好的小部件。理解和掌握AppWidget的使用,对于Android开发者来...

    Android课程设计Widget电池插件

    总结一下,这个Android课程设计涵盖了以下几个核心知识点: 1. Android Widget的结构和原理。 2. 使用BroadcastReceiver监听电池状态广播。 3. 创建和配置AppWidgetProvider。 4. 使用BatteryManager获取电池信息。...

    Android Widget开发代码示例详细说明

    # Android Widget开发代码示例详细说明 ## 一、概览 在Android系统中,Widget是一种可以在用户桌面上提供快捷操作或显示应用相关信息的小部件。它们可以被看作是应用程序的一部分,但通常独立于主应用运行。Widget...

    appWidget启动Service

    在Android开发中,AppWidget是桌面...总结来说,AppWidget启动Service是一种常见的Android应用场景,它允许用户通过桌面小部件便捷地触发后台服务执行任务。正确设计和实现这种交互,可以提高应用的可用性和用户体验。

    Android 中文 API——android.widget合集(中)(50篇)(pdf格式)

    根据给定的文件信息,我们可以总结出以下有关Android开发中的重要知识点,特别是聚焦于`android.widget`命名空间下的组件及API使用。 ### Android中文API合集背景 Android中文API合集是由一群热心的开发者组成的...

    android 桌面组件 App widget的使用 AppWidgetProvider

    总结来说,App Widget 是 Android 平台上的一种强大工具,它让用户能够更便捷地与应用交互。通过学习并掌握 `AppWidgetProvider` 的使用,开发者可以创建出丰富多样的桌面组件,提升用户体验。在实际开发中,要充分...

    创建主屏幕控件----App Widget

    总结来说,创建一个Android App Widget涉及以下几个关键步骤: 1. 在AndroidManifest.xml中声明BroadcastReceiver。 2. 创建描述App Widget的XML资源文件(app_widget_info.xml)。 3. 编写BroadcastReceiver子类...

    Android高手进阶教程之AndroidWidget开发案例世界杯倒计时.pdf

    总结起来,开发Android Widget涉及以下几个核心步骤: 1. 创建新项目并命名。 2. 准备图像资源并放入相应目录。 3. 在`string.xml`中定义字符串资源。 4. 编写`widget_provider.xml`来配置Widget行为和初始布局。 5...

    android app widget小部件

    总结来说,Android App Widget是一种轻量级的界面元素,通过`AppWidgetProvider`与系统进行交互。"AppWidget-master"项目提供了一个基础的列表显示和刷新功能的小部件示例。如果你想让它显示动态数据,你需要添加...

    Android代码-天气预报加widget源码.zip

    总结来说,"Android代码-天气预报加widget源码.zip"涵盖了Android应用开发的多个核心知识点,包括网络请求、JSON解析、数据库操作、Widget实现、UI设计、权限管理以及异常处理。这些都是一个成熟的Android开发者必备...

    第二版【eoeAndroid特刊】第四期:Android widget

    通过对市场上的Widget应用进行研究,总结出当前Widget的主要应用场景、用户偏好以及存在的问题。 - **应用场景**:包括天气预报、新闻摘要、音乐播放控制等,这些Widget因其便捷性和实用性受到了用户的广泛欢迎。 ...

    Android高手进阶教程(八)之----Android Widget开发案例(世界杯倒计时!) ..pdf

    ### Android Widget 开发详解:世界杯倒计时案例 在深入探讨如何开发一款具有实时世界杯倒计时功能的Android Widget之前,我们先来了解下Widget在Android系统中的地位和作用。Widget,即桌面小部件,是一种可以放置...

    Android widget(2-1)

    ### Android Widget 深度解析 #### 一、引言 随着 Android 1.5 SDK 的发布,一系列新功能和 API 更新为开发者带来了前所未有的机遇。这其中,最令人瞩目的特性之一便是 AppWidget 框架。AppWidget 框架允许开发者...

Global site tag (gtag.js) - Google Analytics