概览
安卓的动态壁纸可以归属到SystemUI中,是SystemUI管理的一部分,安卓支持静态壁纸,同时也支持动态壁纸(added in API level 7 )
用户可以从设备的内部或者是外部存储中选择一个图片资源来作为静态壁纸,此外也可以设置壁纸跟随时间的变化进行一些变化(例如切换不同的图片资源),这也是安卓的特色功能之一。
需要说明的是当某个应用通过系统的接口设置为壁纸应用后,会启动一个壁纸服务,该服务的优先级很高,从某种程度上来说是不会被系统主动杀死的(但是可以被手动停止)。
使用方法
安卓的动态壁纸得益于谷歌官方的包装,使用起来并不复杂具体操作如下
- 创建自定义WallpaperService继承WallpaperService
class SampleWallpaperService : WallpaperService() {
override fun onCreateEngine(): Engine {
return SampleEngine()
}
inner class SampleEngine : Engine() {
}
}
- 在Manifest中注册该Service并添加相关属性
<service android:name="com.qihoo360.mobilesafe.sample.SampleWallpaperService"
android:enabled="true"
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/sample_resource" />
</service>
- 创建必要的xml文件
需要定义好在manifest里声明好的数据文件sample_resource
<?xml version="1.0" encoding="utf-8"?>
<wallpaper xmlns:android="http://schemas.android.com/apk/res/android"
android:contextDescription="@string/uri_des"
android:contextUri="@string/app_uri"
android:description="@string/wallpaper_description"
android:author="@string/wallpaper_author"
android:settingsActivity="com.qihoo360.mobilesafe.mywallapplication.SetupActivity"
android:showMetadataInPreview="true"
android:thumbnail="@mipmap/ic_launcher" />
4.调用系统设置接口
fun setDynamicWallPaper(context: Context) {
val intent = Intent(WallpaperManager.ACTION_CHANGE_LIVE_WALLPAPER)
intent.putExtra(WallpaperManager.EXTRA_LIVE_WALLPAPER_COMPONENT,ComponentName(context, SampleWallpaperService::class.java))
context.startActivity(intent)
}
关于壁纸展示部分的代码见源码。
源码分析
从用户使用的角度来说,可以把壁纸资源分成两类:
- 静态壁纸
例如jpg、png等类型的图片,用户可以直接把他们设置为壁纸 - APK应用程序
另外一类的壁纸依赖于一个独立的APP,用户需要安装后才能使用(动态壁纸通常就是通过这种手段实现的)。不过这也不意味着静态的图片就不依赖APP的支持,只不过前者借助于系统内置的应用就可以直接设置,而后者的丰富性与多样性则依赖额外的APP来实现。
不过无论是内部的应用还是自行开发的应用都需要遵循Android系统的壁纸机制才能正常工作,系统的壁纸管理系统主要由以下几个部分组成。 - WallpaperManagerService(WPMS)
它是壁纸机制的“大总管”,静态、动态的壁纸都是通过它进行统一的调度 - WallpaperService(WPS)
WPS继承了标准的Service组件,所以它一定也会实现onCreate、onDestroy、onBind等一些列方法。此外它还包含了一个重要的嵌套类Engine,后面做详细展开。WPS是静态、动态壁纸的基类,代表了作为“壁纸”所应具有的一切属性。 - ImageWallpaper(IWP)
从名称可以看出,它是静态壁纸的实现类,而且继承了上面的WPS。