通过阅读WallpaperManagerService会发现WallpaperManager中进行壁纸切换的方式,简单来说在我们设置壁纸时,WallpaperManager把壁纸以文件的形式保存在/data/data/com.android.settings/files/WallpaperManager。同时还有一个关键的文件,/data/system/wallpaper_info.xml,发现该配置文件中保存有壁纸的期望宽度与高度。但是阅读WallpaperManager并没有发现壁纸真正绘制的地方,仔细阅读后,发现Android中的壁纸管理与壁纸绘制同样通过ServiceBind的方式来通知绘制壁纸,在Android中默认的绘制方式SystemUI的ImageWallpaper,通过阅读该部分代码,可以发现壁纸的真正绘制通过Surfice上使用Canvas,或硬件加速的方式实现绘制。了解到这里基本就可以解释、解决WallpaperManager的问题了。
1.WallpaperManager的问题一:
指定竖屏、单屏壁纸后,开机壁纸被拉伸。这个主要是在WallpaperManagerService中load配置文件的问题,在Android中,设置壁纸后,直接会将壁纸的宽度、高度保存在配置文件中,在启动时,读取配置文件,指导绘制方进行绘制。问题就出在读取配置文件的时候,在Android中,不允许壁纸的宽度比高度小,具体的原因没有看明白,系统中在发现保存的宽度比高度小后,会对其宽度进行拉伸,拉到与高度一样高,这就是为什么原来竖屏、单屏的壁纸重启后变成可以滑动的了。主要问题代码如下:
privatevoidloadSettingsLocked() {
if(DEBUG) Slog.v(TAG,"loadSettingsLocked");
JournaledFile journal = makeJournaledFile();
FileInputStream stream = null;
File file = journal.chooseForRead();
booleansuccess =false;
try{
stream = newFileInputStream(file);
XmlPullParser parser = Xml.newPullParser();
parser.setInput(stream, null);
inttype;
do{
type = parser.next();
if(type == XmlPullParser.START_TAG) { <