桌面小部件AppWidget的使用
在android平台中,显示在HOME界面的一些挂件,即桌面小部件,被称为AppWidget。在自己的程序中适当地加入AppWidget,不但使用户更方便,也能从一定程序上提高本程序的留存率。
下面通过我所写的一个课表应用来说明如何使用AppWidget。
我所写的AppWidget最终结果如下图:
1.首先在res/layout下编写AppWidget的布局文件。
我的代码如下:
appwidget_small.xml
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="60dp" android:background="@drawable/appwidget_bg" > <Button android:id="@+id/widget_small_refresh" android:layout_width="60dp" android:layout_height="40dp" android:layout_alignParentRight="true" android:text="@string/widget_small_refrest" android:textAppearance="@android:style/TextAppearance.Medium" /> <TextView android:id="@+id/widget_small_day" android:layout_width="60dp" android:layout_height="match_parent" android:layout_alignParentRight="true" android:layout_below="@id/widget_small_refresh" android:gravity="center" android:textAppearance="@android:style/TextAppearance.Small" /> <include android:id="@+id/widget_small_content" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginBottom="2dp" android:layout_marginLeft="2dp" android:layout_marginTop="2dp" android:layout_toLeftOf="@id/widget_small_refresh" layout="@layout/main_list_item" android:background="@drawable/appwidget_list_bg" /></RelativeLayout>
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" > <TextView android:id="@+id/list_item_class" android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="center" android:singleLine="true" android:textAppearance="@android:style/TextAppearance.Medium" /> <TextView android:id="@+id/list_item_time" android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="center" android:singleLine="true" android:textAppearance="@android:style/TextAppearance.Small" /> </LinearLayout> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" > <LinearLayout android:layout_width="120dp" android:layout_height="wrap_content" android:layout_weight="2" android:orientation="vertical" > <TextView android:id="@+id/list_item_course" android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="center" android:singleLine="true" android:textAppearance="@android:style/TextAppearance.Medium" /> <TextView android:id="@+id/list_item_teacher" android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="center" android:singleLine="true" android:textAppearance="@android:style/TextAppearance.Medium" /> </LinearLayout> <LinearLayout android:layout_width="120dp" android:layout_height="wrap_content" android:layout_weight="2" android:orientation="vertical" > <TextView android:id="@+id/list_item_room" android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="center" android:singleLine="true" android:textAppearance="@android:style/TextAppearance.Medium" /> <TextView android:id="@+id/list_item_week" android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="center" android:singleLine="true" android:textAppearance="@android:style/TextAppearance.Medium" /> </LinearLayout> </LinearLayout></LinearLayout>
<?xml version="1.0" encoding="UTF-8"?><appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" android:initialLayout="@layout/appwidget_small" android:minHeight="60dp" android:minWidth="240dp" android:updatePeriodMillis="1800000" ></appwidget-provider>
/* * @(#)TableWidgetProvider.java Project:UniversityTimetable * Date:2013-2-11 * * Copyright (c) 2013 CFuture09, Institute of Software, * Guangdong Ocean University, Zhanjiang, GuangDong, China. * All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */package com.lurencun.cfuture09.universityTimetable.appwidget;import java.util.Calendar;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.database.Cursor;import android.util.Log;import android.widget.RemoteViews;import com.lurencun.cfuture09.universityTimetable.R;/** * @Author Geek_Soledad (66704238@51uc.com) * @Function */public class TableSmallWidgetProvider extends AppWidgetProvider {private static final String TAG = "TableSmallWidgetProvider";public static final String ACTION_UPDATE = "cfuture09.universityTimetable.action.TIMETABLE.APPWIDGET_SMALL_UPDATE";@Overridepublic void onDeleted(Context context, int[] appWidgetIds) {super.onDeleted(context, appWidgetIds);Log.d(TAG, "onDeleted");}@Overridepublic void onDisabled(Context context) {super.onDisabled(context);Log.d(TAG, "onDisable");}@Overridepublic void onEnabled(Context context) {super.onEnabled(context);Log.d(TAG, "onEnabled");}@Overridepublic void onReceive(Context context, Intent intent) {super.onReceive(context, intent);Log.d(TAG, "onReceive");}@Overridepublic void onUpdate(Context context, AppWidgetManager appWidgetManager,int[] appWidgetIds) {super.onUpdate(context, appWidgetManager, appWidgetIds);Log.d(TAG, "update");}}
<receiver android:name=".appwidget.TableSmallWidgetProvider" android:label="@string/widget_small_4_1" > <intent-filter> <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> </intent-filter> <intent-filter> <action android:name="cfuture09.universityTimetable.action.TIMETABLE.APPWIDGET_SMALL_UPDATE" /> </intent-filter> <meta-data android:name="android.appwidget.provider" android:resource="@xml/widget_small_provider_info" /> </receiver>其中label中引用的字符串即在插入Appwidget时出现的那个名字,如这里为"大学课程表(4*1)",如果不添加,默认为你的程序名,即在application标签中声明的label。然后加入的intent-filter,为其接收的广播,这里还定义了自己的一个action,它将在下面的例子中用到,因为我希望还能手动更新appwidget的数据。
@Overridepublic void onUpdate(Context context, AppWidgetManager appWidgetManager,int[] appWidgetIds) {super.onUpdate(context, appWidgetManager, appWidgetIds);Log.d(TAG, "onUpdate");for (int i = 0; i < appWidgetIds.length; i++) {RemoteViews remoteViews = new RemoteViews(context.getPackageName(),R.layout.appwidget_small);// 设置星期几remoteViews.setTextViewText(R.id.widget_small_day,arrayWeeks[currentDay]);// 打开程序PendingIntent startIntent = PendingIntent.getActivity(context, 0,new Intent(context, MainActivity.class), 0);remoteViews.setOnClickPendingIntent(R.id.widget_small_content,startIntent);// 更新控件的事件绑定Intent intent = new Intent();intent.setAction(ACTION_UPDATE);// 以发送广播消息的方式创建PendingIntent.PendingIntent pending_intent = PendingIntent.getBroadcast(context,0, intent, 0);remoteViews.setOnClickPendingIntent(R.id.widget_small_refresh,pending_intent);appWidgetManager.updateAppWidget(appWidgetIds[i], remoteViews);}}
@Overridepublic void onReceive(Context context, Intent intent) {Log.d(TAG, "onReceive");if (ACTION_UPDATE.equals(intent.getAction())) {RemoteViews remoteViews = new RemoteViews(context.getPackageName(),R.layout.appwidget_small);// 设置星期几remoteViews.setTextViewText(R.id.widget_small_day,arrayWeeks[currentDay]);// 更新节课updateWidgetViews(remoteViews, dto);PendingIntent startIntent = PendingIntent.getActivity(context, 0,new Intent(context, MainActivity.class), 0);remoteViews.setOnClickPendingIntent(R.id.widget_small_content,startIntent);ComponentName componentName = new ComponentName(context,TableSmallWidgetProvider.class);AppWidgetManager.getInstance(context).updateAppWidget(componentName, remoteViews);} else {super.onReceive(context, intent);}}