Android學習筆記之AppWidget

android桌面控件:


appwidget當中的View運行在Home Screen進程中,和我們的應用不在同一進程中。
AppWidgetProviderInfo對象:
爲App Widget提供元數據,包括佈局,更新頻率等,這個對象被定義在xml文件中。


AppWidgetProvider:定義了AppWidget的基本生命週期函數


方法:onUpdate:在到達指定的更新時間之後後者當用戶向桌面添加App Widget時會調用
該方法。
onDeleted:當App Widget被刪除時,會調用該方法
onEnabled:當一個App Widget的實例第一次被創建時調用
onDisabled:當最後一個App Widget實例被刪除後,會調用該方法。
onReveice:接收廣播事件


步驟:
1,在res目錄下新建目錄xml,在裏面新建文件widget_info.xml文件。
<?xml version="1.0" encoding="utf-8" ?>

<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" 
android:minWidth="294dp"
android:minHeight="72dp"
android:updatePeriodMillis="86400000"

android:initialLayout="@layout/appwidget">
    
</appwidget-provider>


2,在layout下新建佈局文件appwidget.xml文件:

<?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="fill_parent"
    android:orientation="vertical" >
<TextView 
    android:id="@+id/widgetTextld"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="firstWidgetText"
    android:background="#000000"
   ></TextView>
    
</LinearLayout>
3,AndroidManifest.xml文件中加receiver標籤:
<receiver android:name="AppWidgetProviderTest">
            <intent-filter >
                <action 


android:name="android.appwidget.action.APPWIDGET_UPDATE"/>
            </intent-filter>
          <meta-data android:name="android.appwidget.provider"
              android:resource="@xml/appwidget_info" 


></meta-data>
     </receiver>
4,新建類:AppWidgetProviderTest.java,繼承自AppWidgetProvider實現方法。
package com.gufengxiachen.android;


import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.Context;
import android.content.Intent;


public class AppWidgetProviderTest extends AppWidgetProvider{
@Override
public void onDeleted(Context context, int[] appWidgetIds) {
// TODO Auto-generated method stub
System.out.println("Deleted");
super.onDeleted(context, appWidgetIds);
}

@Override
public void onEnabled(Context context) {
// TODO Auto-generated method stub
System.out.println("Enabled");
super.onEnabled(context);
}

@Override
public void onDisabled(Context context) {
// TODO Auto-generated method stub
System.out.println("Disabled");
super.onDisabled(context);
}

@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
System.out.println("Receive");
super.onReceive(context, intent);
}

@Override
public void onUpdate(Context context, AppWidgetManager 


appWidgetManager,
int[] appWidgetIds) {
// TODO Auto-generated method stub
System.out.println("Update");
super.onUpdate(context, appWidgetManager, appWidgetIds);
}

}


PendingIntent:封裝暫時不用的Intent,延遲執行的Intent。主要和Android特定的的遠


程服務打交道(短信、通知、鬧鈴等),通常的應用無需使用。
構造PendingIntent對象:
靜態方法:
getActivity(Content content,int requestCode,Intent intent,int flags);
getBroadcast(Content content,int requestCode,Intent intent,int flags);
getService(Content content,int requestCode,Intent intent,int flags);


RemoteViews:表示一系列的View對象。RemoteViews運行的對象在另外一個進程中。   
    
    
綁定appwidget的控件監聽器:
remoteViews.setOnClickPendingIntent(R.id.widgetButtonld,pendingIntent);


主要代碼:
for(int i=0;i<appWidgetIds.length;i++){
System.out.println(appWidgetIds[i]);
//定義intent對象
Intent intent = new Intent


(context,TargetActivity.class);
//定義PendingIntent對象,包裝Intent對象
PendingIntent pendingIntent = 


PendingIntent.getActivity(context, 0, intent, 0);
//獲取RemoteViews對象
RemoteViews remoteViews = new RemoteViews


(context.getPackageName(),R.layout.appwidget);
//控件添加監聽器
remoteViews.setOnClickPendingIntent


(R.id.widgetbuttonld, pendingIntent);
//更新App Widget
appWidgetManager.updateAppWidget(appWidgetIds[i], 


remoteViews);
}
super.onUpdate(context, appWidgetManager, appWidgetIds);


}

接收來自AppWidget的廣播:
1,在AndroidManifest.xml中爲AppWidgetProvider註冊新的intent-filter;
2,使用getBroadcast()方法創建一個PendingIntent;
3,爲AppWidget中的控件註冊處理器
4,在onReceive()方法中接收廣播信息。    

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章