关闭

Android之App Widget开发实例

734人阅读 评论(0) 收藏 举报

前面一节已经实现了一个简单的App Widget,这里将通过一个实例继续深入学习App Widget。

首先继续了解下App Widget框架的主要的类:

AppWidgetProvider:继承自BroadcastReceiver,在App Widget应用update,enable,disable和deleted时接受通知。其中onUpdate,onReceive是最常用到的方法。

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

AppWidgetManager:负责管理AppWidget,向AppWidgetProvider发送通知。

RemoteViews:一个可以在其他应用进程中运行的类,是构造AppWidget的核心。

下面开始代码的编写,首先在res/xml下建立myappwidetprovider.xml、

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:minWidth="100dp"  
  4.     android:minHeight="72dp"  
  5.     android:updatePeriodMillis="86400000"  
  6.     android:initialLayout="@layout/myappwidget"  
  7.     >  
  8. </appwidget-provider>  
  上面分别是 定义widget的宽度,高度,更新周期,以及layout的widget布局。

  下面是我们的布局文件:

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:background="@drawable/widget_bg1"  
  6.     android:gravity="center"  
  7.     android:id="@+id/layout"  
  8.     android:orientation="vertical" >  
  9.   
  10.     <TextView  
  11.         android:id="@+id/txtMonth"  
  12.         android:layout_width="wrap_content"  
  13.         android:layout_height="wrap_content"  
  14.         android:textColor="#000000"  
  15.         android:layout_margin="2dp"  
  16.         android:text="" />  
  17. <TextView  
  18.         android:id="@+id/txtDay"  
  19.         android:layout_width="wrap_content"  
  20.         android:layout_height="wrap_content"  
  21.         android:textColor="#990033"  
  22.         android:textSize="25dp"  
  23.         android:text="" />  
  24. <TextView  
  25.         android:id="@+id/txtWeekDay"  
  26.         android:layout_width="wrap_content"  
  27.         android:layout_height="wrap_content"  
  28.         android:layout_margin="2dp"  
  29.         android:textColor="#000000"  
  30.         android:text="" />  
  31. </LinearLayout>  



对应布局widget要求比较高,大家自行设计,更加美观的界面。

接下来是我们的核心代码ExampleAppWidgetProvider类了:

  1. import android.app.PendingIntent;  
  2. import android.appwidget.AppWidgetManager;  
  3. import android.appwidget.AppWidgetProvider;  
  4. import android.content.Context;  
  5. import android.content.Intent;  
  6. import android.text.format.Time;  
  7. import android.widget.RemoteViews;  
  8. import android.widget.Toast;  
  9.   
  10. public class ExampleAppWidgetProvider extends AppWidgetProvider{  
  11.     private String[] months={"一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"};  
  12.     private String[] days={"星期日","星期一","星期二","星期三","星期四","星期五","星期六"};  
  13.     @Override  
  14.     public void onUpdate(Context context, AppWidgetManager appWidgetManager,  
  15.             int[] appWidgetIds) {  
  16.         // TODO Auto-generated method stub  
  17.           
  18.         RemoteViews remoteViews=new RemoteViews(context.getPackageName(), R.layout.myappwidget);  
  19.         Time time=new Time();  
  20.         time.setToNow();  
  21.         String month=time.year+" "+months[time.month];  
  22.         remoteViews.setTextViewText(R.id.txtDay, new Integer(time.monthDay).toString());  
  23.         remoteViews.setTextViewText(R.id.txtMonth, month);  
  24.         remoteViews.setTextViewText(R.id.txtWeekDay, days[time.weekDay]);  
  25.         Intent intent=new Intent("cn.com.karl.widget.click");  
  26.         PendingIntent pendingIntent=PendingIntent.getBroadcast(context, 0, intent, 0);  
  27.         remoteViews.setOnClickPendingIntent(R.id.layout, pendingIntent);  
  28.         appWidgetManager.updateAppWidget(appWidgetIds, remoteViews);  
  29.           
  30.         super.onUpdate(context, appWidgetManager, appWidgetIds);  
  31.     }  
  32.       
  33.     @Override  
  34.     public void onReceive(Context context, Intent intent) {  
  35.         // TODO Auto-generated method stub  
  36.         super.onReceive(context, intent);  
  37.         if(intent.getAction().equals("cn.com.karl.widget.click")){  
  38.             Toast.makeText(context, "点击了widget日历", 1).show();  
  39.         }  
  40.     }  
  41. }  

  上面代码忘记做注释了,在这类分别解释下,使用remoteViews类分别加载上来布局文件的相应ID设置好值,然后PendingIntent 这就没什么好解释的了。

  最后在manifest中加入:

  1. <receiver android:name="ExampleAppWidgetProvider" >  
  2.            <intent-filter >  
  3.                <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />  
  4.                <action android:name="cn.com.karl.widget.click" >  
  5.                </action>  
  6.            </intent-filter>  
  7.   
  8.            <meta-data  
  9.                android:name="android.appwidget.provider"  
  10.                android:resource="@xml/myappwidetprovider" />  
  11.        </receiver>  
   这样就完成了,运行项目看一下载手机上运行的效果吧:



1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:269441次
    • 积分:4815
    • 等级:
    • 排名:第5950名
    • 原创:201篇
    • 转载:19篇
    • 译文:2篇
    • 评论:33条
    文章分类
    最新评论