天天看點

app widget簡單用法(1)

本文章是對我學習 android 過程中學到的知識進行彙總、整理、與分享。内容來源為 網絡流傳的視訊、文章、android官方文檔等。在此感謝那些在我學習過程中提供知識和幫助的無私的人。

使用對象:AppWidgetProviderInfo 和 AppWidgetProvider 。

1. AppWidgetProviderInfo :為App Widget 提供中繼資料,包括布局,更新頻率等資訊。這個對象在XML中定義。

2.AppWidgetProvide :定義了App Widget 的生命周期函數。

建立步驟:

1. 定義AppWidgetProviderInfo :

(1)在res/xml 檔案夾中定義一個名為 meta_data_appwidget_info.xml 的檔案:

<appwidget-provider

     xmlns:android="http://schemas.android.com/apk/res/android"

     android:minWidth="100dip"

     android:minHeight="100dip"

     android:updatePeriodMillis="43200000"

     android:initialLayout="@layout/appwidget">

</appwidget-provider>

 這裡的 android:initialLayout="@layout/appwidget"  是app widget 的布局檔案。

(2)在res/Layout 中建立 appwidget.xml 檔案(app widget的布局檔案)

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    xmlns:tools="http://schemas.android.com/tools"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:orientation="vertical"

     >

    <TextView

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:background="#00ff00"

        android:text="@string/hello_world" />

</LinearLayout>

這裡隻用一個TextView做個簡單示範。

2. 實作AppWidgetProvider (重寫幾個回調函數,實作生命周期?)

onUpdate: 在達到指定的更新時間之後,或當使用者向桌面添加app widget 時會調用該方法。

onDeleted: 當app widget 被删除時,會調用該方法。

onEnabled: 當app widget 的第一個執行個體被建立時,會調用該方法。(使用者可以添加n多個執行個體,但隻有在第一次添加時才會調用這個方法)

onDisabled: 當 最後一個 app' widget 執行個體被删除後,會調用該方法。

onReveice: 接受廣播事件。(app widget的狀态改變,其實是通過廣播來實作的)

onAppWidgetOptionsChanged: 當app widget 改變的時候,會調用該方法?

建立類 MyAppWidgetProvider ,繼承 AppWidgetProvider 并重寫上面幾個方法。

注意因為 MyAppWidgetProvider 需要随時被 activity thread 通路,是以必須寫成 public 。而且必須靜态注冊 receiver 。

3. 在 androidMainFest.xml 裡注冊一個receiver

 <receiver 

            android:name="MyAppWidgetProvider">

            <intent-filter>

                <action android:name="android.appwidget.action.APPWIDGET_UPDATE"/>

            </intent-filter>

            <meta-data android:name="android.appwidget.provider"

                android:resource="@xml/meta_data_appwidget_info"/>

 </receiver>

這裡的 android:name="MyAppWidgetProvider" 就是你繼承 AppWidgetProvider 的那個子類的名字,注意名字前面沒有” .“。

這裡的 android:resource="@xml/meta_data_appwidget_info" 就是剛才在 xml 檔案夾手動建立的 解析app widget 布局檔案的檔案。

這裡的 action name 和 meta-data name 都是系統定義好,固定的。有時候代碼填充不顯示,需要自己手動敲上去。

至此,一個 add widget 就已經完成了。可以看到運作結果

app widget簡單用法(1)
app widget簡單用法(1)

我出現過的問題:

1. Unable to instantiate receiver ... (無法執行個體化接收器), class ... is not accessivle from class android.app.ActivityThread(不能從 android 系統的 Activity  線程 中通路)

問題原因:

 public class *** extends AppWidgetProvider {} ,*** 必須寫成 public 。而且必須靜态注冊 receiver 。