本文章是對我學習 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 就已經完成了。可以看到運作結果
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIyVGduV2QvwVe0lmdhJ3ZvwFM38CXlZHbvN3cpR2Lc1TPB10QGtWUCpEMJ9CXsxWam9CXwADNvwVZ6l2c052bm9CXUJDT1wkNhVzLcRnbvZ2Lc1zYtJGc102YoZ1RiZmUXpFMOdVYrJ1VZZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39zMyUTMxQTNxEDNwUDM3EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
我出現過的問題:
1. Unable to instantiate receiver ... (無法執行個體化接收器), class ... is not accessivle from class android.app.ActivityThread(不能從 android 系統的 Activity 線程 中通路)
問題原因:
public class *** extends AppWidgetProvider {} ,*** 必須寫成 public 。而且必須靜态注冊 receiver 。