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    

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM