Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> Android:AppWidget,PendingIntent,RemoteViews用法

Android:AppWidget,PendingIntent,RemoteViews用法

編輯:Android開發實例

什麼是AppWidget?AppWidget就是我們平常在桌面上見到的那種一個個的小窗口,利用這個小窗口可以給用戶提供一些方便快捷的操作。本篇打算從以下幾個點來介紹AppWidget:

      1.如何創建一個簡單的AppWidget

      2.如何使得AppWidget與客戶端程序交互

下面我們來創建一個簡單的AppWidget

1、定義AppWidgetProviderInfor:在res/xml文件夾中定義一個名為 :example_appwidget_info.xml,這個名字隨便取。它是提供AppWidget元數據;設置在桌面上顯示的大小 

example_appwidget_info.xml

< appwidget-provider   xmlns:android = "http://schemas.android.com/apk/res/android"   

  1.     android:minWidth = "294dp"   
  2.     android:minHeight = "72dp"   
  3.     android:updatePeriodMillis = "86400000"   
  4.     android:initialLayout = "@layout/example_appwidget" >   
  5.     <!-- initiallayout設置引用 的布局文件 -->   
  6.  </ appwidget-provider >   

2、為App Widget指定樣式和布局;在桌面上顯示的內容,布局,就像main.xml布局一樣,做為example_appwidget_info.xml的 initialLayout參數的值,用這個布局文件來初始化example_appwidget_info.xml。

 

 
  1. <?xml version= "1.0"  encoding= "utf-8" ?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"   
  3.     android:orientation="vertical"   
  4.     android:layout_width="fill_parent"   
  5.     android:layout_height="fill_parent"   
  6.     >  
  7. <TextView    
  8.     android:id="@+id/widgetTextId"   
  9.     android:layout_width="fill_parent"    
  10.     android:layout_height="wrap_content"    
  11.     android:text="firstWidgetText"   
  12.     android:background="#000000"   
  13.     />  
  14. </LinearLayout>  

3、實現繼承AppWidgetProvider這個類;

這個類有五個方法:都需要繼承:(下面按照當第一次加載Widget到刪除的時候,這些方法運行的順序)

1、onReceive (Context  context, Intent  intent)   Implements onReceive(Context, Intent)  to dispatch calls to the various other methods on AppWidgetProvider.

2、onEnabled (Context  context)  Called in response to the ACTION_APPWIDGET_ENABLED  broadcast when the a AppWidget for this provider is instantiated. Override this method to implement your own AppWidget functionality.

3、onUpdate (Context  context, AppWidgetManager  appWidgetManager, int[] appWidgetIds)  Called in response to the ACTION_APPWIDGET_UPDATE  broadcast when this AppWidget provider is being asked to provide RemoteViews  for a set of AppWidgets. Override this method to implement your own AppWidget functionality.

4、onDeleted (Context  context, int[] appWidgetIds)  Called in response to the ACTION_APPWIDGET_DELETED  broadcast when one or more AppWidget instances have been deleted. Override this method to implement your own AppWidget functionality.

5、onDisabled (Context  context)  Called in response to the ACTION_APPWIDGET_DISABLED  broadcast, which is sent when the last AppWidget instance for this provider is deleted. Override this method to implement your own AppWidget functionality.

基中onReceive負責進行接受廣播,控制運行哪一個函數,每一個操作都會首先運行這個方法,再調用其它的方法。所以在Widget一次加載到刪除過程中,onReceive會執行4次;

如下圖:注意message


下面看代碼: ExampleAppWidgetProvider.java

 

 
  1. public   class  ExampleAppWidgetProvider  extends  AppWidgetProvider {  
  2.     @Override   
  3.     public   void  onUpdate(Context context, AppWidgetManager appWidgetManager,  
  4.             int [] appWidgetIds) {  
  5.         System.out.println("onupdate" );  
  6.         super .onUpdate(context, appWidgetManager, appWidgetIds);  
  7.     }  
  8.   
  9.     @Override   
  10.     public   void  onDeleted(Context context,  int [] appWidgetIds) {  
  11.         System.out.println("onDeleted" );  
  12.         super .onDeleted(context, appWidgetIds);  
  13.     }  
  14.   
  15.     @Override   
  16.     public   void  onDisabled(Context context) {  
  17.         System.out.println("onDisabled" );  
  18.         super .onDisabled(context);  
  19.     }  
  20.   
  21.     @Override   
  22.     public   void  onEnabled(Context context) {  
  23.         System.out.println("onEnabled" );  
  24.         super .onEnabled(context);  
  25.     }  
  26. }  

在這個實例中,因為與Activity脫離關系,所以Activity不用更改,只是在應用系統中注冊了一個與這個應用程序相關的AppWidget而已:結果:

 

下面再來看看如何在AppWidget中添加按鈕,添加監聽事件。

1、在example_appwidget_info.xml文件裡添加Button迫使

2、添加TargetActivity

只是用來響應點擊事件,在此例中沒有實際意義

 
  1. public   class  TargetActivity  extends  Activity {  
  2.     @Override   
  3.     protected   void  onCreate(Bundle savedInstanceState) {  
  4.         super .onCreate(savedInstanceState);  
  5.         setContentView(R.layout.main);  
  6.     }  
  7. }  

3、在AndroidManifest.xml文件注冊TargetActivity

4、重寫ExampleAppWidgetProvider類的onUpdate方法,在第一次創建WidGet的時候,向按鈕添加監聽。並用PendingIntent,和RemoteView兩個類,對事件進行處理;

 

 
  1. public   void  onUpdate(Context context, AppWidgetManager appWidgetManager,  
  2.             int [] appWidgetIds) {  
  3.         System.out.println("onupdated" );  
  4.   
  5.         for  ( int  i =  0 ; i <appWidgetIds.length; i++) {  
  6.             System.out.println(appWidgetIds[i]);  
  7.             //創建一個Intent對象   
  8.             Intent intent = new  Intent(context,TargetActivity. class );  
  9.             //創建一個PendingIntent(有四種方法獲取)   
  10.             PendingIntent pendingIntent = PendingIntent.getActivity(context, 0 , intent,  0 );  
  11.             RemoteViews remoteViews = new  RemoteViews(context.getPackageName(),R.layout.example_appwidget);  
  12.             //為按鈕綁定事件處理器   
  13.             //第一個參數用來指定被綁定處理器的控件的ID   
  14.             //第二個參數用來指定當事件發生時,哪個PendingIntent將會被執行   
  15.             remoteViews.setOnClickPendingIntent(R.id.widgetButton, pendingIntent);  
  16.             //更新AppWidget   
  17.             //第一個參數用於指定被更新AppWidget的ID   
  18.             appWidgetManager.updateAppWidget(appWidgetIds[i], remoteViews);  
  19.         }  
  20.         super .onUpdate(context, appWidgetManager, appWidgetIds);  
  21.     }  

 

Called in response to the ACTION_APPWIDGET_DELETED  broadcast when one or more AppWidget instances have been deleted. Override this method to implement your own AppWidget functionality.


在實際應用在AppWidget更多的是利用廣播機制Action進行處理的;下面我們來看看如何利用廣播機制,單擊改變AppWidget的內容;在上例 的基礎上進行擴展:

1、AppWidget的布局文件:widget01.xml

<? xml   version = "1.0"   encoding = "utf-8" ?>   
  1. < LinearLayout   xmlns:android = "http://schemas.android.com/apk/res/android"   
  2.     android:orientation = "vertical"   
  3.     android:layout_width = "fill_parent"   
  4.     android:layout_height = "fill_parent"   
  5.     >   
  6. < Button   android:id = "@+id/widgetButton"   
  7.     android:layout_width = "fill_parent"   
  8.     android:layout_height = "wrap_content"   
  9.     android:text = "@string/widget_button" />   
  10.       
  11. < TextView   android:id = "@+id/test_text"   
  12.     android:layout_width = "fill_parent"   
  13.     android:layout_height = "wrap_content"   
  14.     android:text = "@string/test_text"   
  15.     android:gravity = "center"   
  16.     android:textColor = "#fff" />   
  17. </ LinearLayout >   

其中的Button控件是測試按鈕,TextView用來反應單擊Button之後顯示的內容變化;(這是給Button添加監聽器,再利用Action廣播。收onRecerve接收,做出動作)

2、修改AndroidManifest.xml

在Reservi裡添加action,注冊事件

< receiver   android:name = "ExampleAppWidgetProvider" > <!--如果action匹配成功,就在此類中進行處理-->   
  1.     < intent-filter >   
  2.         <!--利用廣播機制接收,onUpdate會接收廣播。查看源碼可收得知  Called in response to the ACTION_APPWIDGET_UPDATE   
  3.             broadcast when this AppWidget provider is being asked to provide RemoteViews   
  4.             for a set of AppWidgets. Override this method to implement your own AppWidget   
  5.             functionality. 這個也必須要,不然onRecerve不會調用 。-->   
  6.         <!--這是自定義的Action事件--> < action   android:name = "android.appwidget.action.APPWIDGET_UPDATE" />   
  7.         < action   android:name = "learn.test.UPDATE_APP_WIDGET" />   
  8.     </ intent-filter >   
  9.     < meta-data   android:name = "android.appwidget.provider"   android:resource = "@xml/widget_test"   />   
  10. </ receiver >   

3、修改ExampleAppWidgetProvider.java代碼文件,如下:

public   class  ExampleAppWidgetProvider  extends  AppWidgetProvider {  
  1.     //定義一個常量字符串,該常量用於命名Action   
  2.     private   static   final  String UPDATE_ACTION =  "learn.test.UPDATE_APP_WIDGET" ;  
  3.       
  4.     @Override   
  5.     public   void  onDeleted(Context context,  int [] appWidgetIds) {  
  6.         // TODO Auto-generated method stub   
  7. System.out.println("onDeleted" );  
  8.         super .onDeleted(context, appWidgetIds);  
  9.     }  
  10.   
  11.     @Override   
  12.     public   void  onDisabled(Context context) {  
  13.         // TODO Auto-generated method stub   
  14. System.out.println("onDisabled" );  
  15.         super .onDisabled(context);  
  16.     }  
  17.   
  18.     @Override   
  19.     public   void  onEnabled(Context context) {  
  20.         // TODO Auto-generated method stub   
  21. System.out.println("onEnabled" );  
  22.         super .onEnabled(context);  
  23.     }  
  24.   
  25.     @Override   
  26.     public   void  onReceive(Context context, Intent intent) {  
  27.         // TODO Auto-generated method stub   
  28. System.out.println("onReceive" );  
  29.   
  30.         String action = intent.getAction();  
  31.         if  (UPDATE_ACTION.equals(action)) {  
  32.             RemoteViews remoteViews = new  RemoteViews(context.getPackageName(),  
  33.                     R.layout.widget01);  
  34.             remoteViews.setTextViewText(R.id.test_text, "this is OnReceive" );  
  35.             //getInstance(Context context)  Get the AppWidgetManager instance to use for the supplied Context object.靜態方法。   
  36.             AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);  
  37.               
  38.             ComponentName componentName = new  ComponentName(context,ExampleAppWidgetProvider. class );  
  39.             appWidgetManager.updateAppWidget(componentName, remoteViews);  
  40.         } else  {  
  41.             super .onReceive(context, intent); 這裡一定要添加,eles部分,不然,onReceive不會去調用其它的方法。但是如果把這條語句放在外面,就會每次運行 onUpdate,onDeleted等方法,就會運行兩次,因為UPDATE_ACTION.equals(action)配置成功會運行一次,uper.onReceive(context, intent)配置成功又會運行一次,後都是系統自定義的。  
  42.         }  
  43.     }  
  44.   
  45.     @Override   
  46.     public   void  onUpdate(Context context, AppWidgetManager appWidgetManager,  
  47.             int [] appWidgetIds) {  
  48.         // TODO Auto-generated method stub   
  49. System.out.println("onUpdated" );  
  50.   
  51. //創建一個Intent對象   
  52.         Intent intent = new  Intent();  
  53.         //為Intent對象設置Action   
  54.         intent.setAction(UPDATE_ACTION);  
  55.         //使用getBroadcast方法,得到一個PendingIntent對象,當該對象執行時,會發送一個廣播   
  56.         PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0 ,  
  57.                 intent, 0 );  
  58.         RemoteViews remoteViews = new  RemoteViews(context.getPackageName(),  
  59.                 R.layout.widget01);  
  60.           
  61.         remoteViews.setOnClickPendingIntent(R.id.widgetButton, pendingIntent);  
  62.         appWidgetManager.updateAppWidget(appWidgetIds, remoteViews);  
  63.         super .onUpdate(context, appWidgetManager, appWidgetIds);  
  64.     }  
  65.       

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved