Android WallpaperManager 壁纸分析

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

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 (
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值