桌布視窗和輸入法視窗一樣,都是一種特殊型別的視窗,一般情況下,系統中都會有乙個桌布視窗,通常位於最底層。
本文主要基於android4.4說明,如何為應用程式設定桌布以及設定桌布的基本流程。
主要包含以下幾個部分對桌布進行介紹:
1. 桌布顯示的基本原理
2. 如何讓乙個activity視窗顯示桌布
3.. 桌布的設定流程(包含靜態桌布和動態桌布)
4. 如何製作壁紙包。
如果乙個activity視窗能夠顯示桌布,windowmanagerservice會將桌布視窗移動到這個activity視窗的下面。
桌布視窗對應乙個
wall*****service
,wall*****service
內部有乙個
engine
,engine
負責桌布視窗的建立和顯示內容的描畫。
對於靜態桌布,系統中有乙個
imagewall*****
(繼承自
wall*****service)和
drawableengine
(繼承自
engine)。
動態桌布的
service
和engine
需要新規實現。它們之間的關係如下圖所示。
是由wall*****managerservice
啟動(通過繫結服務的方式)並管理的。
wall*****managerservice
是乙個系統
service
,在系統啟動時,由系統程序
systemserver
建立。
在設定桌布時,應用程式通過
wall*****manager
通過aidl
與wall*****managerservice
進行通訊。
靜態桌布的設定和動態桌布的設定有一些不同。 1.
靜態桌布實際上就是,設定完成後,會將桌布儲存為乙個檔案,
wall*****managerservice
會監聽這個檔案,如果內容發生變化就會繫結
service。
2.動態桌布實際上乙個
apk,不會存在桌布檔案,設定完成後,直接繫結
service。
服務繫結後,到桌布視窗的描畫過程如下圖所示。
要讓activity視窗顯示桌布,必須要滿足兩個條件:
(1)視窗是透過的,比如透明或半透明
(2)視窗屬性中的windowmanager.layoutparams.flag_show_wall*****位設定為1
可以 通過getwindow().addflags(windowmanager.layoutparams.flag_show_wall*****);就行設定
另外通過theme屬性android:theme="@android:style/theme.holo.wall*****
"就可以讓activity視窗顯示桌布,實際上這個主題包含了上面的兩個條件。
1. 選擇live wall*****s
livewall*****activity-〉 cubewall*****1(選擇的動態桌布,此時選擇是example中的cube)-〉livewall*****preview
選擇set wall*****時,呼叫livewall*****preview的setlivewall*****()方法
public void setlivewall*****(view v) catch (remoteexception e) catch (runtimeexception e)
finish();
}
2. 從pictures中選擇桌布
cropimage在剪下完並儲存時呼叫wall*****manager.getinstance(this).setbitmap(croppedimage);然後直接返回。
3. 選擇系統的wall*****s(launcher中自帶的靜態)
進入launcher2.wall*****chooser這個activity,並呼叫它的selectwall*****方法。
private void selectwall*****(int position) catch (ioexception e)
}
這裡設定的是resource id。
小結:從以上三種情況來看,最終呼叫的wall*****manager的三個不同的方法,分別是
(1). setwall*****component
(2). setbitmap
(3). setresource
另外還有乙個介面是setstream(inputstream data), data的**可以是乙個uri或者乙個檔案。
當然也可以使用contextimpl的setwall*****方法。
靜態wall*****儲存在data/system/users/userid/wall*****檔案中(通常userid=0,這種情況下,桌布路徑為data/system/users/0/wall*****)。
wall*****info的資訊儲存在data/system/users/0/wall*****_info.xml
當通過資源的方式設定桌布時,wall*****_info.xml儲存著資源名,如下所示:
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
而直接通過cropimage的方式時,xml檔案中的name資訊為空。
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
對於動態桌布的情況,會在xml檔案中追加component(動態桌布service類的資訊),如下:
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
動態桌布不會儲存wall*****檔案,如果設定了動態桌布,wall*****檔案儲存的是上次設定的靜態桌布的。如果是通過gallery中設定的桌布(crop的情況),儲存的桌布資料是crop之後的。
注意:實現桌布設定程式,要在應用程式中加入下列許可權:
靜態桌布本身是,不需要壁紙包。
動態桌布需要開發動態桌布
apk,開發語言可以選用
的renderscript
語言。
需要繼承wall*****service和桌布引擎engine,另外桌布程式本身有乙個service,需要在manifest檔案中加入
<
service
android:label
="@string/wall*****_magicsmoke"
android:name
="livewall*****service"
android:permission
="android.permission.bind_wall*****"
>
<
intent-filter
>
<
action
android:name
="android.service.wall*****.wall*****service"
/>
intent-filter
>
<
meta-data
android:name= "android.service.wall*****"
android:resource
="@xml/livewall*****"
/>
service
>
xml/livewall*****可以包含動態桌布的thumbnail資訊。 安卓設定桌布
1.獲取桌布顯示在imageview.獲取桌布管理器的例項 final wall manager wm wall manager.getinstance this 獲取到當前桌布的drawable物件 final drawable wall drawable wm.getdrawable 在imag...
Android設定鈴聲分析
其實沒有幾行,這裡簡單記錄下學習的過程.android系統啟動時會掃瞄系統與sd卡中的對 檔案,分別存入資料庫sqlite中,以contentprovider的形式對外提供服務 路徑 data data com.android.providers.media databases 可以看到有2個db檔...
android 5 0 修改預設桌布
android 5.0中homescreen的預設桌布位置 frameworks base core res res drawable nodpi default wall jpg 可以在frameworks base core res目錄下搜尋default wall jpg檔案,替換掉就可以了。...