【Android】恢复出厂后静态壁纸加载流程
Android静态壁纸功能实现参与的类
/frameworks/base/core/java/android/app/WallpaperManager.java
给开发者提供方法调用。例:setBitmap()/getBitmap()
/frameworks/base/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java
系统服务,管理壁纸的运行和切换,由SystemServer启动
/frameworks/base/core/java/android/service/wallpaper/WallpaperService.java
Android壁纸服务,ImageWallpaper的父类
/frameworks/base/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java
Android设定的壁纸服务,如果default_wallpaper_component没指定,则使用image_wallpaper_component指定的ImageWallpaper
开机壁纸加载流程
1.SystemServer.java -> startOtherServices()内通过config_enableWallpaperService该布尔值判断是否启动壁纸服务:
if (context.getResources().getBoolean(R.bool.config_enableWallpaperService)) {traceBeginAndSlog("StartWallpaperManagerService");mSystemServiceManager.startService(WALLPAPER_SERVICE_CLASS);traceEnd();
}
服务准备就绪后进行初始化操作,WallpaperManagerService.java->initialize()
void initialize() {mMonitor.register(mContext, null, UserHandle.ALL, true);getWallpaperDir(UserHandle.USER_SYSTEM).mkdirs();// Initialize state from the persistent store, then guarantee that the// WallpaperData for the system imagery is instantiated & active, creating// it from defaults if necessary.loadSettingsLocked(UserHandle.USER_SYSTEM, false);getWallpaperSafeLocked(UserHandle.USER_SYSTEM, FLAG_SYSTEM);}
2.WallpaperManagerService.java->getWallpaperDir()
getWallpaperDir(UserHandle.USER_SYSTEM).mkdirs();
创建系统用户目录/data/system/users/0/,其目录下在壁纸显示后会生成wallpaper_info.xml文件,用于存放壁纸的宽度、高度、壁纸存放位置等信息。
3.WallpaperManagerService.java->loadSettingsLocked()
该方法内开头包括了wallpaper_info文件的创建(JounrnaledFile类)、壁纸文件wallpaper(WallpaperData)的生成、wallpaper_info文件的解析(XmlPullParser)。
loadSettingsLocked(){```if (!success) {wallpaper.width = -1;wallpaper.height = -1;wallpaper.cropHint.set(0, 0, 0, 0);wallpaper.padding.set(0, 0, 0, 0);wallpaper.name = "";// wallpaper.name = "res:com.desaysv.dsvsettings:drawable/wallpaper_bg_dark_normal_1";mLockWallpaperMap.remove(userId);} else {if (wallpaper.wallpaperId <= 0) {wallpaper.wallpaperId = makeWallpaperIdLocked();if (DEBUG) {Slog.w(TAG, "Didn't set wallpaper id in loadSettingsLocked(" + userId+ "); now " + wallpaper.wallpaperId);}}}ensureSaneWallpaperData(wallpaper);```
}
由于首次启动时不存在wallpaper_info.xml,所以success为false,开始初始化wallpaperData属性,并调用ensureSaneWallpaperData()方法通过WindowManager.getDefaultDisplay.getMaximumSizeDimension()获取屏幕最大尺寸作为壁纸宽高。
4.WallpaperManagerService.java->switchUser()
开启WallpaperObserver和ThemeSettingsObserver监听,观测切换壁纸和主题操作
5.WallpaperManagerService.java->bindWallpaperComponentLocked()
拉起壁纸服务,默认为ImageWallpaper。并向WMS申请用于添加壁纸窗口的窗口令牌。后续这一部分主要由WallpaperConnection.onServiceConnected()回调中处理。
6.WallpaperManagerService.java->attachServiceLocked()
在方法内调用IWallpaperServiceWrapper的attach方法,将创建壁纸窗体需要的信息给到WallpaperService。
void attachServiceLocked(WallpaperConnection conn, WallpaperData wallpaper) {try {conn.mService.attach(conn, conn.mToken,TYPE_WALLPAPER, false,wallpaper.width, wallpaper.height, wallpaper.padding);} catch (RemoteException e) {Slog.w(TAG, "Failed attaching wallpaper; clearing", e);if (!wallpaper.wallpaperUpdating) {bindWallpaperComponentLocked(null, false, false, wallpaper, null);}}}
7.WallpaperService-IWallpaperServiceWrapper.attach()
构造IWallpaperEngineWrapperService实例,并在方法内发送DO_ATTACH信息。
8.WallpaperService.java->executeMessage()
public void executeMessage(Message message) {switch (message.what) {case DO_ATTACH: {try {mConnection.attachEngine(this);} catch (RemoteException e) {Log.w(TAG, "Wallpaper host disappeared", e);return;}Engine engine = onCreateEngine();mEngine = engine;mActiveEngines.add(engine);engine.attach(this);return;}....
WallpaperConnection保存IWallpaperEngineWrapper实例,无需担心被回收,而且WallpaperManagerService还可以通过它与实际Engine进行通信。之后再创建Engine对象,Engine是真正的壁纸实现。
engine.attach()方法内也进行壁纸绘制。
9.updataSurfaceSize()->loadWallpaper()->mWallpaperManager.getBitmap()
通过getBitmap()方法获取。
10.WallpaperManager.java->openDefaultWallpaper()
public static InputStream openDefaultWallpaper(Context context, @SetWallpaperFlags int which) {final String whichProp;final int defaultResId;if (which == FLAG_LOCK) {/* Factory-default lock wallpapers are not yet supportedwhichProp = PROP_LOCK_WALLPAPER;defaultResId = com.android.internal.R.drawable.default_lock_wallpaper;*/return null;} else {whichProp = PROP_WALLPAPER;defaultResId = com.android.internal.R.drawable.default_wallpaper;}//不走buildinfo.sh文件读取默认属性值,且该文件的ro.config.wallpaper属性已经丢失final String path = SystemProperties.get(whichProp);if (!TextUtils.isEmpty(path)) {final File file = new File(path);if (file.exists()) {try {return new FileInputStream(file);} catch (IOException e) {//Ignored, fall back to platform default below}}}try {return context.getResources().openRawResource(defaultResId);} catch (NotFoundException e) {// no default defined for this device; this is not a failure}return null;}
在此有frameworks/base/core/res/res/drawable 下提供壁纸资源,通过context.gerResource().openRawResource()返回,在getDefaultWallpaper()中转成bitmap交由ImageWallpaper的drawFrame()进行绘制
【Android】恢复出厂后静态壁纸加载流程相关推荐
- 从源码分析Android的Glide库的图片加载流程及特点
转载:http://m.aspku.com/view-141093.html 这篇文章主要介绍了从源码分析Android的Glide库的图片加载流程及特点,Glide库是Android下一款人气很高的 ...
- android 壁纸加载流程,Android 桌面加载图标过程分析
桌面应用图标流程 前言 本人工作上碰到这么一个需求,开发一款滤镜引擎,将桌面上所有的图标进行统一的滤镜化,这就需要了解一下整个桌面去取图标的过程,了解了整个过程,找到真正拿图标的地方,在真正取图标的地 ...
- Glide图片加载流程浅析
Glide是Android开发中常用的图片框架,其最基本用法例如Glide.with(context).load(url).into(imageView),我们沿着此链式调用的顺序一窥Glide图片加 ...
- Android 系统(169)---Android 7.0 插卡后APN信息的加载流程
Android 7.0 插卡后APN信息的加载流程.UI界面编辑APN的流程及Android中APN配置相关的漏洞 终端中有一个apns-config.xml文件,负责定义各个运营商规定的默认APN参 ...
- android 10.0 更换壁纸加载慢滑动卡顿的解决
1.概述 在10.0的系统产品开发中,在产品开发中对于更换壁纸的时候,如果不是标准的分辨率,会出现更换完壁纸后 壁纸被放大的情况,这样就会感觉到壁纸在更换后,Luancher3在滑动 切换WorkSp ...
- android 恢复出厂设置 时间,Android 恢复出厂设置后,时间不能恢复替:2013年1月1日...
Android 恢复出厂设置后,时间不能恢复为:2013年1月1日 前言 欢迎大家我分享和推荐好用的代码段~~声明 欢迎转载,但请保留文章原始出处: CSDN:http ...
- Android重点笔记,安卓listview 懒加载的实现笔记
1.实现目的与用途 使用懒加载可降低单次访问后台的所获取的数据量,从而提高获取数据的速度,减少流量使用,加快UI界面的响应,提高用户体验度. 2.实现思路 两种实现思路: 1.先设定listview每 ...
- Android插件化开发之动态加载技术简单易懂的介绍方式
转载地方:https://segmentfault.com/a/1190000004062866 基本信息 Author:kaedea GitHub:android-dynamical-loading ...
- Android系统字体加载流程
一.背景 视觉同学提了一个需求,要求手机中显示的字体可以支持medium字体,经过分析,android原生的字体库中并没有中文的medium字体,如果使用bold,显示又太粗,为满足需求,需要分析an ...
最新文章
- Python Qt GUI设计:窗口布局管理方法【强化】(基础篇—6)
- 使用svn时碰到的一个的问题
- 如何给Docker镜像瘦身?
- 初始化页面的时候,如何使TextMode=Password的asp:textbox有默认值显示?
- FTPVSFTPD安装和参数说明
- python中参数(带星号的参数)
- 30kJava程序员升为全栈架构师的晋升之路
- ROS2 on android,ROS2 通过Debian安装ROS2
- idea复制java_IntelliJ IDEA的剪切、复制和粘贴
- html 分页_JQuery堪称完美的分页函数
- go java性能_服务端I/O性能大比拼:Node、PHP、Java和Go
- 英寸、 Picas、 点、 跨度和 Twips 之间的关系
- POJ1734无向图求最小环
- gsoap 实现 C/C++ 调用web service
- list 查找_趣味图解算法之二分查找
- HDU 1285 拓普排序 基本模板例题 确定比赛名次
- arcgis两点之间连线_three3D地图设置两点之间的连线
- 生信识图 之 点图基础
- python学习笔记(2)—— 控制流
- HikariPool-1 - Exception during pool initialization. Could not create connection