Widget应用学习笔记

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

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

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

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

然后重写onUpdate()方法

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

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.

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的属性

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

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

widget配置activity

public WidgetConfigure extends Activity  
{  
    onCreate()...  
     .....  

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

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

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

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

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

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

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

定时更新widget

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

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

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

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

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

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

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

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

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

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

2011-09-07 16:36:00

Qt Widget

2011-09-07 17:19:16

Web widget

2011-09-07 11:15:25

2011-09-07 10:34:48

Android Wid

2011-09-07 16:28:46

QT WidgetQWidget

2011-09-08 15:40:45

Android Wid组件

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 14:50:51

JavascriptWidget

2011-09-08 17:48:33

Web Widget

2011-09-09 19:23:52

Widget

2011-09-09 13:59:17

Android wid

2011-03-08 16:30:24

Proftpd

2011-08-09 17:29:29

iPhone文件屏幕

2011-09-07 13:42:36

Android Wid实例

2011-09-08 13:11:07

Android Wid实例

2011-09-07 13:00:36

2011-08-19 15:16:41

XCodeUserScripts脚本

2011-08-08 14:57:46

iPhone Autoreleas Property
点赞
收藏

51CTO技术栈公众号