AppWidget之AppWidgetProvider

來源:互聯網
上載者:User

    在開發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。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.