Android中的壁纸分为静态壁纸和动态壁纸, 这两类壁纸本质都是一样的, 都是通过继承WallpaperService来实现的,只不过是绘制方面的差异。WallpaperManagerService用于管理壁纸的运行与切换,并通过WallpaperManager类向外界提供操作壁纸的接口,主要体现了对壁纸的管理方式。WallpaperService则对应壁纸的具体实现,实现壁纸服务相关的核心是WallpaperService中的Engine类
1 简单壁纸案列
1.1 新建壁纸服务
public class MyWallPaperService extends WallpaperService {
private static final String TAG = "MyWallPaperService";
@Override
public Engine onCreateEngine() {
return new MyEngine();
}
class MyEngine extends Engine {
@Override
public void onSurfaceCreated(SurfaceHolder holder) {
super.onSurfaceCreated(holder);
Canvas canvas = holder.lockCanvas();
canvas.drawColor(Color.GREEN);
holder.unlockCanvasAndPost(canvas);
}
}
}
1.2 配置文件中配置相关
<!-- AndroidManifest.xml中service配置 -->
<service android:name=".MyWallPaperService"
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/wallpaper_resource"/>
</service>
<!-- wallpaper_resource.xml配置 -->
<?xml version="1.0" encoding="utf-8"?>
<wallpaper xmlns:android="http://schemas.android.com/apk/res/android"
/>
1.3 通过壁纸选择器设置壁纸,最终壁纸显示为绿色背景
void setWallpaper() {
Intent intent = new Intent(WallpaperManager.ACTION_CHANGE_LIVE_WALLPAPER);
ComponentName componentName = new ComponentName(this, MyWallPaperService.class);
intent.putExtra(WallpaperManager.EXTRA_LIVE_WALLPAPER_COMPONENT, componentName);
startActivity(intent);
}
2 WallpaperManager相关介绍
// 主屏幕壁纸flag
public static final int FLAG_SYSTEM = 1 << 0;
// 锁屏壁纸flag
public static final int FLAG_LOCK = 1 << 1;
// 设置动态壁纸
public boolean setWallpaperComponent(ComponentName name)
// 清除锁屏壁纸
public void clear(WallpaperManager.FLAG_LOCK)
// 清除所有壁纸
public void clearWallpaper()
// 获取静态壁纸图片
public Bitmap getBitmap()
// 设置静态壁纸
public void setBitmap(Bitmap bitmap)
2.1 WallpaperService和WallpaperManagerService之间的关系

2.2 WallpaperManager和WallpaperManagerService之间的关系

2.3 壁纸涉及到的类介绍
// 壁纸服务信息封装
WallpaperInfo
// 提供接口对壁纸服务的访问
WallpaperManager
// IWallpaperEngine接口服务端对象
// class IWallpaperEngineWrapper extends IWallpaperEngine.Stub
IWallpaperEngineWrapper
// IWallpaperService接口服务端对象
// IWallpaperServiceWrapper extends IWallpaperService.Stub
IWallpaperServiceWrapper
// 用户壁纸相关信息存储
WallpaperData
// 监听WallPaperService之间的连接状态和实现IWallpaperConnection接口服务端实现
// class WallpaperConnection extends IWallpaperConnection.Stub
// implements ServiceConnection
WallpaperConnection
// 壁纸服务
// public class WallpaperManagerService extends IWallpaperManager.Stub
WallpaperManagerService
// 壁纸核心和壁纸绘制相关
Engine
3 壁纸相关代码分析
WallpaperManager的setWallpaperComponent函数为设置动态壁纸函数,接下来以动态壁纸为入口分析相关代码。Globals实现了IWallpaperManagerCallback接口,sGlobals.mService为WallpaperManagerService的代理对象,sGlobals.mService最终通过binder调用WallpaperManagerService的setWallpaperComponent函数,name为对应壁纸服务的包名。
private static class Globals extends IWallpaperManagerCallback.Stub {
private final IWallpaperManager mService;
}
public boolean setWallpaperComponent(ComponentName name, int userId) {
if (sGlobals.mService == null) {
Log.w(TAG, "WallpaperService not running");
throw new RuntimeException(new DeadSystemException());
}
try {
// step 1, 调用WallpaperManagerService的setWallpaperComponentChecked函数
sGlobals.mService.setWallpaperComponentChecked(name, mContext.getOpPackageName(),
userId);
return true;
} catch (

本文深入解析Android壁纸服务的实现原理,包括静态壁纸和动态壁纸的实现机制,以及WallpaperService和WallpaperManager的重要作用。
1221

被折叠的 条评论
为什么被折叠?



