Android桌布設定流程分析

2021-06-22 12:32:18 字數 4070 閱讀 4033

桌布視窗和輸入法視窗一樣,都是一種特殊型別的視窗,一般情況下,系統中都會有乙個桌布視窗,通常位於最底層。

本文主要基於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,開發語言可以選用

google

的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檔案,替換掉就可以了。...