Android之路

导航

Android中桌面小部件AppWidget的使用

    桌面小部件一般用于图库、音乐播放器、天气预报、日历、时钟等。尤其系统应用,其实可以长按手机桌面,底部会出现“桌面小工具”的图标,点击即可查看当前设备上的所有桌面小部件。那如何在自己的应用上实现小部件的功能呢?以下就从一个简单的demo介绍:

 一、AppWidgetProvider的使用:

public class AppWidgetProvider extends BroadcastReceiver {
......
}

查看源码可知,AppWidgetProvider本身是一个广播接收者。

实现步骤:一些注意事项在代码中都有注释。

1、自定义一个TaskAppWidgetProvider,继承自AppWidgetProvider ;

 1 public class TaskAppWidgetProvider extends AppWidgetProvider {
 2 
 3     //    AppWidgetProvider:继承了BroadcastReceiver
 4 
 5     private final String TAG="TaskAppWidgetProvider";
 6     private final String UPDATE_WIDGET_ACTION = "android.appwidget.action.APPWIDGET_UPDATE";
 7 
 8     @Override
 9     public void onReceive(Context context, Intent intent) {
10         // TODO Auto-generated method stub
11         super.onReceive(context, intent);
12         Log.i(TAG, "onReceive() " + intent.getAction());
13     }
14 
15 
16     @Override
17     public void onUpdate(Context context, AppWidgetManager appWidgetManager,
18             int[] appWidgetIds) {
19         // TODO Auto-generated method stub
20         super.onUpdate(context, appWidgetManager, appWidgetIds);
21         Log.i(TAG, "onUpdate()   appWidgetIds.length: " + (appWidgetIds!=null?appWidgetIds.length:0));
22         
23         initWidget(context, appWidgetIds);
24         
25     }
26     
27     //初始化界面
28     private void initWidget(Context context, int[] appWidgetIds){
29         RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.task_appwidget);
30         views.setTextViewText(R.id.change_text, "onUpdate中修改文本-");
31         initListener(context, views);
32         
33         update(context, appWidgetIds, views);        //通知系统更新widget---否则,对界面的修改及设置的监听事件等均无效
34     }
35     //设置控件的点击事件
36     private void initListener(Context context,RemoteViews views){
37         Intent intent;
38         PendingIntent pendingIntent;
39         
40         intent = new Intent(context, MainActivity.class);
41         pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
42         views.setOnClickPendingIntent(R.id.main_btn, pendingIntent);
43         
44         intent = new Intent(context, SearchActivity.class);
45         pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
46         views.setOnClickPendingIntent(R.id.search_btn, pendingIntent);
47     }
48     
49     /**
50      * 更新Widget
51      * @param context
52      * @param appWidgetIds  当前桌面该应用部件的实例个数,简单理解:即在桌面添加了几个该部件
53      * @param views
54      */
55     private void update(Context context,int[] appWidgetIds, RemoteViews views){
56         AppWidgetManager widgetMng = AppWidgetManager.getInstance(context);
57         if(appWidgetIds != null){
58             widgetMng.updateAppWidget(appWidgetIds, views);
59         }else{
60             widgetMng.updateAppWidget(new ComponentName(context, getClass()), views);
61         }
62     }
63     
64 }

 2、在AndroidManifest.xml中注册,不同的是,此处要指定在桌面小部件列表中显示的布局;

 <receiver
            android:name="com.test.appwidget.TaskAppWidgetProvider"
            android:label="@string/widget_title" >
            <intent-filter>
                <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />    <!-- 在添加小部件时,android系统发出的广播      与下面的meta-data都是必须的,否则在小部件列表中不会显示 -->
            </intent-filter>

            <meta-data
                android:name="android.appwidget.provider"        
                android:resource="@xml/task_widget_info" />        <!-- name:必需是此名称     resource:在窗口小部件列表中显示的布局  -->
        </receiver>

3、定义xml文件<appwidget-provider/>,里面是关于小部件的配置信息及具体显示布局;

//task_widget_info.xml
<?xml version="1.0" encoding="UTF-8"?>
<appwidget-provider
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:initialLayout="@layout/task_appwidget"
    android:minHeight="150dip"
    android:minWidth="200dip"
    android:previewImage="@drawable/local_search"
    android:updatePeriodMillis="86400" >

</appwidget-provider>
android:initialLayout是具体显示布局:task_appwidget.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="center_horizontal"
    android:background="#afffffff"
    android:padding="10dp" >

    <LinearLayout
        android:id="@+id/linear_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="测试窗口小部件"
            android:textColor="#000"
            android:textSize="20sp" />

        <TextView
            android:id="@+id/change_text"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="change-text"
            android:textColor="#000"
            android:textSize="18sp" />
    </LinearLayout>

    <Button
        android:layout_below="@id/linear_layout"
        android:id="@+id/main_btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:text="click-main" />
    
    <Button
        android:id="@+id/search_btn"
        android:layout_toRightOf="@id/main_btn"
        android:layout_marginLeft="10dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@id/main_btn"
        android:text="click-search" />

</RelativeLayout>
View Code

 

上述完成后,运行程序;在手机桌面长按,观察在桌面小工具中是否存在,若存在则说明成功!

二、参考:

原文参考:http://www.cnblogs.com/TerryBlog/archive/2010/07/29/1788319.html    

 

posted on 2019-07-25 16:49  Android之路  阅读(2273)  评论(0编辑  收藏  举报