Widget初学者文档之Widget开发初体验

移动开发
Widget初学者文档之Widget开发初体验是本文要介绍的内容,主要是来了解并学习Widget应用及开发,具体内容的实现来看本文详解。

Widget初学者文档之Widget开发初体验是本文要介绍的内容,主要是来了解并学习Widget应用及开发,具体内容的实现来看本文详解。

要构建一个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);  
  • 1.
  • 2.

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> 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

这段代码中大致表示了以下意思

<receiver android:name="MyAppWidget">  
  • 1.

这里声明了一个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" />  
  • 1.

这里声明了一个媒体对象,指向了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"?> 
ppwidget-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> 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.

该文件提供了如下 信息:

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{    
 .....    
 }<BR>  
  • 1.
  • 2.
  • 3.

该类从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 <SPAN style="COLOR: #0000ff"><</SPAN> 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);    
     }    
 }  
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.

该方法有三个参数

Context context上下文环境,

AppWidgetManager appWidgetManager:widget管理器int[] appWidgetIds:该类的所有实例widget的id组

该方法注册了一个待定的意向(PendingIntent ),并将该意向绑定到widget中的一个button,当该button被点击的时候将触发

Intent("ice4c.test.intent.BtnDown");  
  • 1.

的动作,并将其广播出去,由于AndroidManifest.xml中声明了

<action android:name="ice4c.test.intent.BtnDown"> 
</action>  
  • 1.
  • 2.

这个动作由MyAppWidget.java处理,因此onReceive(Context, Intent)将收到Intent("ice4c.test.intent.BtnDown"); 并对其进行处理。

 <H5>此时widget就已经可以完成了,但是若widget_provider.xml 中声明了

<SPAN style="COLOR: #ff0000">android</SPAN>:  
<SPAN style="COLOR: #ff0000">configure</SPAN>=  
<SPAN style="COLOR: #0000ff">"  
ice4c.test.AppWidgetConfigure"</SPAN>    
  • 1.
  • 2.
  • 3.
  • 4.

2 ,那么就还需要一个类,对widget进行配置。 </H5>

构建AppWidgetConfigure.java

AppWidgetConfigure是一个常规的Activity,但需要在AndroidManifest.xml中添加一个<Activity> xml代码

<SPAN style="COLOR: #0000ff"> 
  <</SPAN><SPAN style="COLOR: #800000">activity</SPAN>   
   <SPAN style="COLOR: #ff0000">android</SPAN>:  
   <SPAN style="COLOR: #ff0000">name</SPAN>=  
   <SPAN style="COLOR: #0000ff">".AppWidgetConfigure"</SPAN> 
   <SPAN style="COLOR: #0000ff">></SPAN>    
  <SPAN style="COLOR: #0000ff"><</SPAN> 
  <SPAN style="COLOR: #800000">intent</SPAN>-  
  <SPAN style="COLOR: #ff0000">filter</SPAN> 
  <SPAN style="COLOR: #0000ff">></SPAN>     
   <SPAN style="COLOR: #0000ff"><</SPAN><SPAN style="COLOR: #800000">action</SPAN>   
   <SPAN style="COLOR: #ff0000">android</SPAN>:<SPAN style="COLOR: #ff0000">name</SPAN>=  
   <SPAN style="COLOR: #0000ff">"android.appwidget.action.APPWIDGET_CONFIGURE"</SPAN>   
   <SPAN style="COLOR: #0000ff">/></SPAN>     
 <SPAN style="COLOR: #0000ff"></</SPAN> 
 <SPAN style="COLOR: #800000">intent</SPAN>-filter<SPAN style="COLOR: #0000ff">></SPAN>    
 <SPAN style="COLOR: #0000ff"></</SPAN> 
 <SPAN style="COLOR: #800000">activity</SPAN><SPAN style="COLOR: #0000ff">></SPAN>  
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.

在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);     
 }  
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.

对widget进行配置

配置完成使用AppWidgetManager 的getInstance(context)方法获得widget管理器的实例java代码

AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);  
  • 1.

通过updateAppWidget(mAppWidgetId, RemounViews)的方式更新widgetjava代码

RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.example_appwidget);     
appWidgetManager.updateAppWidget(mAppWidgetId, views);  
  • 1.
  • 2.

生成返回的Intent,设置返回值,结束Activityjava代码

Intent resultValue = new Intent();     
 resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId);     
 setResult(RESULT_OK, resultValue);     
finish(); 
  • 1.
  • 2.
  • 3.
  • 4.

另外,可以在Activity创建时设置setResult(RESULT_CANCELED);若配置时用户按返回键,则不会创建任何实例。

终于写完了,不过其中还有许多不懂的地方,以后的学习中慢慢再了解吧。

小结:Widget初学者文档之Widget开发初体验的内容介绍完了,希望通过Widget开发初体验内容的学习能对你有所帮助。

责任编辑:zhaolei 来源: 博客园
相关推荐

2011-09-08 10:38:37

Widget

2011-09-14 09:49:41

Android开发

2011-08-04 18:01:07

IOS Cocoa Touc

2011-08-10 16:44:56

iPhone代理设计模式

2011-09-07 14:20:42

Android Wid组件

2011-08-24 09:54:05

Lua字符春交互

2011-04-12 10:13:24

2011-09-16 09:38:19

Emacs

2022-04-24 15:21:01

MarkdownHTML

2011-08-10 19:01:18

Objective-C

2011-08-17 12:03:36

Objective-C

2011-08-29 15:45:59

Lua函数

2011-06-21 10:12:22

QT 窗口 刷新

2011-08-25 15:51:10

Lua脚本

2011-08-24 17:19:20

Lua源文件

2011-08-12 10:27:52

Objective-C对象

2011-08-11 10:50:08

xcode调试文件

2011-08-02 14:48:04

IOS 多任务

2011-09-09 20:14:58

Android Wid

2010-07-13 09:02:19

Widget开发
点赞
收藏

51CTO技术栈公众号