AppWidget初步入门
来源:互联网 发布:flash player 12 mac 编辑:程序博客网 时间:2024/05/19 00:42
AppWidget 就是HomeScreen上显示的小部件,提供直观的交互操作。通过在HomeScreen中长按,在弹出的对话框中选择Widget部件来进行创建,长 按部件后并拖动到垃圾箱里进行删除。同一个Widget部件可以同时创建多个。
AppWidget的实现主要涉及到以下类:
1、AppWidgetProvider:继承自 BroadcastRecevier, 在AppWidget应用 update、enable、disable和 delete时接收通知。其中,onUpdate、onReceive是最常用到的方法,它们接收更新通知。
2、 AppWidgetProvderInfo:描述AppWidget 的大小、更新频率和初始界面等信息,以XML文件形式存在于应用的 res/xml/目录下。
3、AppWidgetManger:负责管理 AppWidget,向 AppwidgetProvider发送通知。更新AppWidget的相关状态,获取已安装AppWidget的状态和其它相关AppWidget的状态
4、RemoteViews:一个可以在其他应用进程中运行的类,向 AppWidgetProvider发送通知。一个描述了可以在其他进程中显示的view层,它inflate于layout资源文件,并且这个类对提供一些基本操作修改view内容
一、首先需要提供一个定义了Widget界面布局的XML文件(位于res/layout/..),需要注意的是使用的组件必须是RemoteViews所支 持的,目前原生API中支持的组件如下:
FrameLayout
LinearLayout
RelativeLayout
AnalogClock
Button
Chronmeter
ImageButton
ImageView
ProgressBar
TextView
ViewFlipper
ListView
GridView
StackView
AdapterViewFlipper
*如果使用了除此之外的组件,则在Widget创建时会导致android.view.InflateExceptionn异常。
二、然后需要提供一个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...不是很明白
上代码,先上效果图:
11、先在res\layout中新建一个 main.xml 的文件里面内容如下:这个XML文件是AppWidget的布局文件
AppWidget中只有一个布局文件就是一个Button
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <Button android:id="@+id/btn" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="飞鱼" /></LinearLayout>
12、在res目录下新建一个xml目录,这个xml目录存放AppWidget的相关信息,在xml目录下新建一个 appwidgetinfo.xml 的xml文件
<?xml version="1.0" encoding="utf-8"?><appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" android:minWidth = "294dp" android:minHeight = "72dp" android:updatePeriodMillis = "86400000" android:initialLayout = "@layout/main" ></appwidget-provider>
minWidth:AppWidget的宽度
minHeight:AppWidget的高度
updatePeriodMillis:更新频率。主要用于执行AppWidgetProvider中的Update()函数
initialLayout = "@layout/main":指明AppWidget的布局文件
13、新建一个MyWidget的类继承自AppWidgetProvider
public class MyWidget extends AppWidgetProvider {//private static final String TAG = "MyWidget";private static final String broadcastString = "com.fy.MyWidget";// 每当一个Widget被删除的时候调用此函数@Overridepublic void onDeleted(Context context, int[] appWidgetIds) {// TODO Auto-generated method stubsuper.onDeleted(context, appWidgetIds);}// 当最后一个Widget被删除的时候调用此函数// 在此方法中一般情况下执行一些AppWidget的结束性操作,如删除一个临时数据库等操作。@Overridepublic void onDisabled(Context context) {// TODO Auto-generated method stubsuper.onDisabled(context);}// 当第一个Widget被创建的时候调用此函数// 在此方法中一般情况下执行一些AppWidget的初始化的工作,如新建一个数据库或者一些操作等@Overridepublic void onEnabled(Context context) {// TODO Auto-generated method stubsuper.onEnabled(context);}// 调用其它函数时先调用此函数// onReceive相当一个经理,当外界来任务了,将任务分发给其下的员工(onEnable,onDeleted,onDisabled,onUpdate)处理 @Overridepublic void onReceive(Context context, Intent intent) {if(intent.getAction().equals(broadcastString)) {RemoteViews remotesViews = new RemoteViews(context.getPackageName(), R.layout.main);remotesViews.setTextViewText(R.id.btn, "FY");// 获取AppWidgetManager更新appWidget的实例AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);// 组件名称ComponentName componentName = new ComponentName(context, MyWidget.class);appWidgetManager.updateAppWidget(componentName, remotesViews);}super.onReceive(context, intent);}// 在这里onUpdate执行的条件有两个:1、到了我们所设定的更新周期了;2、添加一个新的AppWidget。 // 在onUpdate中一般为控件定义事件处理或者开启一个临时的Service。 // 这里是为我们的button控件添加点击事件处理 // context表示这个接收器正在运行的环境 // appWManager表示AppWidget的管理器可通过调用updateAppWidget(ComponentName, RemoteViews)更改指定AppWidget的控件属性 // appWidgetIds表示Appwidget的编号,系统自动生成 @Overridepublic void onUpdate(Context context, AppWidgetManager appWidgetManager,int[] appWidgetIds) {// 初始化IntentIntent intent = new Intent();intent.setAction(broadcastString);PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0);// 获取appWidget上的相关控件RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.main);remoteViews.setOnClickPendingIntent(R.id.btn, pendingIntent);// 更新所有的appWidgetappWidgetManager.updateAppWidget(appWidgetIds, remoteViews);}
14、在AndroidManifest.xml中注册处理这个广播的类
<application android:icon="@drawable/ic_launcher" android:label="@string/app_name" > <receiver android:name=".MyWidget"> <intent-filter ><!-- 系统发出的广播 --> <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /><!-- 程序发出的广播 --><action android:name="com.fy.MyWidget"/> </intent-filter> <meta-data android:name="android.appwidget.provider" android:resource="@xml/appwidgetinfo" /> </receiver> </application>
这样一个简单的Widget就完成了。其实想人人网的Widget还有腾讯微博的Widget都很复杂。这只是一个简单的入门。
我现在在分析android自带音乐播放器的MediaAppWidgetProvider.java,如果今天晚上能完成的话就发表出来。
- AppWidget初步入门
- AppWidget初步入门
- AppWidget的入门讲解
- Android基础-AppWidget入门
- Android Launcher构建之AppWidget初步
- Appwidget
- AppWidget
- AppWidget
- appwidget
- Appwidget
- AppWidget
- AppWidget
- AppWidget
- AppWidget
- AppWidget
- AppWidget
- 初步入门
- 安卓开发小知识-AppWidget入门
- Convirt使用VNC登陆解决方案
- JS特效 小蜜蜂
- 使用strtok函数解析string类型数据
- JS 特效 用js实现radio选择钮效果
- “个人核心竞争力”与“危机感”
- AppWidget初步入门
- Copying Rowsets
- 12.21
- 下学期课表
- CSS中的class与id区别及用法
- Android Layout:LinearLayout
- 求解
- DIV滚动条滚到底部
- C学习总结