Widget应用学习笔记

移动开发
Widget应用学习笔记是本文要介绍的内容,主要是来了解并学习Widget应用,具体内容的实现来看本文详解。

Widget应用学习笔记是本文要介绍的内容,主要是来了解并学习Widget应用,Widget小组件可以放在android桌面上的小组件,其中的布局只支持ImageView TextView Button等简单组件。

下面以在桌面上显示Hello World!为例

首先建立自己Widget类 必须要继承AppWidgetProvider 

然后重写onUpdate()方法

  1. public class MyWidget extends AppWidgetProvider {  
  2.     @Override  
  3.     public void onUpdate(Context context, AppWidgetManager appWidgetManager,  
  4.             int[] appWidgetIds) {  
  5.         //获得一个远程试图对象  
  6.         RemoteViews  views = new RemoteViews(context.getPackageName(), R.layout.main);  
  7.         //修改试图中的文本  
  8.         views.setTextViewText(R.id.text, "Hello World!" );  
  9.         //更新widget  
  10.         appWidgetManager.updateAppWidget(appWidgetIds, views);  
  11.     }  

onUpdate方法中context参数是向widget发送更新请求的上下文环境,appWidgetmanager可以当作整个widget的管理者,它的updateAppWidget()方法可以更新指定wighet的view,appWidgetIds系统发出更新请求时更新的所有widget的ID集合,新建widget时整个数组中只有一个值就是当前widget的id,1.5版本后固定每30分钟系统会自动更新一次widget,系统自动更新,重启手机时都会执行onUpdate方法这时appWidgetIds就是桌面上所有widget的ID的集合。

写一个appwidget.xml文件设置widget的属性

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <appwidget-provider 
  3. xmlns:android="http://schemas.android.com/apk/res/android"   
  4.   android:minWidth="144dip" android:minHeight="72dp" 
  5. android:configure="com.iee_2005.weather.WidgetConfigure" 
  6. android:initialLayout="@layout/main"> 
  7. </appwidget-provider> 

其中 minWidth属性是widget窗口最小宽度 minHeight属性是widget的最小高度initaialLayout是widgit的布局文件configure 属性是widget的配置activity的名称(注意:必须把包名也写全)这个属性可以没有,如果定义了这个属性那么添加widget的时候会先打开这里指定的activity用来配置这个widget   还有一个updatePeriodMillis属性是用来设置自动更新时间的但在1.5版本后已经废除改为固定30分钟

widget配置activity

  1. public WidgetConfigure extends Activity  
  2. {  
  3.     onCreate()...  
  4.      .....  

注意这个activity在AndroidManiFest中注册时的写法

  1. <activity android:name=".WidgetConfigure"> 
  2.             <intent-filter> 
  3.                 <action android:name="android.appwidget.action.APPWIDGET_CONFIGURE" /> 
  4.             </intent-filter> 
  5.  
  6. </activity> 

然后再androidManiFest.xml中注册widget,这里可以看到widget其实一就是一个广播接收器

  1. <receiver android:name=".MyWidget" android:label="时间"> 
  2.            <intent-filter > 
  3.                <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> 
  4.            </intent-filter> 
  5.            <meta-data android:name="android.appwidget.provider" 
  6.             android:resource="@xml/appwidget"/> 
  7.    </receiver> 

应该是必须这么写 resource属性的值是widget配置文件的位置

然后运行 在手机桌面上长按或 点menu键->添加  添加小组件  找到我们写的widget就可以看到效果了

定时更新widget

从sdk1.5以后appwidget.xml文件中的updatePeriodMillis属性被废除了 所以不能用直接修改updatePeriodMillis属性来实现定时更新widget

想要定时更新widget就要用Service,创建一个Service用来计时并更新widget内容 在widget被调用时开启服务public class MyService extends Service implements Runnable{

  1.   private AppWidgetManager appWidgetManager;  
  2.   private ComponentName componentName;  
  3.   private Handler mHandler;  
  4.   private int h,m,s;  
  5.   private String text;  
  6.   private SimpleDateFormat dateFormat;  
  7.   /*  
  8.  
  9.  * 此方法为Service必须有的方法  此例中没有用到  
  10.  
  11.   */  
  12.  
  13.  public IBinder onBind(Intent intent) {  
  14.       return null;  
  15.   }  
  16.  
  17.  /*  
  18.  
  19.  *  服务创建时执行整个方法 一般用来初始化  
  20.  
  21.  */  
  22.   public void onCreate() {  
  23.       appWidgetManager = AppWidgetManager.getInstance(getApplicationContext());  
  24.       componentName = new ComponentName(getApplicationContext(), MyWidget.class);  
  25.       mHandler = new Handler();  
  26.       dateFormat = new SimpleDateFormat("yyyy-mm-dd hh:mm:ss");  
  27.         
  28.   }  
  29.   /*  
  30.  
  31.   * 开始服务  ,如果服务已经存在 每次应用发送服务移动时执行一次onStart方法而不执行onCreate  
  32.  
  33. 这里使用Handler实例对象上传一个线程到UI线程列队中用来更新widget的UI即Views  
  34.  
  35.  */      
  36.  
  37.   public void onStart(Intent intent, int startId) {  
  38.       mHandler.post(this);  
  39.   }  
  40.   /*  
  41.  
  42. * 服务被销毁时执行此方法,撤销更新线程  
  43.  
  44. */  
  45.  
  46.  
  47.   public void onDestroy() {  
  48.       Log.i("mylog","stop");  
  49.       mHandler.removeCallbacks(this);  
  50.   }      
  51.  
  52. /*  
  53.  
  54. *更新widget的views的线程  
  55.  
  56. /  
  57.  
  58.   public void run() {  
  59.       RemoteViews views = new RemoteViews(getApplicationContext().getPackageName(),R.layout.main);  
  60.       views.setTextViewText(R.id.text, dateFormat.format(new Date()));  
  61.       appWidgetManager.updateAppWidget(componentName, views);  
  62.       mHandler.postDelayed(this, 1000);  
  63.       Log.i("mylog", "update");  
  64.   }  

然后记得在AndroidManiFest文件中注册Service

  1. <service android:name=".MyService"> 
  2.             <intent-filter > 
  3.                 <action android:name="com.UPDATE_TIME"/> 
  4.             </intent-filter> 
  5. </service> 

这样service就创建完毕了,最后在widget中的onUpdate方法中开启服务

  1. public void onUpdate(Context context, AppWidgetManager appWidgetManager,  
  2.             int[] appWidgetIds) {  
  3.       Intent service = new Intent("com.UPDATE_TIME");  
  4.  
  5.   context.startService(service);  
  6.  
  7.     } 

这就实现了一个可以显示系统时间并自动根新的widget。

小结:Widget应用学习笔记的内容介绍完了,希望通过Widget内容的学习能对你有所帮助!

责任编辑:zhaolei 来源: 互联网
相关推荐

2011-09-07 16:36:00

Qt Widget

2011-09-07 11:15:25

2011-09-07 17:19:16

Web widget

2011-09-07 10:34:48

Android Wid

2011-09-08 15:40:45

Android Wid组件

2011-09-07 16:28:46

QT WidgetQWidget

2011-09-08 16:07:13

Widget配置文件

2011-09-08 11:18:53

Widget

2011-09-09 17:59:26

QT Widget

2011-09-08 17:48:33

Web Widget

2011-09-08 14:50:51

JavascriptWidget

2011-09-09 19:23:52

Widget

2011-08-09 17:29:29

iPhone文件屏幕

2011-03-08 16:30:24

Proftpd

2011-09-09 13:59:17

Android wid

2011-09-08 13:11:07

Android Wid实例

2011-09-07 13:42:36

Android Wid实例

2011-09-07 13:00:36

2011-08-08 14:57:46

iPhone Autoreleas Property

2011-08-19 15:16:41

XCodeUserScripts脚本
点赞
收藏

51CTO技术栈公众号