widget機(jī)制

android中的widget是非常有意思的一個功能夭谤,widget不是運(yùn)行在自己的進(jìn)程中棺牧,通常是運(yùn)行在桌面、鎖屏等應(yīng)用上朗儒,如何理解跨進(jìn)程通信并更新widget界面颊乘,是理解widget的關(guān)鍵参淹。

widget核心是一個廣播接收器,AppWidgetProvider乏悄,它有幾個核心的回調(diào)函數(shù)承二。

// 沒接收一次廣播消息就調(diào)用一次,使用頻繁
public void onReceive(Context context, Intent intent) {
    super.onReceive(context, intent);
}

// 每次更新都調(diào)用一次該方法纲爸,使用頻繁
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
    super.onUpdate(context, appWidgetManager, appWidgetIds);
}

// 沒刪除一個就調(diào)用一次
public void onDeleted(Context context, int[] appWidgetIds) {
    super.onDeleted(context, appWidgetIds);
}

// 當(dāng)該Widget第一次添加到桌面是調(diào)用該方法,可添加多次但只第一次調(diào)用
public void onEnabled(Context context) {
    super.onEnabled(context);
}

// 當(dāng)最后一個該Widget刪除是調(diào)用該方法妆够,注意是最后一個
public void onDisabled(Context context) {
    super.onDisabled(context);
}

根據(jù)實(shí)際需要识啦,監(jiān)聽對應(yīng)事件,實(shí)現(xiàn)相應(yīng)的方法神妹,在相應(yīng)接口中更新widget界面颓哮。

widget必須在androidmenifest.xml文件中配置插件信息,以便包管理服務(wù)識別鸵荠。

    <receiver 
        android:label="@string/app_name_timewidget" 
        android:name="com.owl.mythou.TimeWidget">
        <intent-filter>
        <action android:name="android.appwidget.action.APPWIDGET_UPDATE"></action>
        </intent-filter>
        <meta-data 
          android:name="android.appwidget.provider" 
          android:resource="@xml/time_widget_config">
        </meta-data>
    </receiver>

widget的初始配置文件如下冕茅,需要指定插件的最小寬高以及其它可選項(xiàng),刷新頻率蛹找,默認(rèn)效果圖片等等姨伤。

    <appwidget-provider
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:initialLayout="@layout/time_widget_layout"
        android:minWidth="286dip" 
        android:minHeight="142dip" 
        android:updatePeriodMillis="0">
    </appwidget-provider>
  • android:initialLayout 指定界面布局的Layout文件,和activity的Layout一樣
  • android:minWidth 你的widget的最小寬度庸疾。根據(jù)Layout的單元格計算(72*格子數(shù)-2)
  • android:minHeigh 你的widget的最小高度乍楚。計算方式和minwidth一樣。
  • android:updatePerioMillis 使用系統(tǒng)定時更新服務(wù)届慈,單位毫秒徒溪。

widget的具體開發(fā)如上,但到底是如何影響到桌面顯示金顿,它們的包名不一樣臊泌,進(jìn)程也不一樣。它們是如何進(jìn)行跨進(jìn)程通信揍拆。在理解widget之前渠概,必須要理解android中的remoteviews是如何工作的。

remoteviews礁凡,顧名思義是遠(yuǎn)程view高氮,但它不是一個真正的view,因?yàn)檎嬲膙iew是無法跨進(jìn)程通信的顷牌,remoteviews實(shí)現(xiàn)了parcelable接口剪芍,可以實(shí)現(xiàn)跨進(jìn)程通信,可以將remoteviews理解為一個view的描述文件窟蓝,其內(nèi)部維護(hù)了一個action列表罪裹,每個action記錄了用戶調(diào)用的方法名饱普,參數(shù),最終實(shí)現(xiàn)反射調(diào)用状共,實(shí)現(xiàn)用戶設(shè)置的ui效果套耕。

widget應(yīng)用維護(hù)著一個remoteviews,當(dāng)widget需要更新時峡继,必須通過widget服務(wù)刷新冯袍,以便通知桌面或鎖屏實(shí)現(xiàn)界面更新。

widget更新時序圖.png

邏輯調(diào)用時序圖如上所示碾牌。AppWidgetHost有一個實(shí)現(xiàn)了IAppWidgetHost的callback內(nèi)部對象康愤,這樣能就通過aidl方式實(shí)現(xiàn)跨進(jìn)程通信了。具體調(diào)用如上舶吗,widget服務(wù)跨進(jìn)程調(diào)用到widgethost當(dāng)中征冷,完成widgethostview的更新,這樣桌面就實(shí)現(xiàn)了界面刷新誓琼。因?yàn)樽烂嬖诔跏蓟臅r候會將widgethostview添加到界面上检激。

widget機(jī)制,歡迎交流補(bǔ)充腹侣。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末叔收,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子筐带,更是在濱河造成了極大的恐慌今穿,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件伦籍,死亡現(xiàn)場離奇詭異蓝晒,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)帖鸦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進(jìn)店門芝薇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人作儿,你說我怎么就攤上這事洛二。” “怎么了攻锰?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵晾嘶,是天一觀的道長。 經(jīng)常有香客問我娶吞,道長垒迂,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任妒蛇,我火速辦了婚禮机断,結(jié)果婚禮上楷拳,老公的妹妹穿的比我還像新娘。我一直安慰自己吏奸,他們只是感情好蚂维,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布床玻。 她就那樣靜靜地躺著固蚤,像睡著了一般联贩。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上泊碑,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天产上,我揣著相機(jī)與錄音,去河邊找鬼蛾狗。 笑死,一個胖子當(dāng)著我的面吹牛仪媒,可吹牛的內(nèi)容都是我干的沉桌。 我是一名探鬼主播,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼算吩,長吁一口氣:“原來是場噩夢啊……” “哼留凭!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起偎巢,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤蔼夜,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后压昼,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體求冷,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年窍霞,在試婚紗的時候發(fā)現(xiàn)自己被綠了匠题。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡但金,死狀恐怖韭山,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情冷溃,我是刑警寧澤钱磅,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布,位于F島的核電站似枕,受9級特大地震影響盖淡,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜菠净,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一禁舷、第九天 我趴在偏房一處隱蔽的房頂上張望彪杉。 院中可真熱鬧,春花似錦牵咙、人聲如沸派近。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽渴丸。三九已至,卻和暖如春另凌,著一層夾襖步出監(jiān)牢的瞬間谱轨,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工吠谢, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留土童,地道東北人。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓工坊,卻偏偏與公主長得像献汗,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子王污,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,728評論 2 351

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,871評論 25 707
  • 一罢吃、雞湯 appwidget是android中小組件,我們經(jīng)常說的widget其實(shí)是指的那些button昭齐、text...
    歡樂斗佛閱讀 2,241評論 1 8
  • 概述 RemoteViews顧名思義就是遠(yuǎn)程View尿招,它表示的是一個View結(jié)構(gòu),它可以在其他進(jìn)程中顯示阱驾,為了跨進(jìn)...
    shenhuniurou閱讀 23,859評論 1 20
  • 1. 引言 為什么會抽象出設(shè)計模式里覆?設(shè)計模式是在眾多人開發(fā)大型項(xiàng)目遇到問題吁伺,為了解決特定問題而抽象出來的解決方案。...
    LeeLeCoder閱讀 345評論 0 0
  • 有些時候,你不得不承認(rèn)窟却,你對你身上某些方面越自信,你可能就越缺那些東西呻逆。所以夸赫,要明白,過去咖城,現(xiàn)在和以后所經(jīng)歷的最終...
    皆然閱讀 590評論 0 0