• 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

  • 相关阅读:
    HTML表格布局例子
    WCF分布式开发必备知识(2):.Net Remoting (转)
    WCF分布式开发必备知识(1):MSMQ消息队列(转)
    WCF数据契约与序列化(转)
    Asp.net中图片存储数据库以及页面读取显示通用方法详解附源码下载
    2010年初的一点随想
    Windows7旗舰版磁盘分区详解—附分区步骤截图
    AjaxControltoolkit(工具包)安装步骤说明
    Windows7安装IIS中关于Windows 系列于谷歌Chrome系统争议一点联想
    Oracle 10G中关于约束在表和列中使用详解.
  • 原文地址:https://www.cnblogs.com/hpboy/p/2610595.html
Copyright © 2020-2023  润新知