本章将对壁纸的实现原理进行讨论。在Android中,壁纸分为静态与动态两种。静态壁纸是一张图片,而动态壁纸则以动画为表现形式,或者可以对用户的操作作出反应。这两种形式看似差异很大,其实二者的本质是统一的。它们都以一个Service的形式运行在系统后台,并在一个类型为TYPE\_WALLPAPER的窗口上绘制内容。进一步讲,静态壁纸是一种特殊的动态壁纸,它仅在窗口上渲染一张图片,并且不会对用户的操作作出反应。因此本章将首先通过动态壁纸的实现讨论Android壁纸的实现与管理原理,然后在对静态壁纸的实现做介绍。

Android壁纸的实现与管理分为三个层次:

- WallpaperService与Engine。同SystemUI一样,壁纸运行在一个Android服务之中,这个服务的名字叫做WallpaperService。当用户选择了一个壁纸之后,此壁纸所对应的WallpaperService便会启动并开始进行壁纸的绘制工作,因此继承并定制WallpaperService是开发者进行壁纸开发的第一步。Engine是WallpaperService中的一个内部类,实现了壁纸窗口的创建以及Surface的维护工作。另外,Engine提供了可供子类重写的一系列回调,用于通知壁纸开发者关于壁纸的生命周期、Surface状态的变化以及对用户的输入事件进行响应。可以说,Engine类是壁纸实现的核心所在。壁纸开发者需要继承Engine类,并重写其提供的回调以完成壁纸的开发。这一层次的内容主要体现了壁纸的实现原理。

- WallpaperManagerService,这个系统服务用于管理壁纸的运行与切换,并通过WallpaperManager类向外界提供操作壁纸的接口。当通过WallpaperManagaer的接口进行壁纸的切换时,WallpaperManagerService会取消当前壁纸的WallpaperService的绑定,并启动新壁纸的WallpaperService。另外,Engine类进行窗口创建时所使用的窗口令牌也是由WallpaperManagerService提供的。这一层次主要体现了Android对壁纸的管理方式。

- WindowManagerService,用于计算壁纸窗口的Z序、可见性以及为壁纸应用窗口动画。壁纸窗口(TYPE\_WALLPAPER)的Z序计算不同于其他类型的窗口。其他窗口依照其类型会有固定的mBaseLayer以及mSubLayer,并结合它们所属的Activity的顺序或创建顺序进行Z序的计算,因此这些窗口的Z序相对固定。而壁纸窗口则不然,它的Z序会根据FLAG\_SHOW\_WALLPAPER标记在其它窗口的LayoutParams.flags中的存在情况而不断地被调整。这一层次主要体现了Android对壁纸窗口的管理方式。

本章将通过对动态壁纸切换的过程进行分析揭示WallpaperService、Engine以及WallpaperManagerService三者的实现原理以及协作情况。静态壁纸作为动态壁纸的一种特殊情况,将会在完成动态壁纸的学习之后于8.3节进行讨论。而WindowManagerService对壁纸窗口的处理将在8.4节进行介绍。

android 壁纸服务,8.1 初识Android壁纸相关推荐

  1. android模仿qq登录界面,初识Android二之小试牛刀模仿实现qq登陆界面

    初识Android二之小试牛刀模仿实现qq登陆界面.俗话说得好,老师踢开门,修行在自己.勉勉强强学完生命周期,然后悠悠闲闲听了两节课后,老师就布置了一个登陆界面的实现,于是,磕磕绊绊的修行之路开始了. ...

  2. android 启动服务同时传递数据,Android Studio开发基础之起动Service,并通过从Activity向Service传递数据...

    Android Studio开发基础之启动Service,并通过从Activity向Service传递数据 本实例演示启动Service,并通过从Activity向Service传递数据,新建一个Se ...

  3. android启动服务的生命周期,android Service启动运行服务 生命周期

    Service Android中的service类似于windows中的service,service一般没有用户操作界面,它运行于系统中不容易被用户发觉, 可以使用它开发如监控之类的程序. 一.步骤 ...

  4. android启动服务的生命周期,Android Service的两种启动方式以及生命周期

    Service的两种启动方式: 1.startService 2.bindService 注意: .在Android 5.0之后google出于安全的角度禁止了隐式声明Intent来启动Service ...

  5. android exchange服务,带有“ Service com.android.exchange.ExchangeService

    我正在用Android开发一个非常简单的应用程序.我制作了一个启动屏幕,主菜单以及一个带有单选按钮和一个按钮的页面(该按钮会根据选中的单选按钮播放声音).该应用程序运行正常(不会崩溃),但是我一直在l ...

  6. android 定位服务 耗电吗,关于Android的定位服务

    今天因为工作须要,把以前编写的一个GPS测试法度榜样拿出来从新修改了一下.这个法度榜样说起来竽暌剐些汗青了,是我11年编写的,那时刻学了Android开辟没多久,算是一个实验性的作品.如今工作须要,从 ...

  7. android用服务建立悬浮窗,Android悬浮窗用法总结

    转载请注明出处:Android悬浮窗用法总结 最近项目里用到了悬浮窗,在这里做一下总结. WindowManager 悬浮窗主要是通过WindowManager这个类实现的,这个类有3个方法: voi ...

  8. android前台服务需要解绑,Android接入

    初始化 配置通道服务 必须在应用启动时(Application的onCreate方法中)初始化通道服务配置,所有进程都需要执行.try { // 参考脚手架demo从配置文件获取 Map ipStra ...

  9. android 判断服务是否正在运行,Android 判断某个服务(service)是否运行

    判断某个服务是否正在运行的方法 实现代码: /** * * * @param mContext * @param serviceName * 是包名+服务的类名(例如:net.loonggg.test ...

  10. Android辅助服务监听dialog,Android开发中对话框辅助类——DialogHelper

    写在前面: 对话框在平时的开发工作中使用率很频繁,但是很多开发者每次使用都去写一堆代码,如此,不单单效率不高,而且代码也不优...为此,写了简单的封装. 效果如: 关键类DialogHelper.ja ...

最新文章

  1. maven项目没有错,但是在项目头上有红叉的解决方法
  2. 计算机电容的作用,电容和电感的作用
  3. 手把手带你掌握计算机视觉原始论文细节阅读
  4. 【Linux】一步一步学Linux——at命令(133)
  5. 三维重建13:点云的局部特征总结
  6. 机器人出魔切还是三相_哇!电站凝汽器清洗居然可以用机器人啦
  7. java update 8_版本任你发,我用Java 8!JDK的更新,改变了哪些你写代码的方式?...
  8. 优化mysql插入数据_优化MySQL插入方法的五个妙招
  9. leetcode python3 简单题189. Rotate Array
  10. 英特尔、阿里巴巴全方位深化技术创新,共同引领数智未来
  11. 发力多人在线游戏!PS5有望2020年E3展会亮相!
  12. 老版资源嗅探浏览器 - 遨游浏览器稀有绿色版
  13. 生产排产软件中MTO模式的优缺点
  14. 线性规划 - 数学建模
  15. 2022年数学建模国赛--赛后总结
  16. Mysql安装(转自韩顺平教育)
  17. 秒懂mysql中的group by用法
  18. CVPR 2020 | 京东AI研究院对视觉与语言的思考:从自洽、交互到共生
  19. oracle数据库启动cannot mount database in EXCLUSIVE mode
  20. 【专升本计算机】计算机操作系统练习题(选择判断名词解释简答)

热门文章

  1. 2008 php mysql_Windows Server 2008 R2 IIS7.5+PHP5(FastCGI)+MySQL5环境搭建教程
  2. H264/AVC协议基本概况
  3. H.264 AVC 编解码标准
  4. qt unicode转gbk_Qt中文编码和QString类Unicode编码转换
  5. c语言个人日记本系统的设计,c语言程序课程设计日记本管理系统.doc
  6. 51单片机初值计算方法
  7. MTK平台手机刷机工具分享
  8. 阁下可知文言编程之精妙?文言文亦能编程!此诚年度最骚语言也,数天6K星...
  9. 大学生发明文言文编程语言!李白杜甫棺材板压不住啦!
  10. 物联网学习之旅:微信小程序控制STM32(二)--ESP8266连接mqtt服务端