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://www.linuxidc.com/Linux/2011-07/38953.htm) 快速的下载各个子目录各个Android版本的Android内置动态墙纸代码。其中,Basic、MusicVisualization两个目录里都包 括了多个相同代码框架的多个动态墙纸,MagicSmoke目录只包含魔幻烟雾一个动态墙纸,LivePicker目录里包含的是动态墙纸的选择列表的代 码,也就是你在桌面选择添加动态墙纸时出现的系统里所有动态墙纸的那个列表的实现代码。

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

<span style="font-size:16px;"><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>
</span>

我想细心的朋友已经猜出来了,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的背景设置为非透明的,比如以不透明的图片或者颜色作为背景,那么,你将看不到任何 动态墙纸效果,当然,这样的话,静态墙纸你也不会看到了。

Android原理揭秘系列之一动态墙纸的更多相关文章

  1. Android(java)学习笔记95:Android原理揭秘系列之View、ViewGroup

    作过Android 应用开发的朋友都知道,Android的UI界面都是由View和ViewGroup及其派生类组合而成的.其中,View是所有UI组件的基类,而ViewGroup是容纳这些组件的容器, ...

  2. Android(java)学习笔记34:Android原理揭秘系列之View、ViewGroup

    1. 作过Android 应用开发的朋友都知道,Android的UI界面都是由View和ViewGroup及其派生类组合而成的.其中,View是所有UI组件的基类,而ViewGroup是容纳这些组件的 ...

  3. [Android 性能优化系列]内存之基础篇--Android怎样管理内存

    大家假设喜欢我的博客,请关注一下我的微博,请点击这里(http://weibo.com/kifile),谢谢 转载请标明出处(http://blog.csdn.net/kifile),再次感谢 原文地 ...

  4. Jquery揭秘系列:Validation实现

    之前讲了一部分揭秘系列的东西,由于年初的时候在改项目,也没有写下去.现在开始闲下来了,会继续写没写完的东西,各种原生js实现Jquery的功能. 转入正题,说一下今天要讲的东西. 相信很多tx在项目里 ...

  5. 携程Android App插件化和动态加载实践

    携程Android App的插件化和动态加载框架已上线半年,经历了初期的探索和持续的打磨优化,新框架和工程配置经受住了生产实践的考验.本文将详细介绍Android平台插件式开发和动态加载技术的原理和实 ...

  6. Android控件系列之CheckBox

    学习目的: 1.掌握在Android中如何建立CheckBox 2.掌握CheckBox的常用属性 3.掌握CheckBox选中状态变换的事件(监听器) CheckBox简介: CheckBox和Bu ...

  7. Android libyuv应用系列(二)libyuv的使用

    上篇文章Android libyuv使用系列(一)Android常用的几种格式:NV21/NV12/YV12/YUV420P的区别中我们了解了YUV相关的知识,而本篇文章我会介绍libyuv是什么,以 ...

  8. 【转】Android总结篇系列:Activity启动模式(lauchMode)

    [转]Android总结篇系列:Activity启动模式(lauchMode) 本来想针对Activity中的启动模式写篇文章的,后来网上发现有人已经总结的相当好了,在此直接引用过来,并加上自己的一些 ...

  9. (android高仿系列)今日头条 --新闻阅读器 (二)

    高仿今日头条 --- 第一篇:(android高仿系列)今日头条 --新闻阅读器 (一)    上次,已经完毕了头部新闻分类栏目的拖动效果. 这篇文章是继续去完好APP 今日头条  这个新闻阅读器的其 ...

随机推荐

  1. VIM打开文件与保存文件

    打开文件 VIM /etc/inittab 默认的安装没有设置ctrl_W为退出.也可以设置::map <C-W> :close<CR> 或:map <C-W> : ...

  2. java学习——正则表达式

    本文内容来源于  历经5年锤练--史上最适合初学者入门的Java基础视频 例:要求QQ号长度为5~15位,不能以0开头 String qq="123456"; String reg ...

  3. svn用法

    SVN安装与启动服务 1.下载相应匹配版本的TortoiseSVN(客户端)和Subversion(客户端),安装完毕之后. 2.配置相关文件. 选择TortoiseSVN-->create r ...

  4. Windows 7 Apache下计算机无法访问局域网网站的问题

    在Windows 7系统下,由于安全限制问题,本机搭建的网站,局域网内其它计算机是无法访问的. 要解决这个问题,只需要在防火墙加入自建规则便可以了,具体步骤如下: 控制面板=>Windows防火 ...

  5. C#中HashTable和快速排序的用法

    题目主要是写一个程序,分析一个文本文件(英文文章)中各个词出现的频率,并且把频率最高的10个词打印出来.   自从周四拿到题目以后,发现又要用到万恶的数据结构了,不得不说这是我的短板,所有上周20号到 ...

  6. C语言初学 简单计算器计算加减乘除程序

    #include<stdio.h> main() { float a,b; char c; printf("输入表达式如a+(* -  /)b:\n"); scanf( ...

  7. ASP.NET MVC5中的数据注解

    ASP.NET MVC5中Model层开发,使用的数据注解有三个作用: 数据映射(把Model层的类用EntityFramework映射成对应的表) 数据验证(在服务器端和客户端验证数据的有效性) 数 ...

  8. sitecore(key\value\language)的灵活应用

    1.当我们在做网站的时候是否会因为一个页面的文字变动来回改变.这样的麻烦sitecore都帮我们解决了. 2.sitecore分类key和value和语言几个维度.不同的key会因为不同的语言显示不同 ...

  9. android_demo 之生成颜色

    老师说循环出颜色数字  然后显示出来 他说的什么一脸懵逼(=@__@=)   代码还在手上也还是懵逼 (づ。◕‿‿◕。)づ 不管了   留个脚印在这 以后想起来   至少也知道 直接上代码吧    说 ...

  10. MySQL原生HA方案 – Fabric体验之旅

    http://www.csdn.net/article/2014-08-20/2821300