widget

研究了一个星期的android,还一直处于看的阶段,在网上下载了高焕堂老师的讲义,一步一步的按图索骥,总算是对android的一些机制原理有了些模糊的概念,但似乎高焕堂老师的讲义里并没有提到widget,但自己又特别喜欢这种可以放在桌面上的小玩意,很神奇。

其实一直梦想着有自己的桌面小程序,做个给自己玩,今天重点看了widget,算是对widget有了初步的了解吧,自己看英文的api,整理了一下思路,大致是如此了。

要构建一个widget ,需要组织以下内容
  • 在AndroidManifest.xml声明一个意向接收者<receiver >
    • AndroidManifest.xml是android应用的结构解析文件,安装程序的时候android虚拟机会从该文件中读取应用的组成和结构,生成应用图标、名称等。并为应用中的接收器注册事件(意向)。
    • 所谓的意向(Intent:翻译为意向或目的)在android中似乎很常用,一个Activity启动另外一个Activity就是用的意向呼叫的形式
    • java代码Intent in = new Intent(ex12.this, rgActivity.class);  
      startActivityForResult(in,RG_REQUEST);

      android在某一事件(意向)发生时会将该意向在相应的命名空间中以广播(broadcast)的形式发布出去,已在命名空间中注册了该意向的意向接收器都会接收到它,并根据需要进行处理。
    • 所以,构建一个widget,首先需要声明它作为一个receiver ,即在AndroidManifest.xml文件内的<application>节点下加入一个recever节点   

    xml代码
     
         
    < receiver android: name= "MyAppWidget" > < intent- filter > < action android: name= "android.appwidget.action.APPWIDGET_UPDATE" > </ action > < action android: name= "ice4c.test.intent.BtnDown" > </ action > </ intent-filter > < meta- data android: name= "android.appwidget.provider" android: resource= "@xml/widget_provider" /> </ receiver >
  • 这段代码中大致表示了以下意思

<receiver android:name="MyAppWidget">

这里声明了一个recever,它指向工程中定义的[package].MyAppWidget.java的类,亦即使用MyAppWidget.java来接收【android.appwidget.action.APPWIDGET_UPDATE】和【ice4c.test.intent.BtnDown】这两个动作的意向,因此当该应用中广播了这两个意向,这两个意向就会被MyAppWidget.java类接收。其中【android.appwidget.action.APPWIDGET_UPDATE】这一个动作是在widget被添加到桌面时触发的,而【ice4c.test.intent.BtnDown】则是自定义的一个动作。

<meta-data android:name="android.appwidget.provider" android:resource="@xml/widget_provider" />

这里声明了一个媒体对象,指向了android.appwidget.provider,并声明它的源res/xml/widget_provider.xml,即使用该xml来进行该widget的配置。

构建上一步提到的widget_provider.xml
  • 上一步的<meta-data >将android.appwidget.provider的源指向widget_provider.xml,于是android的widget管理器会生成相应的菜单,及在桌面菜单的widget中提供添加该小应用的入口。而widget_provider.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/widget_layout" android: configure= "ice4c.test.AppWidgetConfigure" > </ appwidget-provider >
  • 该文件提供了如下 信息:

    • android:minWidth="294dp":widget的最大宽度

    • android:minHeight="72dp":widget的最大高度

    • android:updatePeriodMillis="86400000" :widget的刷新时间,即从widget添加到桌面之后再次触发MyAppWidget.java中onUpdate()方法的周期。

    • android:initialLayout="@layout/widget_layout" :使用res/layout/widget_layout.xml文件来进行该widget的初始化布局。

    • android:configure="ice4c.test.AppWidgetConfigure" 为widget的高级配置文件,指向一个Activity,该Activity提供对添加的widget进行初始化配置的功能

      • 【注意】:若使用了该选项,则MyAppWidget.java中的的OnEnlable将会失效,因此初始化的过程需要在AppWidgetConfigure.java的onCreate()中进行。

构建MyAppWidget.java
  • 第一步的receiver中指向了MyAppWidget,该类继承AppWidgetProvider

    java代码
    public class MyAppWidget extends AppWidgetProvider{
    .....
    }
  • 该类从AppWidgetProvider继承了如下方法,需要的时候可以覆盖这些方法来实现对应的功能
    • onUpdate(Context, AppWidgetManager, int[]) :该方法在widget被添加到桌面或刷新(android:updatePeriodMillis周期)widget时被触发,用来对widget进行更新。(但若定义了android:configure,则添加时不会触发该方法)。
    • onDeleted(Context, int[]):该方法在widget被删除的时候触发。
    • onEnabled(Context):第一次添加该应用时触发该方法,可用作初始化静态变量或作全局数据库的配置。
    • onDisabled(Context):最后一个应用被删除时触发该方法,可用作清理残留的相关数据。
    • onReceive(Context, Intent):与应用相关的intent被接收时触发,包括框架中定义的android.appwidget.action.APPWIDGET_UPDATE和自定义的“ice4c.test.intent.BtnDown”等,克依据对应的intent进行处理。
  • onUpdate的定义
    java代码
    	public void onUpdate(Context context, AppWidgetManager appWidgetManager,
    			int[] appWidgetIds) {
    		// TODO Auto-generated method stub
    //		super.onUpdate(context, appWidgetManager, appWidgetIds);
    		Log.i("widget", "update");
    		int N = appWidgetIds.length;
    		for( int i = 0 ; i < N ; i++ ){
    			int appId = appWidgetIds[i]; 
    			Intent intent = new Intent("ice4c.test.intent.BtnDown");
    			PendingIntent pendingintent = PendingIntent.getBroadcast(context, 0, intent, 0);
    			remoteV.setOnClickPendingIntent(R.id.wg_btn, pendingintent);
    			appWidgetManager.updateAppWidget(appId, remoteV);
    			
    		}
    	}

  • 该方法有三个参数
    • Context context上下文环境,
    • AppWidgetManager appWidgetManager:widget管理器
    • int[] appWidgetIds:该类的所有实例widget的id组
  • 该方法注册了一个待定的意向(PendingIntent ),并将该意向绑定到widget中的一个button,当该button被点击的时候将触发Intent("ice4c.test.intent.BtnDown"); 的动作,并将其广播出去,由于AndroidManifest.xml中声明了<action android:name="ice4c.test.intent.BtnDown"></action> 这个动作由MyAppWidget.java处理,因此onReceive(Context, Intent)将收到Intent("ice4c.test.intent.BtnDown"); 并对其进行处理。
此时widget就已经可以完成了,但是若widget_provider.xml 中声明了android:configure="ice4c.test.AppWidgetConfigure" ,那么就还需要一个类,对widget进行配置。
构建AppWidgetConfigure.java
    • AppWidgetConfigure是一个常规的Activity,但需要在AndroidManifest.xml中添加一个<Activity> xml代码
      <activity android:name=".AppWidgetConfigure">
      	    	    <intent-filter> 
              			<action android:name="android.appwidget.action.APPWIDGET_CONFIGURE" /> 
          			</intent-filter>
      	    </activity>

    • 在widget被添加到桌面的时候,将会启动该Activity,提供界面和互动对相应的widget进行配置。有名的“七键开关”就是使用的这样的方式对添加到桌面的widget进行配置的。
      • 【注意】在AppWidgetConfigure运行时将不会触发MyAppWidget.java的onUpdate(),因此需要在onCreate()中手动调用该方法进行配置,但该方法会在之后的update中被调用。
    • 配置widget的一般步骤(android api中提供的步骤):
      • 从启动这个Activity的Intent获得widget的idjava代码
        Intent intent = getIntent(); 
        Bundle extras = intent.getExtras(); 
        if (extras != null) { 
            mAppWidgetId = extras.getInt( 
                    AppWidgetManager.EXTRA_APPWIDGET_ID,  
                    AppWidgetManager.INVALID_APPWIDGET_ID); 
        }

      • 对widget进行配置
      • 配置完成使用AppWidgetManager 的getInstance(context)方法获得widget管理器的实例java代码
        AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);

      • 通过updateAppWidget(mAppWidgetId, RemounViews)的方式更新widgetjava代码
        RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.example_appwidget); 
        appWidgetManager.updateAppWidget(mAppWidgetId, views);

      • 生成返回的Intent,设置返回值,结束Activityjava代码
        Intent resultValue = new Intent(); 
        resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId); 
        setResult(RESULT_OK, resultValue); 
        finish();
      • 另外,可以在Activity创建时设置setResult(RESULT_CANCELED);若配置时用户按返回键,则不会创建任何实例。
终于写完了,不过其中还有许多不懂的地方,以后的学习中慢慢再了解吧。

转载于:https://www.cnblogs.com/ice4c/archive/2010/09/29/1838706.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值