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

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