- 浏览: 809817 次
- 性别:
- 来自: 广州
最新评论
-
mixture:
语句int num1, num2;的频度为1;语句i=0;的频 ...
算法时间复杂度的计算 [整理] -
zxjlwt:
学习了。http://surenpi.com
[问题解决]Error: ShouldNotReachHere() [整理] -
Animal:
谢谢 楼主 好东西
算法时间复杂度的计算 [整理] -
univasity:
gaidandan 写道缓存失败,,模拟器上可以缓存,同样代码 ...
[开发总结]WebView使用中遇到的一些问题&解决 -
blucelee2:
那么麻烦干吗,而且这种方法会导致,当拉太小的时候样式会丢掉,整 ...
[SWT]SashForm中固定单侧大小(&实现面板隐藏)
其实Android API开发指南中的App Widgets章节
已经说得很清楚了,下面只是对自己的理解进行一次梳理。
--
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 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:
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。具体实现如下:
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属性:
<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:
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>标识:
<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
最后附上一个完整的例子,
实现思路如下:
1. 提供一个Configuration Activity,这里只简单显示一行文字;
2.退出后Widget启动;
3.点击Widget中的按钮会启动一个Activity。
- WidgetDemo.rar (47.6 KB)
- 下载次数: 572
发表评论
-
[转]Android Studio的logcat窗口被拖出来后如何还原?
2016-01-07 10:08 3289无意把Memory Monitor的窗口拖出来了,然后发觉 ... -
[问题解决]个推SDK使用侧记 -- 多个账号注册导致的问题
2013-12-28 14:40 2253这是我们项目最近用到的东西,用来实现消息推送。 (还不了 ... -
[问题解决] 个推(igetui)SDK使用侧记 -- 多个账号注册同一应用导致的问题
2013-12-28 14:33 0这是我们项目最近用到的东西,用来实现消息推送。 (还不了解 ... -
[问题解决]同时显示多个Notification时PendingIntent的Intent被覆盖?
2012-02-02 16:11 17097情况是这样的,使用NotificationManager触发多 ... -
迟来的试用:App Inventor,不用编码也能做出apk
2011-12-22 22:29 2850最近看到App Inventor即将关闭的消息(2011.12 ... -
Maven In Android
2011-08-31 17:32 3486Maven 一个项目管理工具,类似于Ant。相比Ant, ... -
[问题解决]WebView显示的网页在大分辨率屏下被放大 - 密度惹的祸
2011-08-31 17:16 9143例如适合800px宽度的页面,如果通过WebView在 ... -
[工作积累].9图片,不要忘了设定内容填充区域
2011-08-31 17:13 1803<? xml version ... -
Android调试工具 —— MAT [整理]
2011-06-26 23:06 30593简介: Eclipse提供的一个内存分析工具。它是一个功 ... -
Android调试工具 —— TraceView [整理]
2011-06-26 22:58 5158简介: 来自API文档中的一段介绍: Tracevi ... -
[开发总结]WebView使用中遇到的一些问题&解决
2011-06-15 13:45 13356<!-- 最近接触WebView比较多,总结一下使用过程 ... -
[Android API 学习]WebView基本使用
2011-06-15 10:54 8526WebView是android.webkit包下的一 ... -
[问题解决]Error: ShouldNotReachHere() [整理]
2011-06-01 13:03 10899在Android项目中创建一个 ... -
[小工具]apk反编译工具整合(修复)
2011-05-05 00:30 5349//----------------------------- ... -
[问题解决]java.lang.SecurityException: Permission Denial requires null[整理]
2011-04-12 13:10 24128原因分析: 在SDK版本eclair中(Level 5- ... -
[基础]Android SDK版本与API Level对应列表[收集]
2011-04-12 12:32 4807Platform Version AP ... -
Android apk安装后自动添加桌面图标 和 自启动的尝试
2011-04-02 01:47 15258前一个问题是论坛里的一位朋友提出来的:“如何在应用安装到手机里 ... -
View.setOnKeyListener无法捕获事件?[收集]
2011-03-24 23:32 12718最近在使用View中的setKeyListener时碰到了这问 ... -
Android 获取指向Resource的URI[转]
2011-03-23 21:35 7626>> Uri真强大,还能这么搞...收藏了,回头要 ... -
Android模拟器网络连接问题解决[转]
2011-03-22 13:35 7938原文链接: http://hi.baidu.com/bing ...
相关推荐
在"appwidget"这个压缩包文件中,可能包含了示例代码和资源文件,供开发者学习如何实现上述功能。通过研究这些文件,你可以更好地理解App Widget的工作原理和实现细节,从而在自己的项目中创建出富有特色的桌面小...
- 不同Android版本可能有AppWidget的API变化,需要针对API版本进行兼容处理。 - 新版本Android可能会引入新的特性,如Android 12中的Widget preview功能。 总结起来,Android的AppWidget是构建动态桌面体验的重要...
10. **兼容性与版本差异**: 考虑到Android系统的碎片化,开发AppWidget时需要关注不同API级别的兼容性问题。例如,某些功能可能在较低版本的Android中不可用,需要适当地进行条件判断和处理。 通过深入分析和理解这...
总的来说,"android appWidget每日一句"项目为我们提供了一个学习AppWidget开发的实例,通过阅读和理解源码,我们可以深入掌握AppWidget的工作原理和设计模式,这对于提升Android开发技能非常有帮助。
【Android小部件AppWidget】是安卓平台上的一种特殊应用组件,它允许开发者在用户的主屏幕上创建交互式的、小型的应用视图,通常称为“桌面小部件”。这些小部件可以提供快速访问功能,如天气预报、日历事件、音乐...
创建一个新的Android项目,确保目标API版本支持AppWidget功能。在`AndroidManifest.xml`中声明AppWidget提供者,例如: ```xml <receiver android:name=".AppWidgetProvider"> <action android:name="android....
开发者可以通过AppWidgetManager的API进行操作,如更新RemoteViews视图或者删除AppWidget实例。 #### 4. AppWidgetProvider广播类 AppWidgetProvider类本质上是一个广播监听器,它负责接收对AppWidget进行操作的...
在Android 4.0(API级别14)及以上版本,开发者可以创建AppWidget集合,展示一系列数据,例如列表或网格形式的条目。下面我们将详细探讨如何在Android 0中实现AppWidget集合。 首先,为了构建一个AppWidget集合,你...
6. **版本兼容性**:理解不同Android版本对AppWidget的支持情况,以及如何通过条件编译指令处理API级别的差异。 通过深入学习和实践这个源码示例,你将能够掌握AppWidget的开发流程,为自己的Android应用添加更多元...
【标签】"appwidget" 表明此项目的核心在于理解和使用Android的AppWidget API。开发者需要熟悉如何创建一个WidgetProvider(小部件提供者)、定义布局文件、处理小部件的更新(通过Intent和BroadcastReceiver)以及...
【AppWidget_FlashLight】是Android平台上的一种应用小部件,它允许用户在主屏幕上快捷启动或关闭设备的闪光灯功能,无需打开完整的应用程序。在Android系统中,AppWidget是可以通过小部件面板添加到主屏幕上的小型...
由于Android API基于Java API,所以开发者在学习Java基础知识后,可以相对容易地过渡到Android开发。 总的来说,Java API和Android API都是开发者的重要工具,它们共同构成了丰富的编程环境,使得开发者能够高效地...
`intent-filter`用于指定当系统需要更新Widget时触发的ACTION,通常是`android.appwidget.action.APPWIDGET_UPDATE`。`meta-data`标签则用来指定Widget的元数据,通常包含在`res/xml`目录下的一个XML文件,这个文件...
【Android某保活APP样品】是一款针对Android系统设计的应用程序,其主要目的是在用户设备上保持持续运行,尤其是在系统资源紧张或清理后台进程时,能够有效地避免被操作系统杀死,从而提高应用的可用性和用户交互...
在Android平台上,开发者可以利用Android桌面小部件(Widget)功能为用户提供便捷的桌面服务,比如“Android桌面小部件widget日签Or日历可作为桌面日历”就是一个很好的例子。这个应用设计巧妙,不仅展示了日期,还...
例如,`android.app`包用于处理应用程序的基本结构,`android.widget`包包含了各种UI元素,如按钮、文本视图等,`android.content`包涉及内容提供者和Intent。 2. **类(Classes)**:这些类提供了实现特定功能的...
Android API 文档是Android开发者的重要参考资料,它包含了Android操作系统各个版本的编程接口,以及详细的...通过深入学习和理解API文档,你可以更好地理解和驾驭Android系统,创作出更具创新性和用户体验优良的应用。
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> android:name="android.appwidget.provider" android:resource="@xml/new_battery_widget_info" /> ``` 现在,创建`...
总结,创建一个集成高德地图定位API的天气Widget需要对Android的Widget机制、地图API的使用、以及服务和广播接收器的交互有深入理解。通过以上步骤,你可以构建一个实用且美观的桌面小部件,为用户提供便捷的天气...