在開發AppWidget時,我們都需要寫一個自己的類去繼承AppWidgetProvider,本文簡單地對AppWidgetProvider的源碼進行分析。
首先,AppWidgetProvider繼承了BroadcastReceiver,所以本質上它是一個廣播接收器,特別地它主要接收由AppWidgetService發送的關於AppWidget的一些廣播而已。
其次,它只有一個空的構造方法,並且沒有任何成員變數,只有五個方法,當然,其中一個就是onReceive方法,這是它作為廣播接收器必須實現的方法。另外四個方法分別是onUpdate、onDeleted、onEnabled和onDisabled,但是這四個方法體都是空的,使用者繼承了AppWidgetProvider可以自己實現這些方法作想做的事。
關鍵我們來看onReceive方法。首先附上源碼,再對其進行分析。
public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (AppWidgetManager.ACTION_APPWIDGET_UPDATE.equals(action)) { Bundle extras = intent.getExtras(); if (extras != null) { int[] appWidgetIds = extras.getIntArray(AppWidgetManager.EXTRA_APPWIDGET_IDS); if (appWidgetIds != null && appWidgetIds.length > 0) { this.onUpdate(context, AppWidgetManager.getInstance(context), appWidgetIds); } } } else if (AppWidgetManager.ACTION_APPWIDGET_DELETED.equals(action)) { Bundle extras = intent.getExtras(); if (extras != null && extras.containsKey(AppWidgetManager.EXTRA_APPWIDGET_ID)) { final int appWidgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID); this.onDeleted(context, new int[] { appWidgetId }); } } else if (AppWidgetManager.ACTION_APPWIDGET_ENABLED.equals(action)) { this.onEnabled(context); } else if (AppWidgetManager.ACTION_APPWIDGET_DISABLED.equals(action)) { this.onDisabled(context); } }
代碼其實非常簡單,對接收到的Intent提取出它攜帶的Action,然後根據Action的不同,分別調用自己的四個方法。四個Action在AppWidgetManager中定義如下:
public static final String ACTION_APPWIDGET_UPDATE = "android.appwidget.action.APPWIDGET_UPDATE"; public static final String ACTION_APPWIDGET_DELETED = "android.appwidget.action.APPWIDGET_DELETED"; public static final String ACTION_APPWIDGET_DISABLED = "android.appwidget.action.APPWIDGET_DISABLED"; public static final String ACTION_APPWIDGET_ENABLED = "android.appwidget.action.APPWIDGET_ENABLED";
這裡需要注意的是,一般我們在自己寫AppWidget繼承AppWidgetProvider時,應該要override onUpdate這個方法,好像如果不的話,你的AppWidget就不會生效,具體我也沒有搞清楚。雖然我們自己繼承AppWidgetProvider的類本質上是一個廣播接收器,但是我們可以不override onReceive這個方法,只要調用父類的這個方法就可以,當然如果你想接收一些其他的廣播,當然就要複寫這個方法,加上自己的判斷。
還有一些問題需要說明一下:1.誰會發送廣播給AppWidgetProvider;2.什麼時候發送廣播;3.為何我們在Manifest.xml中只註冊了一個Action: android.appwidget.action.APPWIDGET_UPDATE,卻可以接收四種廣播。下面是Manifest.xml的一部分,可以看到在 intent-filter 中只有一個Action:
<receiver android:name="exampleAppWidgetProvider"> <intent-filter > <action android:name="android.appwidget.action.APPWIDGET_UPDATE"/> </intent-filter> <meta-data android:name="android.appwidget.provider" android:resource="@xml/example_appwidget_info"/></receiver>
對於第一個問題,是AppWidgetService在發送廣播,AppWidgetService負責管理所有的AppWidget,並且它與AppWidgetProvider的互動方式就是通過發送廣播的機制。至於何時發送廣播,一般地當某個AppWidget第一次被手機使用者建立時,會發送一條Enabled和Update廣播,之後如果使用者再建立這個AppWidget時,則只會發送一條Update廣播,當手機使用者刪除一個AppWidget時,自然會收到一條DELETED廣播,如果這個AppWidget在手機中沒有了,則會再發送一條DISABLED廣播,還有就是每個AppWidget有自己的更新時間,一般要半個小時以上才能更新一次,等更新時間到了,還會發送一條Update廣播,但是據說目前Android
4.0 已經沒有這個功能了,不知道詳情。如果想瞭解更多的關於廣播發送的內容,最好還是去看AppWidgetService。