Android的Widget

Android的AppWidget的概念不好理解啊,我也不知道理解得对不对,先记在这里,以免以后又忘记了。
(1) 建立一个Android工程,用eclispse吧,下一步,下一步的就不多说了。
(2) 在res/xml目录下面建立一个xml文件。命名随便吧。写下如下内容
1 <? xmlversion="1.0"encoding="utf-8" ?>
2 < appwidget-provider
3 xmlns:android ="http://schemas.android.com/apk/res/android"
4 android:initialLayout ="@layout/widget_layout_small"
5 android:minWidth ="72dip" android:minHeight ="72dip" android:updatePeriodMillis ="3600000" >
6 </ appwidget-provider > 这里是定义一个appwidget-provider,Android系统从这里认为该程序是一个widget程序。android:initialLayout指定布局文件,也就是在res/layout目录下的那些个xml文件;android:updatePeriodMillis知道更新周期,单位为毫秒;还有一个android:configure,这个是可选的,如果你的widget事先要启动一个Activity,就需要在这里指定一个Activity,显然我们这里不需要。他就是一个AppWidgetProviderInfo类的描述信息。
(3) 写布局文件,这个就不多说了。
(4) appwidget-provider,定义一个类,从AppWidgetProvider类继承,他实际是一个BroadcastReceiver,系统使用它和Widget界面进行交互。
1 package cn.vaga.today;
2
3 import java.util.Calendar;
4
5 import android.app.PendingIntent;
6 import android.appwidget.AppWidgetManager;
7 import android.appwidget.AppWidgetProvider;
8 import android.content.ComponentName;
9 import android.content.Context;
10 import android.content.Intent;
11 import android.graphics.Canvas;
12 import android.text.format.Time;
13 import android.widget.RemoteViews;
14
15 public class TodayDateSmall extends AppWidgetProvider
16 {
17//当这个AppWidget提供者被要求提供RemoteViews一系列的AppWidgets,这个方法作为ACTION_APPWIDGET_UPDATE
18//广播回复时被调用
19//每次更新AppWidget时候调用
20@Override
21publicvoidonUpdate(Contextcontext,AppWidgetManagerappWidgetManager,int[]appWidgetIds){
22//得到更新后的RemoteViews
23RemoteViewsupdateView=buildUpdate(context);
24//更新Widget的RemoteViews
25appWidgetManager.updateAppWidget(appWidgetIds,updateView);
26super.onUpdate(context,appWidgetManager,appWidgetIds);
27}

28
29privateString[]months={"一月","二月","三月","四月",
30"五月","六月","七月","八月",
31"九月","十月","十一月","十二月"}
;
32
33
34privateRemoteViewsbuildUpdate(Contextcontext){
35RemoteViewsupdateView=null;
36//这个Time更快
37//Timetime=newTime();
38//现在
39//time.setToNow();
40Calendarcal=Calendar.getInstance();
41Stringmonth=months[cal.get(Calendar.MONTH)];
42//得到RemoteViews
43updateView=newRemoteViews(context.getPackageName(),R.layout.widget_layout_small);
44//设置View的内容
45//日期
46updateView.setTextViewText(R.id.Date,String.valueOf(cal.get(Calendar.DATE)));
47//
48updateView.setTextViewText(R.id.Month,month);
49Lunarlunar=newLunar(cal);
50updateView.setTextViewText(R.id.Lunar,lunar.toString());
51//OK,这个一个运行用的Intent啦
52//加下面这段应该只是为了让Widget相应click事件吧
53IntentlaunchIntent=newIntent();
54//设置处理该Intent的组件,这里是android自带的日期启动组件
55launchIntent.setComponent(newComponentName("com.android.calendar","com.android.calendar.LaunchActivity"));
56//设置该Itent为主进入点
57launchIntent.setAction(Intent.ACTION_MAIN);
58launchIntent.addCategory(Intent.CATEGORY_LAUNCHER);
59launchIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
60//启动指定的Intent的Activity
61PendingIntentintent=PendingIntent.getActivity(context,0,launchIntent,0);
62//监听点击事件
63updateView.setOnClickPendingIntent(R.id.SmallBase,intent);
64returnupdateView;
65}

66}

67
68 他有四个方法:onDeleted、onEnabled、onDisabled、onUpdate,我们这里只实现了最主要的onUpdate方法,他在周期更新的时候调用。每次调用就用appWidgetManager来更新Widget(生成一个RemoteView)。appWidgetManager是系统生成的用于管理Widget的对象,我们不需要进行管理,它会向AppWidgetProvider发通知,他会更新Widget的UI。

(5) AndroidManifest.xml
1 <? xmlversion="1.0"encoding="utf-8" ?>
2 < manifest xmlns:android ="http://schemas.android.com/apk/res/android"
3 package ="cn.vaga.today"
4 android:versionCode ="1"
5 android:versionName ="1.0" >
6 < application android:icon ="@drawable/icon" android:label ="@string/app_name_small" >
7 <!-- 订阅指定的BroadcastReceiver -->
8 < receiver android:label ="@string/app_name_small" android:name =".TodayDateSmall" >
9 < intent-filter >
10 <!-- 就只处理更新的广播 -->
11 < action android:name ="android.appwidget.action.APPWIDGET_UPDATE" ></ action >
12 </ intent-filter >
13 < meta-data android:name ="android.appwidget.provider" android:resource ="@xml/widget_small" ></ meta-data >
14 </ receiver >
15 </ application >
16 < uses-sdk android:minSdkVersion ="7" />
17
18 </ manifest >
在这里注册AppWidgetRecever指定其处理的Intent的Action为android.appwidget.action.APPWIDGET_UPDATE。当然还要个AppWidgetRecever指定它的描述文件
<meta-data android:name="android.appwidget.provider" android:resource="@xml/widget_small"></meta-data>,这是很必要的,否则Android也不会知道这个Widget到底是如何定义的了。

更多相关文章

  1. NPM 和webpack 的基础使用
  2. 【阿里云镜像】使用阿里巴巴DNS镜像源——DNS配置教程
  3. 安装 Android(安卓)2.3 could not find adb.exe
  4. 第一个PhoneGap程序以及错误解决
  5. [android] 保存文件到手机内存
  6. android 开发中遇到的ERROR经常长期更新笔记
  7. Android(安卓)根文件系统分析(1)
  8. android binder机制之--(我是Service Manager)
  9. 移动开发:fb的-app.xml文件

随机推荐

  1. Android(安卓)电子罗盘开发。
  2. android 基于百度地图api获取经纬度
  3. Android(安卓)Html解析
  4. [Android]ListView & ViewPager & GridVi
  5. Android使用ImageView引起Missing conten
  6. 三、Android下拉框实现
  7. android log
  8. Android(安卓)Animation 动画效果介绍
  9. 安卓环境搭建
  10. Android怎么去除Dialog对话框的白色边框