緊接上集的appwidget,我們學瞭如何在appwidget中啓動一個新activity,這次我們要根據自己的一個action而啓動一個廣播,從而完成我們需要的操作。
首先是新知識點:
首先,我們已經知道appwidget根本是基於廣播事件的,這個從我們需要在AndroidManifest.xml配置receiver可以看出,既然是這樣,那麼我們也可以自己定義我們自己的action以及在provider中的onReceive中進行處理。
其次,我們需要知道appwidgetprovider的運行機制就更容易理解了,當appwidget有事件時就會發送一個廣播(一個intent對象)到appwidgetprovider,他首先會啓動onReceive方法來接收action,然後根據action的值來決定調用onUpdate,onDelete,onDisable,onEnable中的一個方法,他的這些方法都與一個action對應。這個模式和struts的請求分發差不多。
目前我還沒找到如何上傳本地圖片的方法,所以只能用文字來描述,希望大家理解。
我們下面的實例實現的是自己定義一個action,然後在appwidgetprovider中的onReceiver中截取,然後輸出一句話。
廢話不多,代碼如下:
1、首先在AndroidManifest.xml加入
<receiver android:name = "AppwidgetProvider">
<intent-filter>
<action
android:name="android.appwidget.action.APPWIDGET_UPDATE"/>
</intent-filter>
<intent-filter >
<action android:name="hanl.UPDATE_ACTION"/>
</intent-filter>
<meta-data android:name="android.appwidget.provider"
android:resource="@xml/appwidget_info">
</meta-data>
</receiver>
我們增加了一個過濾器:action爲"hanl.UPDATE_ACTION"。
2、我們在onUpdate函數內增加一個intent,爲他設置action爲hanl.UPDATE_ACTION,然後用pendingintent包裝intent,然後進行事件綁定。這個在appwidget(一)有具體講解。
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds) {
// TODO Auto-generated method stub
//新intent
Intent intent = new Intent();
//設置action,這個UPDATE_ACTION在上面定義的爲static final String UPDATE_ACTION=hanl.UPDATE_ACTION;
intent.setAction(UPDATE_ACTION);
//創建一個pendingIntent。另外兩個參數以後再講。
PendingIntent pendingIntent = PendingIntent.getBroadcast(
context, 0, intent, 0);
//創建一個remoteViews。
RemoteViews remoteViews = new RemoteViews(
context.getPackageName(), R.layout.appwidget);
//綁定處理器,表示控件單擊後,會啓動pendingIntent。
remoteViews.setOnClickPendingIntent(R.id.button, pendingIntent);
//更新
appWidgetManager.updateAppWidget(appWidgetIds, remoteViews);
super.onUpdate(context, appWidgetManager, appWidgetIds);
}
3、然後在onReceive中進行攔截。
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
String action = intent.getAction();
if(action.equals(UPDATE_ACTION))
System.out.println("onReceive-----"+action);
super.onReceive(context, intent);
}
運行結果傳不上來,大家試下看看,能不能輸出這個action,預祝成功!
下集我們將講解如果對appwidget控件進行修改,請期待。