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

原文地址:https://www.cnblogs.com/hpboy/p/2610595.html