App Widget的更新方法介绍
Widget是一种小巧但是功能强大的程序,使用户能够方便快捷的获取信息,在PC上被广泛的 使用,现在随着OPhone的推出,widget也进入到了手机领域,为用户带来了方便的同时也为开发者实现更多很酷想法的可能。在OPhone中有两种 widget开发方式,一种是以HTML+CSS+JavaScript的开发方式,另一种是沿用Android平台的开发方式,本文介绍的是后面一种, 在OPhone平台上开发App widget。
widget一般开发方式介绍
下面以编写一个时钟的小程序来介绍如何编写widget。
(1)创建一个类,让其继承类AppWidgetProvider,在AppWidgetProvider类中有许多的方法,例如 onDelete(Context, int[]),onEnable(Context)等等,一般情况下我们纸需要重写onUpdate(Context, AppWidgetManager, int[])这个方法就可以了,这个方法是当触发器更新widget时候执行的操作。
(2)在项目的l文件中添加一个receiver标签,让其指向前面创建的AppWi
dgetProvider子类,内容如下:
1. <receiver android:name="widget" 
2.     android:label="@string/app_name" 
3.     android:icon="@drawable/icon"> 
4.       <intent-filter> 
5.          <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />   
6.      </intent-filter> 
7.          <meta-data android:name="android.appwidget.provider"   
8.                android:resource="@xml/widget_setting" />   
9.     </receiver> 
intent-filter中过滤了APPWIDGET_UPDATE事件,这个事件是由系统触发的更新事件,每个widget必须包含这个事件;meta-data标签描述的是widget的配置文件指向,该文件描述了widget的一些基本信息。
(3)编写widget的provider文件信息,本例中该文件名叫做l,开发者可以随便取名,只要在l中写正确就行。
1. <?xml version="1.0" encoding="utf-8"?> 
2. <appwidget-provider 
3.  xmlns:android="schemas.android/apk/res/android"   
4.  android:minWidth="100dp"   
5.  android:minHeight="100dp" 
6.  android:initialLayout="@layout/main"   
7.  android:updatePeriodMillis="1000" > 
8. </appwidget-provider> 
minWidth和minHeight是widget的最小宽度和高度,这个值是一个参考值,系统会根据实际情况进行改 变,initialLayout属性指明了widget的视图布局文件,updatePeriodMillis属性是widget每隔多久更新一次的时 间,单位为毫秒。
(4)接下来就是界面布局,在这个示例中只需要一个TextView控件就可以,代码如下:
1. <?xml version="1.0" encoding="utf-8"?> 
2. <LinearLayout xmlns:android="schemas.android/apk/res/android" 
app开发实例3.     android:orientation="vertical" 
4.     android:layout_width="fill_parent" 
5.     android:layout_height="fill_parent" 
6.     > 
7. <TextView   
8.     android:layout_width="fill_parent"   
9.     android:layout_height="wrap_content"   
10.     android:text="@string/hello" android:id="@+id/text"/> 
11. </LinearLayout> 
准备工作完毕,接下来完善继承自AppWidgetProvider的自定义类,重写onUpdate(Context, AppWidgetManager,int[])函数,代码如下:
1. package com.dt.time; 
2.    
3. import java.util.Date; 
4.    
5. import android.appwidget.AppWidgetManager; 
6. import android.appwidget.AppWidgetProvider; 
7. import&t.Context; 
8. import android.widget.RemoteViews; 
9.    
10. public class widget extends AppWidgetProvider { 
11.    
12.    @Override 
13.    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { 
14.       // TODO Auto-generated method stub 
15.       super.onUpdate(context, appWidgetManager, appWidgetIds); 
16.        
17.       //1. 获取当前时间 
18.       Date now = new Date(); 
19.       String strNow =&LocaleString(); 
20.       //2. 获取RemoteViews对象 
21.       RemoteViews views = new PackageName(), R.layout.main); 
22.       //3. 显示时间到widget 
23.       views.setTextViewText(, strNow); 
24.       //4. 更新widget 
25.       appWidgetManager.updateAppWidget(appWidgetIds, views); 
26.    } 
27.
之后运行写好的widget查看下成果,widget的启动与普通程序不同,它不会在程序列表中显示,而是要长按桌面在弹出的列表中选择Widgets项目,之后选择本示例time。
widget的扩展更新方法
在上例中widget更新是通过定时方式实现的,在普通情况下这种更新方式已经足够了,但是对于某些应用使用定时方式更新显得就不够用了。比如短信 提示,当有新的短信到来时我们希望能够实时的更新widget,如果还是用定时更新显然是不行的,那么能不能让widget接受除 appwidget_update之外的系统消息呢?答案是可以的。
仔细查看下文档后可以发现,widget只是一个receiver,既然是receiver那么也就可以接受所有的系统消息了,接下来使用短信提醒示例来演示widget接受系统其他消息的方式,本例中将只前一示例进行修改。
(1)修改l文件,向其中添加android.provider.Telephony.SMS_RECEIVED监听事件,代码如下:
1. <receiver android:name=".widget" > 
2.    <intent-filter> 
3.        <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> 
4.        <action android:name="android.provider.Telephony.SMS_RECEIVED" />   
5.    </intent-filter> 
6.    <meta-data android:name="android.appwidget.provider" 
7.                     android:resource="@xml/widget_provider" /> 
8. </receiver> 
添加了这个短信监听事件后,我们就已经向widget添加了监听短信的功能了,实际操作非常
简单。
接下来需要添加一个阅读短信的权限,在l中任意位置添加<uses-permission android:name="android.permission.RECEIVE_SMS" />
(2)然后还需要修改下l文件,将其中的updatePeriodMillis属性设为0,也就是不定时更新,这样可以展示这个widget是实时更新的。
(3)之后修改AppWidgetProvider的子类,使其将短信内容显示到widget上。在本示例中我们将不再修改 onUpdate(Context, AppWidgetManager,int[])函数,而是重写onReceive(Context context, Intent intent)函数,这个函数其实能够实现包括onUpdate在内的所有函数功能,代码如下:

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