|  
  導讀:先簡單說說Widget的原理。Widget是在桌面上的一塊顯示信息的東西,也通過單擊Widget跳轉到一個程序里面。而系統自帶的程序,典型的Widget是music,這個Android內置的音樂播放小程序。先簡單說說Widget的原理。Widget是在桌面上的一塊顯示信息的東西,也通過單擊Widget跳轉到一個程序里面。而系統自帶的程序,典型的Widget是music,這個Android內置的音樂播放小程序。這個是典型的Widget+app應用。就是一個程序既可以通過Widget啟動,也可以通過App啟動。Widget就是一個AppWidgetProvider+一個UI界面顯示(預先綁定了好多Intent),界面上的信息可以通過程序控制而改變,單擊Widget,上的控件只能激發發送一個Intent,或發出一個Service的啟動通知。而AppWidgetProvider可以攔截這個Intent,而進行相應的處理(比如顯示新的信息)。Android開發里要大量的通過手動的方式配置好多xml文件。這對于.net開發來說不得不說是個夢靨呀。這也許也是一般的java程序員比.net程序的工資高的一個原因吧。畢竟做Java開發,特別是Android開發,確實很累。你可以看下源碼對照著源碼進行講解。我們先開發一個比較簡單的Widget應用,實現的主要功能是可以通過的不斷變化,而不斷的顯示當前時間。首先,要自己手動建一個名為xml的文件夾。建一個xml文件,加入如下代碼: 
1.<appwidget-providerxmlns:Android="http://schemas.android.com/apk/res/android"   
2.   
3.        Android:minHeight="72px"  4.   
5.        Android:minWidth="72px"    6.   
7.      Android:updatePeriodMillis="3800000"android:initialLayout="@layout/main">  8.   
9. </appwidget-provider>   
這個是Widget的顯示設置,是對Widget屬性的一個配置文件這個Android:minHeight是Widget的高,這個android:minWidth 是Widget的寬。這個android:updatePeriodMillis屬性是設置Widget頁面的 更新頁面的時間的頻率。而這個android:initialLayout屬性是表示的是初始化頁面的布局,Android里畫UI的地方都是通過xml文件,也可以通過代碼程序來畫,不過這樣畫的太麻煩了。 看下以下的文件系統,res文件夾是系統存放資源文件的目錄。以drawable開頭的文件夾是存放圖片資源的文件夾。而后面的hdpi和ldpi等,都是平常在不同的狀態如(橫屏與豎屏時)系統調用不同的圖片資源。Layout就是存放的一般都是xml,UI設計就是在這個layout文件夾里。Value里放的strings.xml就是從程序里分離的字符串,在實現國際化的時候可能會用到。 看看layout里的main.xml ,只有一個空間就是TextView,這個是用來顯示時間用的。 建一個類TestAppWidget繼承于AppWidgetProvider,而AppWidgetProvider繼承與android.content.BroadcastReceiver,所以TestAppWidget就是一個攔截處理Intent的BroadcastReceiver,這些Intent只能在Androidmainfest里設置來攔截處理。 
1.public class TestAppWidget extends AppWidgetProvider {   
2.  private static final String TAG="TestAppWidget";  3.  private static final String FRESH="com.sinxiao.app.fresh";  4.   private Context mContext ;  5.   private boolean run = true ;  6.   BroadcastReceiver mBroadcast =newBroadcastReceiver() {       
7.   
8.      
9.   
10.      public void onReceive(Contextcontext, Intent intent) {     11.       String action =intent.getAction();   
12.       
13.       if(action.equals(Intent.ACTION_TIME_TICK)) {  14.      
15.       mContext.sendBroadcast(newIntent(FRESH));   
16.      
17.    }   
18.      
19.   }   
20.       
21.  };   
22.       
23.   /** 24.      
25.   * 通知Widget每個1秒刷新一次  
26.    */   
27.  Thread myThread = new  28.    Thread(){   
29.       
30.    public void run() {  31.      
32.    while (run) {  33.       
34.    try {  35.      
36.    Thread.sleep(1000);  37.     } catch (InterruptedException e) {  38.    e.printStackTrace();   
39.    }   
40.    mContext.sendBroadcast(newIntent(FRESH));//通知刷新Widget的Intent   41.    }   
42.   };   
43.    };   
44.      
45.    @Override   46.    public void onUpdate(Contextcontext, AppWidgetManager appWidgetManager,  47.       
48.   int[] appWidgetIds) {  49.       //  用來給Widget刷新界面顯示   50.    Log.d(TAG,"onUpdate");  51.   super.onUpdate(context,appWidgetManager, appWidgetIds);  52.    mContext = context;   
53.    RemoteViews views = newRemoteViews(context.getPackageName(),R.layout.main);   
54.    Calendar   
55.    cal=Calendar.getInstance();   
56.    System.out.println(cal.getTime().toLocaleString());   
57.    views.setTextViewText(R.id.txttim,cal.getTime().toLocaleString());   
58.    appWidgetManager.updateAppWidget(appWidgetIds,views);   
59.   myThread.start();   
60.    /** 61.   * 本類作為一個bracastReveiver能自己再,注冊個監聽器  
62.   (可以取消注釋,看報什么錯誤)  
63.  */   
64.    //   65.   context.registerReceiver(mBroadcast,new IntentFilter(Intent.ACTION_TIME_TICK));  66.    }   
67.    @Override  68.   public void onReceive(Contextcontext, Intent intent) {  69.    Log.d(tag,"onReceive");  70.    String action =intent.getAction();   
71.    Log.d(tag, "theaction is "+action);  72.    if (FRESH.equals(action)){  73.    showTime(context);   
74.    }elseif(Intent.ACTION_TIME_TICK.equals(action)){   
75.    showTime(context);   
76.  }   
77.   super.onReceive(context,intent);  78.    }   
79.    private void showTime(Contextcontext) {  80.    RemoteViews views = newRemoteViews(context.getPackageName(),R.layout.main);   
81.    Calendar   
82.    cal=Calendar.getInstance();   
83.   views.setTextViewText(R.id.txttim,cal.getTime().toLocaleString());   
84.    ComponentName thisWidget =new ComponentName(context,TestAppWidget.class);  85.    AppWidgetManager.getInstance(context).updateAppWidget(thisWidget,views);   
86.    }   
87.    public void onDisabled(Contextcontext) {  88.    Log.d(tag,"onDisabled");  89.    super.onDisabled(context);  90.    run = false ;  91.    }   
92.    }   本文出自:億恩科技【www.endtimedelusion.com】 
      
      
		服務器租用/服務器托管中國五強!虛擬主機域名注冊頂級提供商!15年品質保障!--億恩科技[ENKJ.COM] 
       |