Livewallpaper,即动态墙纸,是Android的一大3D特色功能,用户可以在桌面选择加载动态墙纸,让自己的手机桌面背景旋动起来。

相对于静态桌面壁纸,动态墙纸可以展示各种动态变化的背景,而与传统手机系统采用GIF作为动态背景不同的是,Android的动态墙纸并不是GIF图片,而是一个标准的Android应用程序,也就是APK。既然是应用程序,当然意味着天生具有GIF图片不具备的功能——能与用户发生交互,而且动态的背景变化绝不仅仅局限于GIF图片那般只能是固定的几张图片的循环播放。

需要指出的是,标准的Android系统可以支持将动态的GIF图片设置为墙纸,但并不能将GIF图片动态的运行起来。也就是说,如果你将GIF图片作为墙纸,你只能看到一帧静态的图片,不能像很多其他系统的山寨机那样能够在桌面看到GIF图片动态效果。这种局限是Android的一大缺陷,这个缺陷是Android墙纸框架设计缺陷有关。当然了,既然你可以加载丰富类型的旋动的具有交互效果的Android动态墙纸,那么GIF图片的少许遗憾完全可以接受。

Android内置的动态墙纸都是基于RenderScript实现的,RenderScript是Google用于Android的一种类C语言,其与C语言语言结构很类似,其对OpenGL的标准API进行了简单的封装,可以在运行时再加载RenderScript文件运行。也就是说,如果你想基于RenderScript开发新的动态墙纸,你应该对OpenGL的常用API有一定的了解。此外,Google目前对RenderScript的开发资料还不是很完善,在公开发布的SDK里也暂时没有把RenderScript继承进ADT,换言之,如果你想用RenderScript开发新动态墙纸,你不能基于ADT和SDK在Eclipse下进行开发,而应该下载完整源代码并编译整个框架,然后在自己的Linux编译环境里去写新应用。因为RenderScript是要调用OpenGL接口的,你开发的应用要能在真机上运行起来,你的机子必须支持3D,也就是OpenGL。如果你发现有的厂商的手机桌面并没有加载动态墙纸的入口,那么不用多说,那一定是该手机根本不支持3D,这一点对于想购买真机来学习Andoid开发的朋友来说就一定要当心了。

Google在发布的各个Android版本里都内置了一定数量的动态墙纸,各个版本的动态墙纸代码有少许差别,但是动态墙纸的名称、视效、个数基本都是一样的。下面我们看下这些动态墙纸的代码在什么位置。我们打开Google的Android源代码地址:http://android.git.kernel.org/

可以看到,Android内置的动态墙纸都在packages/wallpapers/这个目录里,通过git clone方法(参见博文“Android源码下载——用git clone实现单个目录下载”,http://blog.csdn.net/droidpioneer/article/details/6612026)快速的下载各个子目录各个Android版本的Android内置动态墙纸代码。其中,Basic、MusicVisualization两个目录里都包括了多个相同代码框架的多个动态墙纸,MagicSmoke目录只包含魔幻烟雾一个动态墙纸,LivePicker目录里包含的是动态墙纸的选择列表的代码,也就是你在桌面选择添加动态墙纸时出现的系统里所有动态墙纸的那个列表的实现代码。

那么,动态墙纸的本质是什么呢?前文已述,是APK,不过是比较特殊的APK。我们不妨打开MagicSomke的AndroidManifest.xml文件:

<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.magicsmoke">
<original-package android:name="com.android.magicsmoke" />
<uses-feature android:name="android.software.live_wallpaper" />
<uses-permission android:name="android.permission.SET_WALLPAPER_COMPONENT" />
<uses-permission android:name="android.permission.BIND_WALLPAPER" />
<application
android:label="@string/wallpapers"
android:icon="@drawable/ic_launcher_wallpaper">
<service
android:label="@string/wallpaper_magicsmoke"
android:name="MagicSmoke"
android:permission="android.permission.BIND_WALLPAPER">
<intent-filter>
<action android:name="android.service.wallpaper.WallpaperService" />
</intent-filter>
<meta-data android:name= "android.service.wallpaper" android:resource="@xml/magicsmoke" />
</service>
<activity
android:name="com.android.magicsmoke.MagicSmokeSelector"
android:theme="@style/Preview"
android:exported="true">
</activity>
</application>
</manifest>

我想细心的朋友已经猜出来了,Android动态墙纸的本质是一个“Service”,这个Service能够被主界面Launcher加载。那么Launcher是如何能识别这个包含动态墙纸Service的APK的呢?上面这个AndroidManifest.xml文件的intent-filter的action泄露了天机:

<action android:name="android.service.wallpaper.WallpaperService" />

不错,系统正式通过APK的这个action把其当做一个动态墙纸加载进LivePicker列表,用户在LivePicker列表里选择自己喜欢的动态墙纸,进而将动态墙纸显示进Launcher的背后。

需要指出的是,Android的动态墙纸虽然似乎是显示在Launcher的背景里,但其实这只是假象,动态墙纸和Launcher是完全不同的两个进程,只不过Launcher和动态墙纸的进程可以通过框架里的WallpaperManager进行进程间通信罢了,用户在Launcher桌面滑动、点击屏幕时有的动态墙纸能产生交互效果,实际上就是这个进程通信完成的。如果你通过代码将Launcher的背景设置为非透明的,比如以不透明的图片或者颜色作为背景,那么,你将看不到任何动态墙纸效果,当然,这样的话,静态墙纸你也不会看到了。

/*****************************************************************************************************************************************/

本文为原创文章,转载请务必注明出处:http://blog.csdn.net/droidpioneer/article/details/6787571 

安卓开发用机友情链接:http://vpclub.octech.com.cn/ztewd/9495.html

 /******************************************************************************************************************************************/

Android原理揭秘系列之动态墙纸相关推荐

  1. android原理揭秘系列之VacantCell缓存

    2019独角兽企业重金招聘Python工程师标准>>> 操作过Android手机的朋友应该对在待机界面拖动图标的交互效果都有比较深刻的印象,比如说,当把图标拖动起来,图标会悬浮并随着 ...

  2. Android原理之动态墙纸

    Livewallpaper,即动态墙纸,是Android的一大3D特色功能,用户可以在桌面选择加载动态墙纸,让自己的手机桌面背景旋动起来. 相对于静态桌面壁纸,动态墙纸可以展示各种动态变化的背景,而与 ...

  3. Android后台杀死系列之三:LowMemoryKiller原理(4.3-6.0)

    本篇是Android后台杀死系列的第三篇,前面两篇已经对后台杀死注意事项,杀死恢复机制做了分析,本篇主要讲解的是Android后台杀死原理.相对于后台杀死恢复,LowMemoryKiller原理相对简 ...

  4. Android自定义控件开发系列(零)——基础原理篇

    在后边的文章中发现在说Android自定义时,有时候要重复解释很多东西,所以想想返回来增加一篇"基础原理篇",直接进入正题吧-- 首先的问题是:在Android项目开发中,什么时候 ...

  5. 新书《Android安全技术揭秘与防范》终于出版了

    愿每一个北漂的孩子都能找到自己为之奋斗的方向,不负那些在远方默默支持我们的父母和亲人. 历时将近1的新书<Android安全技术揭秘与防范>终于出版了,第一次写书万分激动,这里向大家推广一 ...

  6. 《Android安全技术揭秘与防范》—第8章8.5节Hook检测/修复

    本节书摘来自异步社区<Android安全技术揭秘与防范>一书中的第8章8.5节Hook检测/修复,作者周圣韬,更多章节内容可以访问云栖社区"异步社区"公众号查看. 8. ...

  7. Android 系统性能优化(81)---Android后台优化系列-background optimization-初识低耗电模式

    Android后台优化系列-background optimization-初识低耗电模式 〇. 序 当我们手机屏幕电量的时候,我们或在游戏,或在看视频,或在上网,屏幕是一个很耗电的组件,在电量消耗方 ...

  8. Android性能优化系列:启动优化

    文章目录 1 应用启动类型 1.1 冷启动 1.2 温启动 1.3 热启动 2 查看启动耗时 2.1 adb命令查看 2.2 Logcat Displayed查看启动耗时 2.3 手动记录启动耗时 2 ...

  9. 《Android安全技术揭秘与防范》目录—导读

    作者简介 Android安全技术揭秘与防范 周圣韬,曾任职于金山.360公司做Android开发.安全审计工作,现在为百度手机助手客户端高级开发工程师. 专业书评 出一本安卓系统安全方面的书,挺不简单 ...

最新文章

  1. 低端没出路,请接触高端!
  2. 神策数据林美天于大数据与人工智能分享沙龙分享
  3. Vuex——使用namespace的store使用mapState获取state为undefined
  4. ultraedit正则表达式
  5. 牛客NOIP2021提高组OI赛前模拟赛第一场T3——与巨(数学)
  6. [置顶]       IE与FireFox的JavaScript兼容问题
  7. Composer帮你轻松管理PHP包 autoload
  8. Codeigniter夸应用调用model
  9. Wordvec_句子相似度
  10. python读取grib2文件
  11. python 打印/输出元素,用 逗号/空格 分隔
  12. 30分钟迅速入门Linux基本命令
  13. 【C语言】TC2.0环境-带图形库
  14. root了有什么好,手机root好嘛
  15. 前端js进阶之ES6 Promise(承诺)用法小结笔记、详细解释(resolve,catch,catch)历史最通俗易懂的承诺
  16. Android SVG图片制作
  17. TortoiseSVN环境搭建
  18. 计算机相关专业硕士论文,计算机专业硕士论文优秀题目范例
  19. 技术领先、“忠”于业务,用友走出多维数据库的价值之路
  20. WordPress Simple Photo Gallery插件'index.php' SQL注入漏洞

热门文章

  1. Memento 模式
  2. Derby数据库简介
  3. 数字签名系列一:签名简介与RSA签名算法
  4. win2012文件服务器添加角色,win2012系统无法添加角色处理教程
  5. python之六间房视频爬取
  6. 怎样启动华为桌面服务器,[图]华为鲲鹏服务器/台式机主板登场:为ARM处理器打开桌面市场大门...
  7. Spark—RDD依赖血缘关系
  8. matlab如何生成空矩阵,怎样在MATLAB中创建空的N维数组,怎样才能正确扩充多维数组...
  9. 游戏-功能测试(一)
  10. 什么是差分信号?怎样差分走线?