AppWidget初步入门

摘要:
AppWidget就是HomeScreen上显示的小部件,提供直观的交互操作。同一个Widget部件可以同时创建多个。AppWidget的实现主要涉及到以下类:1、AppWidgetProvider:继承自BroadcastRecevier,在AppWidget应用update、enable、disable和delete时接收通知。更新AppWidget的相关状态,获取已安装AppWidget的状态和其它相关AppWidget的状态4、RemoteViews:一个可以在其他应用进程中运行的类,向AppWidgetProvider发送通知。

AppWidget 就是HomeScreen上显示的小部件,提供直观的交互操作。通过在HomeScreen中长按,在弹出的对话框中选择Widget部件来进行创建,长 按部件后并拖动到垃圾箱里进行删除。同一个Widget部件可以同时创建多个。

AppWidget的实现主要涉及到以下类:
1AppWidgetProvider :继承自 BroadcastRecevier , 在AppWidget 应用 updateenabledisable delete 时接收通知。其中,onUpdateonReceive 是最常用到的方法,它们接收更新通知。


2AppWidgetProvderInfo:描述 AppWidget 的大小、更新频率和初始界面等信息,以XML 文件形式存在于应用的 res/xml/目录下。


3AppWidgetManger :负责管理 AppWidget ,向 AppwidgetProvider 发送通知。更新AppWidget的相关状态,获取已安装AppWidget的状态和其它相关AppWidget的状态

4RemoteViews :一个可以在其他应用进程中运行的类,向 AppWidgetProvider 发送通知。一个描述了可以在其他进程中显示的view层,它inflate于layout资源文件,并且这个类对提供一些基本操作修改view内容

一、首先需要提供一个定义了Widget界面布局的XML文件(位于res/layout/..),需要注意的是使用的组件必须是RemoteViews所支 持的,目前原生API中支持的组件如下:

FrameLayout
LinearLayout
RelativeLayout
AnalogClock
Button
Chronmeter
ImageButton
ImageView
ProgressBar
TextView
ViewFlipper
ListView
GridView
StackView
AdapterViewFlipper

*如果使用了除此之外的组件,则在Widget创建时会导致android.view.InflateExceptionn异常。

二、然后需要提供一个xml文件来定义Widget的基本属性,放置到res/xml/..目录下。
如果使用的是Eclipse可按如下操作:
1) res/目录下创建xml/目录
2)创建xml文件(名字可任意),选择类型为AppWidgetProvider
3)在弹出的便捷界面进行参数设置
主要设置的参数如下:
minWidth: 定义Wdiget组件的宽度
minHeight: 定义Wdiget组件的高度
updatePeriodMillis: 更新的时间周期
initialLayout: Widget的布局文件
configure: 如果需要在启动前先启动一个Activity进行设置,在这里给出Activity的完整类名(后面会说到,与一般Activity的实现有些许差别)
*Widget大小的计算 :(单元格数*74)-2API上说是为了防止像素计算时的整数舍入导致错所以-2...不是很明白

上代码,先上效果图:

AppWidget初步入门第1张AppWidget初步入门第2张

11、先在res\layout中新建一个 main.xml 的文件里面内容如下:这个XML文件是AppWidget的布局文件

AppWidget中只有一个布局文件就是一个Button

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <Button 
        android: 
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="飞鱼"
        />

</LinearLayout>

12、在res目录下新建一个xml目录,这个xml目录存放AppWidget的相关信息,在xml目录下新建一个 appwidgetinfo.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/main"
  >
</appwidget-provider>

minWidth:AppWidget的宽度

minHeight:AppWidget的高度

updatePeriodMillis:更新频率。主要用于执行AppWidgetProvider中的Update()函数

initialLayout = "@layout/main":指明AppWidget的布局文件

13、新建一个MyWidget的类继承自AppWidgetProvider

public class MyWidget extends AppWidgetProvider {

//	private static final String TAG = "MyWidget";
	private static final String broadcastString = "com.fy.MyWidget";

	// 每当一个Widget被删除的时候调用此函数
	@Override
	public void onDeleted(Context context, int[] appWidgetIds) {
		// TODO Auto-generated method stub
		super.onDeleted(context, appWidgetIds);
	}

	// 当最后一个Widget被删除的时候调用此函数
	// 在此方法中一般情况下执行一些AppWidget的结束性操作,如删除一个临时数据库等操作。
	@Override
	public void onDisabled(Context context) {
		// TODO Auto-generated method stub
		super.onDisabled(context);
	}

	// 当第一个Widget被创建的时候调用此函数
	// 在此方法中一般情况下执行一些AppWidget的初始化的工作,如新建一个数据库或者一些操作等
	@Override
	public void onEnabled(Context context) {
		// TODO Auto-generated method stub
		super.onEnabled(context);
	}

	// 调用其它函数时先调用此函数
	// onReceive相当一个经理,当外界来任务了,将任务分发给其下的员工(onEnable,onDeleted,onDisabled,onUpdate)处理 
	@Override
	public void onReceive(Context context, Intent intent) {
		
		if(intent.getAction().equals(broadcastString)) {
			RemoteViews remotesViews = new RemoteViews(context.getPackageName(), R.layout.main);
			remotesViews.setTextViewText(R.id.btn, "FY");
			
			// 获取AppWidgetManager更新appWidget的实例
			AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
			
			// 组件名称
			ComponentName componentName = new ComponentName(context, MyWidget.class);
			appWidgetManager.updateAppWidget(componentName, remotesViews);
		}
		
		super.onReceive(context, intent);
	}

	// 在这里onUpdate执行的条件有两个:1、到了我们所设定的更新周期了;2、添加一个新的AppWidget。 
    // 在onUpdate中一般为控件定义事件处理或者开启一个临时的Service。 
    // 这里是为我们的button控件添加点击事件处理 
    // context表示这个接收器正在运行的环境 
    // appWManager表示AppWidget的管理器可通过调用updateAppWidget(ComponentName, RemoteViews)更改指定AppWidget的控件属性 
    // appWidgetIds表示Appwidget的编号,系统自动生成 
	@Override
	public void onUpdate(Context context, AppWidgetManager appWidgetManager,
			int[] appWidgetIds) {
		// 初始化Intent
		Intent intent = new Intent();
		intent.setAction(broadcastString);
		PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
		
		// 获取appWidget上的相关控件
		RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.main);
		remoteViews.setOnClickPendingIntent(R.id.btn, pendingIntent);
		
		// 更新所有的appWidget
		appWidgetManager.updateAppWidget(appWidgetIds, remoteViews);
		
	}

14、在AndroidManifest.xml中注册处理这个广播的类

<application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <receiver android:name=".MyWidget">
            <intent-filter >
<!--                 系统发出的广播 -->
                <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
<!--                 程序发出的广播 -->
				<action android:name="com.fy.MyWidget"/>
            </intent-filter>
            <meta-data
                android:name="android.appwidget.provider"
                android:resource="@xml/appwidgetinfo"
                />
                
        </receiver>
    </application>

这样一个简单的Widget就完成了。其实想人人网的Widget还有腾讯微博的Widget都很复杂。这只是一个简单的入门。

我现在在分析android自带音乐播放器的MediaAppWidgetProvider.java,如果今天晚上能完成的话就发表出来。

免责声明:文章转载自《AppWidget初步入门》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇SqlServer timestamp数据类型浅析exports和module.exports的理解下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

【持续集成】如何用sonar-pmd插件集成pmd-xml的规则

需求sonar-pmd插件只有添加了pmd的java规则,现在需要添加pmd的xml规则,更准确是添加自定义的xml规则. 步骤:为了更好集成和示范,选择前人已集成p3c的sonar-pmd插件.url: https://github.com/mrprince/sonar-p3c-pmdgit clone 到本地集成分为两个环节:1.规则配置2.源码修改...

C++ XML解析之tinyXML

最近使用TinyXML进行C++ XML解析,感觉使用起来比较简单,很容易上手,本文给出一个使用TinyXML进行XML解析的简单例子,很多复杂的应用都可以基于本例子的方法来完成。TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows或Linux中编译。这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很...

C#调用WebService实例和开发(转)

1.1、Web Service基本概念 Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求,轻量级的独立的通讯技术。是:通过SOAP在Web上提供的软件服务,使用WSDL文件进行说明,并通过UDDI进行注册。 XML:(Extensible Mark...

Qt 直接构建XML开发web services客户端程序

client.h client.cpp : XML发送与接收 其中 request.setHeader(QNetworkRequest::ContentTypeHeader, "text/xml;charset=utf-8" /*"application/x-www-form-urlencoded"*/); header的value值可以用soapui...

c#读取xml文件到datagridview中

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Fo...

idea中添加web.xml配置文件与tomcat启动中遇到的web.xml文件找不到的问题

1,如何在idea中向war项目中添加web.xml的配置文件 idea通过maven创建war项目时没有指定是webapp导致创建出来的项目没有webapp的文件夹。其实war项目中都是在"项目名/src/main"目录下 只要在这个项目下创建webapp/WEB-INF/web.xml就行了 2,如果你没有把web.xml放在"项目名/src/main...