歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Android -- AppWidget 初級篇

Android -- AppWidget 初級篇

日期:2017/3/1 10:19:07   编辑:Linux編程

一個簡單的AppWidget

最近在寫日歷AppWidget(小部件)代碼,遇到很多問題,AppWidget所支持的操作和View實在有限,動畫效果根本不支持,就連Intent啟動Activity、Service,和在TextView上顯示簡單的“HellWord”都顯得變態。實現了日歷小部件的日歷顯示、Button事件、翻頁動畫效果、onTouch事件等功能。下面就將整理的資料和自己的實踐寫了下來:

其實Appwidget是一個小型的Views,可以嵌入到其他應用程序並且定期更新。這些View被稱為Widgets組件,您可以通過AppwidgetProvider去發布Widgets,能夠容納其他Appwidget的稱為Appwidget host。

1.1 在AndroidManifest.xml中注冊AppWidget

  1. <receiver android:name="ExampleAppWidgetProvider" >
  2. <intent-filter>
  3. <action
  4. android:name="android.appwidget.action.APPWIDGET_UPDATE" />
  5. </intent-filter>
  6. <meta-data android:name="android.appwidget.provider"
  7. android:resource="@xml/example_appwidget_info" />
  8. </receiver>

<receiver>需要android:name屬性,它指定Appwidget所使用的AppwidgetProvider.

<intent-filter>至少需要包含 android:name="android.appwidget.action.APPWIDGET_UPDATE",這個屬性指定AppwidgetProvider接收APPWIDGET_UPDATE廣播,這是唯一一個需要明確聲明的廣播。當需要時,AppWidgetManaget自動給所有Appwidget發生廣播.

<meta-data>指定了AppwidgetProviderInfo資源,需要一下屬性:android:name 指定metadata的名字。使用android.appwidget.provider將其作為AppwProviderInfo的描述性數據

Android:resource 指定AppwidgetProviderInfo資源的位置


1.2 增加AppwidgetProviderInfo Metadata

一個Appwidget的基本屬性是通過AppwidgetproviderInfo去定義的,例如它的最小尺寸的布局,它的初始layout,多久更新Appwidget,還有(可選)在創建時期配置一個Activity。在xml資源中定義一個AppwidgetproviderInfo是通過<appwidget-provider>標簽,並保存在工程的res/xml/文件夾下,例如:

  1. (AppWidget特有的配置文件)
  2. <?xml version="1.0" encoding="utf-8"?>
  3. <appwidget-provider
  4. xmlns:android="http://schemas.android.com/apk/res/android"
  5. android:minWidth="220dp"
  6. android:minHeight="220dp"
  7. android:updatePeriodMillis="86400000"
  8. android:initialLayout="@layout/firstappwidget"
  9. Android:configure="com.example.android.ExampleAppWidgetConfigure"/>
updatePeriodMillis屬性定義了Appwidget應該多久向Appwidgetprovider請求更新。實際更新的時間未必能保證及時更新,並且建議盡量不要頻繁更新。

Configure屬性是當用戶添加一個AppWidget前啟動一個Activity,這個Activity的作用就是配置Appwidget的屬性。


1.3 為Appwidget定義layout

只要你屬性用xml怎麼去定義layout的話,為appwidget定義一個layout還是很簡單的。但是由於Appwidget的布局是基於RemoteVIew,所以只能使用RemoteViews(後面篇章將會對RemoteViews做詳細分析)所支持的 layout(FrameLayout,LinearLayout,RelativeLayout)或者view(AnalogClock, Button , Chronometer ,ImageButton, ImageView, ProgressBar, TextView注意:繼承這些類的子類同樣不支持)。


1.4 使用Appwidgetprovider

Appwidgetprovider是BroadcastReceiver的子類,這個類處理Appwidget的廣播。

Appwidgetprovider只接受於Appwidget有關系的廣播,比如Appwidget在update,deleted,enabled,disable。當這些廣播發生的時候,AppWidgetProvider會調用一下回調方法:

  1. onUpdate(Context, AppWidgetManager, int[])

間隔調用此方法去更新Appwidget,間隔時間的設置時在AppwidgetproviderInfo下的updatePeriodMillis屬性,同樣當用戶添加Appwidget的時候也被調用。如果你已經聲明了一個configuration Activity,用戶添加Appwidget的時候就不會調用onUpdate,但是隨後的更新中依然會被調用。

onDeleted(Context, int[])

當Appwidget從Appwidget host中刪除的時候調用

onEnabled(Context);

當Appwidget第一次創建的時候調用。比如,當用戶增加兩個同樣的Appwidget的時候,這個方法只在第一次去調用。如果你需要打開一個新的數據庫或者其他的設置,而這在所有的Appwidget只需要設置一次的情況下,這個是最後的地方去實現它們。

onDisabled(Context)

當Appwidget的最後一個實例從Appwidget host中刪除的時候調用。這裡可以做一些在onEnabled(Context)中相反的操作,比如刪除臨時數據庫。

onReceive(Context, Intent)

Copyright © Linux教程網 All Rights Reserved