在 res 新建 xml 文件夾,創(chuàng)建一個(gè) .xml 的文件。
如果 res 下沒(méi)有 xml 文件,則先創(chuàng)建。
.xml 內(nèi)容如下:
屬性的注釋在上面寫(xiě)的很清楚了,這里需要說(shuō)兩點(diǎn)。
1.關(guān)于寬度和高度的數(shù)值定義是很有講究的,在桌面其實(shí)是按照“格子”排列的。
看 給的圖。上面我們代碼定義 110dp 也就是說(shuō),它占了2*2的空間。
2.第二點(diǎn)很重要。有個(gè) 屬性,更新的時(shí)間間隔(ms)。
官方給提供了小部件的自動(dòng)更新時(shí)間,但是卻給了限制,你更新的時(shí)間必須大于30分鐘,如果小于30分鐘,那默認(rèn)就是30分鐘。
可以我們就是要5分鐘更新啊,怎么辦呢?
所以就不能使用這個(gè)默認(rèn)更新,我們要自己來(lái)通過(guò)發(fā)送廣播控制更新時(shí)間,也就是一開(kāi)始總步驟里面第4步,加一個(gè) 來(lái)控制 的更新時(shí)間,這個(gè)在最后一步添加。
2.創(chuàng)建布局文件
在 創(chuàng)建 .xml 文件。
這里要注意的就是 桌面部件并不支持 所有的控件。
支持的控件如下:
App Widget支持的布局:
? ? ? FrameLayout
? ? ? LinearLayout
? ? ? RelativeLayout
? ? ? GridLayout
App Widget支持的控件:
? ? ? AnalogClock
? ? ? Button
? ? ? Chronometer
? ? ? ImageButton
? ? ? ImageView
? ? ? ProgressBar
? ? ? TextView
? ? ? ViewFlipper

? ? ? ListView
? ? ? GridView
? ? ? StackView
? ? ? AdapterViewFlipper
3. 管理 狀態(tài)
這里代碼看起來(lái)可能有點(diǎn)多,先聽(tīng)我講幾個(gè)邏輯,再來(lái)看代碼。
1. 的各種東西都有自己的生命周期, 也不例外,它有幾個(gè)方法來(lái)管理自己的生命周期。
2. 同一個(gè)小部件是可以添加多次的,所以更新控件的時(shí)候,要把所有的都更新。
3. () 用來(lái)接收廣播,它并不在生命周期里。但是,其實(shí) () 是掌控生命周期的。
如下是 () 父類(lèi)的源碼,右邊是每個(gè)廣播對(duì)應(yīng)的方法。
上面我畫(huà)的生命周期的圖,也比較清楚。
然后我們?cè)賮?lái)看代碼。
新建一個(gè) 類(lèi),繼承 。
主要邏輯在 () 里,其他的都是生命周期切換時(shí),所處理的事情。
我們?cè)谙旅娣治?()。
( , )
它傳了兩個(gè)值回來(lái), 是跳轉(zhuǎn)、發(fā)廣播用的。
我們用來(lái)判斷的是 ,這里用到了 的兩種方式。
作為信息傳遞者。
它要把信息傳給誰(shuí),可以有三個(gè)匹配依據(jù):一個(gè)是,一個(gè)是,一個(gè)是data。
String ACTION_UPDATE_ALL = "com.lyl.widget.UPDATE_ALL";
這個(gè)最后會(huì)在 .xml 里面注冊(cè)時(shí)寫(xiě)進(jìn)去。
當(dāng)每隔 N 秒/分鐘,就發(fā)送一次這個(gè)廣播,更新所有UI。
intent.hasCategory(Intent.CATEGORY_ALTERNATIVE)
是廣播事件里攜帶的 里設(shè)置的,用來(lái)匹配。
點(diǎn)擊“恢復(fù)”按鈕,計(jì)數(shù)器清零。
然后是 () 這個(gè)方法程序計(jì)數(shù)器里放的是什么,更新 UI。
更新 UI 用到了一個(gè)新東西——。
怎么來(lái)理解 呢?
因?yàn)?,桌面部件并不像平常布局直接展示,它需要通過(guò)某種服務(wù)去更新UI。但是我們的App怎么能去控制桌面上的布局呢?
所以就需要有一個(gè)中間人,類(lèi)似傳遞者。
我告訴傳遞者,你讓他把我的 R.id. ,更新成 “hello world”。
你讓他把我的 R.id. 按鈕點(diǎn)擊之后去響應(yīng) 這件事。
就是承擔(dān)著一個(gè)這樣的角色。
然后再去理解代碼,是不是稍微好一點(diǎn)了?
4. 最后就是 控制 的更新時(shí)間
說(shuō)好的 當(dāng)每隔 N 秒/分鐘,就發(fā)送一次這個(gè)廣播。
那到底在哪發(fā)呢?也就是我們剛開(kāi)始說(shuō)的,用 來(lái)控制時(shí)間。
新建一個(gè) 類(lèi),繼承 。代碼如下:
在 開(kāi)啟一個(gè)計(jì)時(shí)線程,每1秒發(fā)送一個(gè)廣播,廣播就是我們自己定義的類(lèi)型。
5. 在 .xml 注冊(cè) 桌面部件 和 服務(wù)
然后就只剩最后一步了,注冊(cè)相關(guān)信息
相應(yīng)的注釋都在上面,如果我們的App進(jìn)程被殺掉,服務(wù)也被關(guān)掉,那就沒(méi)辦法更新UI了。
也可以再創(chuàng)建一個(gè) 監(jiān)聽(tīng)系統(tǒng)的各種動(dòng)態(tài),來(lái)喚醒我們的通知服務(wù),這就屬于進(jìn)程保活了。
至此,以上代碼寫(xiě)完,如果不出問(wèn)題,運(yùn)行之后直接去桌面看小工具,我們的App就在里面了,可以添加到桌面。
對(duì)于需要定時(shí)更新的桌面部件,保證自己的服務(wù)在后臺(tái)運(yùn)行也是一件比較重要的事情。
這個(gè)我們還是可以好好做一下,畢竟用戶(hù)都已經(jīng)愿意把我們的程序放到桌面上,所以只要友好的引導(dǎo)用戶(hù)給你一定的權(quán)限,存活概率還是很大。
再不濟(jì),讓用戶(hù)主動(dòng)點(diǎn)開(kāi)App,也不失為一種辦法。
好的創(chuàng)意才能造就好的App,代碼只是實(shí)現(xiàn)。
最后放上項(xiàng)目地址:
ZZS
優(yōu)秀人才不缺工作機(jī)會(huì),只缺適合自己的好機(jī)會(huì)。但是他們往往沒(méi)有精力從海量機(jī)會(huì)中找到最適合的那個(gè)。
會(huì)對(duì)平臺(tái)上的人才和企業(yè)進(jìn)行嚴(yán)格篩選,讓「最好的人才」和「最好的公司」相遇。
掃描下方二維碼程序計(jì)數(shù)器里放的是什么,注冊(cè),談?wù)勀銓?duì)下一份工作的期待。一周內(nèi),收到 5-10 個(gè)滿足你要求的好機(jī)會(huì)!
如果你有想學(xué)習(xí)的文章直接留言,我會(huì)整理征稿。如果你有好的文章想和大家分享歡迎投稿,直接向我投遞文章鏈接即可。