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】恢复出厂后静态壁纸加载流程相关推荐

  1. 从源码分析Android的Glide库的图片加载流程及特点

    转载:http://m.aspku.com/view-141093.html 这篇文章主要介绍了从源码分析Android的Glide库的图片加载流程及特点,Glide库是Android下一款人气很高的 ...

  2. android 壁纸加载流程,Android 桌面加载图标过程分析

    桌面应用图标流程 前言 本人工作上碰到这么一个需求,开发一款滤镜引擎,将桌面上所有的图标进行统一的滤镜化,这就需要了解一下整个桌面去取图标的过程,了解了整个过程,找到真正拿图标的地方,在真正取图标的地 ...

  3. Glide图片加载流程浅析

    Glide是Android开发中常用的图片框架,其最基本用法例如Glide.with(context).load(url).into(imageView),我们沿着此链式调用的顺序一窥Glide图片加 ...

  4. Android 系统(169)---Android 7.0 插卡后APN信息的加载流程

    Android 7.0 插卡后APN信息的加载流程.UI界面编辑APN的流程及Android中APN配置相关的漏洞 终端中有一个apns-config.xml文件,负责定义各个运营商规定的默认APN参 ...

  5. android 10.0 更换壁纸加载慢滑动卡顿的解决

    1.概述 在10.0的系统产品开发中,在产品开发中对于更换壁纸的时候,如果不是标准的分辨率,会出现更换完壁纸后 壁纸被放大的情况,这样就会感觉到壁纸在更换后,Luancher3在滑动 切换WorkSp ...

  6. android 恢复出厂设置 时间,Android 恢复出厂设置后,时间不能恢复替:2013年1月1日...

    Android 恢复出厂设置后,时间不能恢复为:2013年1月1日 前言         欢迎大家我分享和推荐好用的代码段~~声明         欢迎转载,但请保留文章原始出处: CSDN:http ...

  7. Android重点笔记,安卓listview 懒加载的实现笔记

    1.实现目的与用途 使用懒加载可降低单次访问后台的所获取的数据量,从而提高获取数据的速度,减少流量使用,加快UI界面的响应,提高用户体验度. 2.实现思路 两种实现思路: 1.先设定listview每 ...

  8. Android插件化开发之动态加载技术简单易懂的介绍方式

    转载地方:https://segmentfault.com/a/1190000004062866 基本信息 Author:kaedea GitHub:android-dynamical-loading ...

  9. Android系统字体加载流程

    一.背景 视觉同学提了一个需求,要求手机中显示的字体可以支持medium字体,经过分析,android原生的字体库中并没有中文的medium字体,如果使用bold,显示又太粗,为满足需求,需要分析an ...

最新文章

  1. Python Qt GUI设计:窗口布局管理方法【强化】(基础篇—6)
  2. 使用svn时碰到的一个的问题
  3. 如何给Docker镜像瘦身?
  4. 初始化页面的时候,如何使TextMode=Password的asp:textbox有默认值显示?
  5. FTPVSFTPD安装和参数说明
  6. python中参数(带星号的参数)
  7. 30kJava程序员升为全栈架构师的晋升之路
  8. ROS2 on android,ROS2 通过Debian安装ROS2
  9. idea复制java_IntelliJ IDEA的剪切、复制和粘贴
  10. html 分页_JQuery堪称完美的分页函数
  11. go java性能_服务端I/O性能大比拼:Node、PHP、Java和Go
  12. 英寸、 Picas、 点、 跨度和 Twips 之间的关系
  13. POJ1734无向图求最小环
  14. gsoap 实现 C/C++ 调用web service
  15. list 查找_趣味图解算法之二分查找
  16. HDU 1285 拓普排序 基本模板例题 确定比赛名次
  17. arcgis两点之间连线_three3D地图设置两点之间的连线
  18. 生信识图 之 点图基础
  19. python学习笔记(2)—— 控制流
  20. HikariPool-1 - Exception during pool initialization. Could not create connection

热门文章

  1. 看完让你彻底理解 WebSocket 原理
  2. 和菜头的独立 Blog 三十万点击量值得祝贺
  3. 医疗器械网络安全漏洞自评报告模板
  4. 国学入门书要目及其读法----梁启超
  5. Android :约束布局ConstraintLayout 之 Chains 链式约束
  6. 小学生名字卡(HTML版可打印)
  7. 水岸秀墅|千年石湖独一墅
  8. 遍历操作__getitem__
  9. 秉火429笔记之一初识STM32
  10. WordPress网站加装SSL证书后无法正常加载图片问题