• android桌面组件AppWidget


    ====================================================

    http://blog.csdn.net/meshless/article/details/6941499

    ===================================================

    前几天学习下了桌面组件开发,现将学习心得跟大家交流下,欢迎探讨!

    一、       概述

    要进行桌面组件Widget开发,首先要了解AppWidget框架结构。AppWidget是Android 1.5平台推出的一种崭新的应用程序框架。基于AppWidget框架,开发人员可以在OPhone及模拟器上开发形似传统widget的小应用程序,并将其嵌入到其他应用中。

    二、       AppWidet框架

    1、AppWidgetProvider :继承自 BroadcastRecevier , 在AppWidget 应用 update、enable、disable 和 delete 时接收通知。其中,onUpdate、onReceive 是最常用到的方法,它们接收更新通知。 下面对AppWidgetProvider类常用到的方法进行介绍:

    (1)onDeleted(Context context, int[]appWidgetIds)

    (2)onDisabled(Context context)

    (3)onEnabled(Context context)

    (4)onReceive(Context context, Intentintent)

    Tip:因为 AppWidgetProvider 是继承自BroadcastReceiver  所以可以重写onRecevie 方法,当然必须在后台注册Receiver

    (5)onUpdate(Context context,AppWidgetManager appWidgetManager, int[] appWidgetIds)

     

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

     

    3、AppWidgetManger :负责管理 AppWidget ,向 AppwidgetProvider 发送通知。 下面对AppWidgetManger 类中主要方法进行介绍:

    (1)bindAppWidgetId(int appWidgetId,ComponentName provider)

    通过给定的ComponentName 绑定appWidgetId

     

    (2)getAppWidgetIds(ComponentNameprovider)

    通过给定的ComponentName 获取AppWidgetId

      

    (3)getAppWidgetInfo(int appWidgetId)

    通过AppWidgetId 获取 AppWidget 信息

     

    (4)getInstalledProviders()

    返回一个List<AppWidgetProviderInfo>的信息

     

    (5)getInstance(Context context)

    获取 AppWidgetManger 实例使用的上下文对象

     

    (6)updateAppWidget(int[] appWidgetIds,RemoteViews views)

    通过appWidgetId 对传进来的 RemoteView 进行修改,并重新刷新AppWidget 组件

     

    (7)updateAppWidget(ComponentNameprovider, RemoteViews views)

    通过 ComponentName 对传进来的 RemoeteView 进行修改,并重新刷新AppWidget 组件

     

    (8)updateAppWidget(int appWidgetId,RemoteViews views)

    通过appWidgetId 对传进来的 RemoteView 进行修改,并重新刷新AppWidget 组件

     

    4、RemoteViews :一个可以在其他应用进程中运行的类,向 AppWidgetProvider 发送通知。这是构造AppWidet的核心。

     

     

    三、       Widget 示例:WidgetDemo

    下面改写一个倒计时Demo,该Widget背景图能定时更新。

    先看下程序运行效果图:

     

    1、  新建一个Android工程,命名为WidgetDemo

    2、  修改string.xml文件如下:

    [html] view plaincopy
    1. <?xml version="1.0" encoding="utf-8"?>  
    2.   
    3. <resources>  
    4.   
    5.     <string name="hello">Hello World, WidgetDemo!</string>  
    6.   
    7.     <string name="app_name">DaysToMay1ST</string>  
    8.   
    9. </resources>  


    3、  修改main.xml布局文件。

    由于Widget是一个实现在桌面的小应用程序,对UI的设计要求高,其中包括大小的计算和界面是否适合屏幕的布局等。所以首先要建立RemoteViews对应的布局文件main.xml。

    代码如下:

     

    [html] view plaincopy
    1. <?xml version="1.0"encoding="utf-8"?>  
    2.   
    3. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    4.   
    5.     android:orientation="vertical"  
    6.   
    7.     android:layout_width="fill_parent"  
    8.   
    9.     android:layout_height="fill_parent"  
    10.   
    11.     android:background="@drawable/sunset"  
    12.   
    13.     >  
    14.   
    15. <TextView  
    16.   
    17.     android:id="@+id/may1st"  
    18.   
    19.     android:layout_width="fill_parent"  
    20.   
    21.     android:layout_height="wrap_content"  
    22.   
    23.     android:text="@string/hello"  
    24.   
    25.     android:textSize="12px"  
    26.   
    27.     android:textColor="#ff0000"  
    28.   
    29.     />  
    30.   
    31. </LinearLayout>  

      

    4、  建立Widget内容提供者文件。我们在res下建立xml文件夹,并且新建一个widget_provider.xml代码如下:

    [html] view plaincopy
    1. <?xml version="1.0"encoding="utf-8"?>  
    2.   
    3. <appwidget-provider  
    4.   
    5.   xmlns:android="http://schemas.android.com/apk/res/android"  
    6.   
    7.   android:minWidth="50dip"     
    8.   
    9.   android:minHeight="50dip"     
    10.   
    11.   android:updatePeriodMillis="10000"     
    12.   
    13.   android:initialLayout="@layout/main"  
    14.   
    15.   >  
    16.   
    17. </appwidget-provider>  
    18.   
    19.    
    5、  修改WidgetDemo.java代码如下:
    [html] view plaincopy
    1. package com.android.rui;   
    2.   
    3. import java.util.Calendar;      
    4.   
    5. import java.util.Date;      
    6.   
    7. import java.util.GregorianCalendar;      
    8.   
    9. import java.util.Timer;      
    10.   
    11. import java.util.TimerTask;      
    12.   
    13. import android.appwidget.AppWidgetManager;      
    14.   
    15. import android.appwidget.AppWidgetProvider;      
    16.   
    17. import android.content.ComponentName;      
    18.   
    19. import android.content.Context;      
    20.   
    21. import android.widget.RemoteViews;      
    22.   
    23. public class WidgetDemo extends AppWidgetProvider {      
    24.   
    25. /** Called when the activityis first created. */              
    26.   
    27.     @Override     
    28.   
    29.     public void onUpdate(Context context, AppWidgetManagerappWidgetManager,      
    30.   
    31.         int[] appWidgetIds){      
    32.   
    33.               
    34.   
    35.             Timer timer = new Timer();      
    36.   
    37.            timer.scheduleAtFixedRate(new MyTime(context,appWidgetManager), 1, 60000);      
    38.   
    39.             super.onUpdate(context,appWidgetManager, appWidgetIds);      
    40.   
    41.         }                          
    42.   
    43.         private class MyTime extends TimerTask{      
    44.   
    45.             RemoteViews remoteViews;      
    46.   
    47.             AppWidgetManager appWidgetManager;      
    48.   
    49.             ComponentName thisWidget;      
    50.   
    51.                   
    52.   
    53.             public MyTime(Contextcontext,AppWidgetManager appWidgetManager){      
    54.   
    55.                 this.appWidgetManager =appWidgetManager;     
    56.   
    57.                 switch(Declare.i)//让widget背景图定时变换                
    58.                 {  
    59.                 case 1:  
    60.                     remoteViews = new RemoteViews(context.getPackageName(),R.layout.main1);  
    61.                     Declare.i++;  
    62.                     break;  
    63.                 case 2:  
    64.                     remoteViews = new RemoteViews(context.getPackageName(),R.layout.main2);  
    65.                     Declare.i++;  
    66.                     break;  
    67.                 case 3:  
    68.                     remoteViews = new RemoteViews(context.getPackageName(),R.layout.main3);  
    69.                     Declare.i++;  
    70.                     break;  
    71.                 default:                      
    72.                     remoteViews = new RemoteViews(context.getPackageName(),R.layout.main);  
    73.                     Declare.i=0;  
    74.                     Declare.i++;  
    75.                     break;  
    76.                 }                      
    77.   
    78.                 thisWidget = newComponentName(context,WidgetDemo.class);      
    79.   
    80.             }              
    81.   
    82.             public void run() {      
    83.   
    84.                       
    85.   
    86.                 Date date = new Date();      
    87.   
    88.                 Calendarcalendar = new GregorianCalendar(2011,05,01);      
    89.   
    90.                 long days =(((calendar.getTimeInMillis()-date.getTime())/1000))/86400-30;      
    91.   
    92.                 remoteViews.setTextViewText(R.id.may1st, "距离五一假期还有" + days+"天");      
    93.   
    94.                 appWidgetManager.updateAppWidget(thisWidget, remoteViews);      
    95.   
    96.                       
    97.   
    98.             }      
    99.   
    100.                   
    101.   
    102.         }       
    103.   
    104. }  
    6、  修改配置文件AndroidManifest.xml文件。

    由于使用了reciever和“android.appwidget.action.APPWIDGET_UPDATE”,所以需要在AndroidManifest.xml中进行注册。

    代码如下:

    [html] view plaincopy
    1. <?xml version="1.0"encoding="utf-8"?>  
    2.   
    3. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
    4.   
    5.       package="com.android.rui"  
    6.   
    7.      android:versionCode="1"  
    8.   
    9.      android:versionName="1.0">  
    10.   
    11.     <application android:icon="@drawable/icon"android:label="@string/app_name">  
    12.   
    13.         <receiver android:name=".WidgetDemo"     
    14.   
    15.                  android:label="@string/app_name">      
    16.   
    17.                 <intent-filter>      
    18.   
    19.                 <action android:name="android.appwidget.action.APPWIDGET_UPDATE"/>      
    20.   
    21.             </intent-filter>      
    22.   
    23.             <meta-data android:name="android.appwidget.provider"     
    24.   
    25.                            android:resource="@xml/widget_provider"     
    26.   
    27.                 />      
    28.   
    29.             </receiver>   
    30.   
    31.    


    四、       Widget事件处理

    在以上五一假期倒计时的DEMO中只是更新显示了一个界面。在Widget中同样可以通过setOnClickPendingIntent方法来监听一个事件的处理。

    比如:当我们点击一个”widget_button”按钮时,会弹出一个Toast提示。主要代码如下:

    [html] view plaincopy
    1. public class widget extends AppWidgetProvider  
    2.   
    3. {  
    4.   
    5.     public void onReceive(Context context,Intent intent)  
    6.   
    7.     {  
    8.   
    9.     super.onReceive(context,intent);  
    10.   
    11.     if(intent.getAction().equals("com.android.myapp.widget.CLICK"))  
    12.   
    13.     {  
    14.   
    15.         Toast.makeText(context,"It works!",Toast.LENGTH_SHORT).show();  
    16.   
    17.     }  
    18.   
    19.     }  
    20.   
    21.      
    22.   
    23.     public void onUpdate(Context context, AppWidgetManagerappWidgetManager,int[] appWidgetIds) {  
    24.   
    25.         final int N = appWidgetIds.length;  
    26.   
    27.         for (int i = 0; i < N; i++) {  
    28.   
    29.             int appWidgetId = appWidgetIds[i];  
    30.   
    31.             RemotesViews rv = new RemoteViews(context.getPackageName(),R.layout.main);  
    32.   
    33.             Intent intentClick = new Intent("com.android.myapp.widget.CLICK");  
    34.   
    35.             PendingIntent pendingIntent =PendingIntent.getBroadcast(context, 0,intentClick, 0);  
    36.   
    37.             rv.setOnClickPendingIntent(R.id.widget_button,pendingIntent);  
    38.   
    39.            appWidgetManager.updateAppWidget(appWidgetId, rv);  
    40.   
    41.         }  
    42.   
    43.     }  
    44.   
    45. }  
    Tip: "com.android.myapp.widget.CLICK"事件需要在AndroidManifext.xml文件中声明,声明方式同上面的"android.appwidget.action.APPWIDGET_UPDATE"。

     

    五、       Widget启动Activity

    在Widget中同样可以启动一个Activity,比如Android自带的音乐播放器,当我们添加一个音乐播放器桌面小部件并点击”button”时就开启一个Activity来显示播放音乐的界面。

    通过如下代码即可以启动一个Activity:

    [html] view plaincopy
    1. RemoteViews rv=newRemoteViews(context.getPackageName(),R.layout.mywidget);  
    2.   
    3. Intent intentActivity=new Intent(context,MusicPlayer.class);  
    4.   
    5. PendingIntentpendingIntentActivity=PendingIntent.getActivity(context, 0, intentActivity, 0);  
    6.   
    7. rv.setOnClickPendingIntent(R.id.button,pendingIntentActivity);  
    8.   
    9. appWidgetManager.updateAppWidget(appWidgetId,rv);  
    当我们点击”button”按钮时就可以启动指定的Activity了,代码如下:

    [html] view plaincopy
    1. context.startActivity(intentActivity);  

     六、       Widget启动Service

    Widget还可以启动一个服务。比如Android自带的音乐播放器,要播放音乐肯定需要使用service在后台播放,所以就需要在音乐播放器桌面小部件中启动一个service。使用下面方法可以在Widget中启动一个Service:

    [html] view plaincopy
    1. RemoteViews rv=new RemoteViews(context.getPackageName(),R.layout.mywidget);  
    2.   
    3. Intent intentService=new Intent(“Service名”);  
    4.   
    5. context.startService(intentService);  
    6.   
    7. appWidgetManager.updateAppWidget(appWidgetId,rv);  

    Meet so Meet. C plusplus I-PLUS....
  • 相关阅读:
    【Java学习】向上和向下转型
    【Java学习】java抽象类的作用
    【Java学习】追踪
    【Java学习】@Override 解释
    【Java学习】Java 中带包(创建及引用)的类的编译与调试
    【Java学习】相关基础算法
    【Java学习】import和import static的区别
    【testNG学习】testng.xml文件
    Reshape the Matrix
    Distribute Candies
  • 原文地址:https://www.cnblogs.com/iplus/p/4467389.html
Copyright © 2020-2023  润新知