緊接上集,appwidget的周期函數對應的事件:
onUpdate:到達指定時間以後或者用戶向桌面添加appwidget時候會調用這個方法。
onDelete:當appwidget被刪除時,會調用這個方法。
onEnable:當一個appwidget第一次被建立,會調用這個方法。
onDisable:當最後一個appwidget實例被刪除後,會調用這個方法。
onReveice:接受廣播事件。
調試出來了麼?
這集內容是如何與appwidget交互:
咱們實現的功能是建立一個appwidget(爲一個button),點擊後,啓動一個activity。
一樣是新知識介紹:
一、咱們的appwidget與咱們對應的activity不是同一個進程,appwidget是homescreen中的一個進程。因此,咱們不能直接對某一個控件進行事件監聽,而是經過RemoteViews進行處理,並且咱們也不能直接用intent進行啓動activity,用pendingintent。
二、pendingintent:顧名思義,是還未肯定的Intent。能夠看作是對intent的一個包裝,目的是對RemoteViews進行設置。形象點講就是咱們進程A中的intent想要在進程B中執行,須要pendingintent進行包裝,而後添加到進程B中,進程B中遇到某個事件,而後執行intent。
建立pendingintent有三個方法:getActivity(context,requestCode,intent,flags)。getService()。getBroadcast()。
三、RemoteViews:即遠程的views。他的做用是他所表示的對象運行在另外的進程中。
如今話很少說,果斷代碼:
一、咱們在上集的appwidget.xml中(即桌面控件上加上一個Button)代碼:
- <span style="font-size: x-small;"> <Button
- android:id="@+id/button"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="測試按鈕"
- /></span>
<Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="測試按鈕" />
二、咱們在provider中的onUpdate方法中進行處理:java
- <span style="font-size: x-small;">for(int i= 0;i<appWidgetIds.length;i++){
- System.out.println(appWidgetIds[i]);
- //新intent
- Intent intent = new Intent(context,Appwidget2Activity.class);
- //建立一個pendingIntent。另外兩個參數之後再講。
- PendingIntent pendingIntent = PendingIntent.getActivity(
- context, 0, intent, 0);
- //建立一個remoteViews。
- RemoteViews remoteViews = new RemoteViews(
- context.getPackageName(), R.layout.appwidget);
- //綁定處理器,表示控件單擊後,會啓動pendingIntent。
- remoteViews.setOnClickPendingIntent(R.id.button, pendingIntent);
- appWidgetManager.updateAppWidget(appWidgetIds[i], remoteViews);
- }</span>
for(int i= 0;i<appWidgetIds.length;i++){ System.out.println(appWidgetIds[i]); //新intent Intent intent = new Intent(context,Appwidget2Activity.class); //建立一個pendingIntent。另外兩個參數之後再講。 PendingIntent pendingIntent = PendingIntent.getActivity( context, 0, intent, 0); //建立一個remoteViews。 RemoteViews remoteViews = new RemoteViews( context.getPackageName(), R.layout.appwidget); //綁定處理器,表示控件單擊後,會啓動pendingIntent。 remoteViews.setOnClickPendingIntent(R.id.button, pendingIntent); appWidgetManager.updateAppWidget(appWidgetIds[i], remoteViews); }
由於咱們可能有多個appwidget,因此要遍歷。建立一個intent,與要啓動的activity關聯起來,而後根據該intent建立一個pendingintent。而後根據appwidget.xml建立一個remoteViews,而後對該views中的一個控件進行pendingintent綁定。android