Android桌面组件AppWidget讲解
前言
利用了一点时间,把桌面组件widget整理了一番,大概讲解一下AppWidget入门开发,讲解分四部分:
1.什么是桌面组件AppWidget?
2.怎么添加桌面小控件?
3. AppWidget 框架类
4.Demo讲解
一.什么是桌面组件AppWidget?
AppWidget被google定义为桌面组件,也就是我们平时用的桌面小空间,比如时钟,天气预报,google搜索框等。使用这些小控件,可以给用户更好的体验,比较直观,
在桌面浏览的时候,可以直接看到,常用的桌面小工具比较常用到。
二.怎么添加桌面小控件?
1)长按桌面,出现图1;
图1
2)然后选择widget后,出现图2,这些列表就是appwidget桌面小控件,之后就可以选择你喜欢的小控件放到桌面上;
图2
三. AppWidget 框架类
1、AppWidgetProvider :继承自 BroadcastRecevier , 在AppWidget 应用 update、enable、disable 和 delete 时接收通知。其中,onUpdate、onReceive 是最常用到的方法,它们接收更新通知。
2、 AppWidgetProviderInfo:描述 AppWidget 的大小、更新频率和初始界面等信息,以XML 文件形式存在于应用的 res/xml/目录下。
3、AppWidgetManger :负责管理 AppWidget ,向 AppwidgetProvider 发送通知。
4、RemoteViews :一个可以在其他应用进程中运行的类,向 AppWidgetProvider 发送通知。
四.Demo讲解
1.widgetProvider
package com.terry; import android.app.PendingIntent; import android.appwidget.AppWidgetManager; import android.appwidget.AppWidgetProvider; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.widget.RemoteViews; import android.widget.Toast; public class widgetProvider extends AppWidgetProvider { private static final String CLICK_NAME_ACTION = "com.terry.action.widget.click"; public static boolean isChange = true; private static RemoteViews rv; /** * 调用时机: 1.到达指定的更新时间 2.用户向桌面添加appwidget时候 * 系统会发出一个android.appwidget.action.APPWIDGET_UPDATE广播 * 根据AndroidManifest.xml注册信息,启动widgetProvider,然后AppWidgetProvider接收 * 到广播后,调用onUpdate方法初始化 */ @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { // TODO Auto-generated method stub System.out.println("onUpdate" + appWidgetIds.length); final int N = appWidgetIds.length; for (int i = 0; i < N; i++) { int appWidgetId = appWidgetIds[i]; updateAppWidget(context, appWidgetManager, appWidgetId); } } /** * 接收广播,当点击TextView时,AppWidgetService会广播一个事件 */ @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub super.onReceive(context, intent); System.out.println("onReceive:" + intent.getAction()); if (rv == null) { rv = new RemoteViews(context.getPackageName(), R.layout.main); } if (intent.getAction().equals(CLICK_NAME_ACTION)) { if (isChange) { rv.setTextViewText(R.id.TextView01, context.getResources() .getString(R.string.load)); } else { rv.setTextViewText(R.id.TextView01, context.getResources() .getString(R.string.change)); } Toast.makeText(context, Boolean.toString(isChange), Toast.LENGTH_LONG).show(); isChange = !isChange; // AppwidgetManager实例,更新appwidget AppWidgetManager appWidgetManger = AppWidgetManager .getInstance(context); int[] appIds = appWidgetManger.getAppWidgetIds(new ComponentName( context, widgetProvider.class)); appWidgetManger.updateAppWidget(appIds, rv); } } public static void updateAppWidget(Context context, AppWidgetManager appWidgeManger, int appWidgetId) { // 创建远程视图实例 rv = new RemoteViews(context.getPackageName(), R.layout.main); // 创建点击意图对象 Intent intentClick = new Intent(CLICK_NAME_ACTION); PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intentClick, 0); // 绑定TextView点击事件 rv.setOnClickPendingIntent(R.id.TextView01, pendingIntent); // 通知AppWidgetService appWidgeManger.updateAppWidget(appWidgetId, rv); } /** * 删除appwidget时调用 * 系统会发出一个android.appwidget.action.APPWIDGET_DELETED广播 * 然后才调用onDeleted(Context context, int[] appWidgetIds) */ @Override public void onDeleted(Context context, int[] appWidgetIds) { // TODO Auto-generated method stub super.onDeleted(context, appWidgetIds); System.out.println("onDeleted"); } /** * 第一个appwidget被创建时调用 * 系统会发出一个android.appwidget.action.APPWIDGET_ENABLED广播 * 然后才调用onEnabled(Context context) */ @Override public void onEnabled(Context context) { // TODO Auto-generated method stub super.onEnabled(context); System.out.println("onEnabled"); } /** * 最后一个appwidget被删除 * 系统会发出一个android.appwidget.action.APPWIDGET_DISABLED广播 * 然后才调用onDisabled(Context context) */ @Override public void onDisabled(Context context) { // TODO Auto-generated method stub super.onDisabled(context); System.out.println("onDisabled"); } }
appwidget_provider.xml
<?xml version="1.0" encoding="UTF-8"?> <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" android:minWidth="60dp" android:minHeight="30dp" android:updatePeriodMillis="5000" android:initialLayout="@layout/main"> </appwidget-provider>
3.AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.terry" android:versionCode="1" android:versionName="1.0" > <application android:icon="@drawable/icon" android:label="@string/app_name" > <receiver android:name=".widgetProvider" > <!-- widgetProvider元数据,定义布局文件 --> <meta-data android:name="android.appwidget.provider" android:resource="@xml/appwidget_provider" > </meta-data> <intent-filter> <action android:name="com.terry.action.widget.click" /> <!-- 必须加上,不然appwidget不能被创建 --> <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> </intent-filter> </receiver> </application> </manifest>
demo下载:/Files/hpboy/widget.rar
转载请注明出处:http://www.cnblogs.com/hpboy/archive/2012/07/26/2610595.html