android 高清壁纸设置慢
由于项目的需要最近在解决一个 bug 在1080p 的手机上面设置壁纸会很慢慢,慢的原因是和壁纸 的大小 有关,壁纸越大,时间直越长,一般1080 p 的壁纸大概有10M左右,
所以通过文件流 来保存会比较慢一般也在6~7S,用户体验特别差。所以需要优化。
下面说一下设置的流程,用户进程直接获取WallpaperManager,然后调用public void setBitmap(Bitmap bitmap) throws IOException 设置壁纸,一般设置有三种方式, public void setResource(int resid) throws IOException和
public void setStream(InputStream data) throws IOException ,不管用什么方法都比较慢,开机启动的时候会启动WallpaperManagerService来管理壁纸,同时会生成一个文件监视器, FileObserver mWallpaperObserver监听壁纸文件(4.2的版本:/data/system/users/0/files/wallpaper),如果 文件被重写或者被修改都会触发刷新wallpaper ,具体方法: bindWallpaperComponentLocked(mImageWallpaperComponent,true, false);//刷新壁纸。
saveSettingsLocked();//保存壁纸。
在bindWallpaperComponentLocked中会启动SystemUi下面的ImagerWallpaper,然后通过WallpaperManagerService来decode一张Bitmap,再刷新绘画界面,感觉流程还是比较乱的,对于高清壁纸来说慢慢的原因,decode 生成一张 Bitmap 的时候太长,所以我们可以直接保存设置的bitmap 在WallpaperManagerService里面,先刷新界面再保存,好了说一下具体修改吧。
情况一:用户通过setBitmap的方式来设置壁纸的优化。
在interface IWallpaperManager接口添加setWallpapperBitmap和getWallpaperBitmap 还有一个刷新界面方法 refreshWallpaper,然后 在WallpaperManagerService实现方法,声明成员变Bitmap bitmap ,public void setWallpaperBitmap (Bitmap bitmap){
this.bitmap = bitmap;}
public void getWallpaperBitmap(){
return bitmap};
然后在修改WallpaperManager 的setBitmap方法,sGlobals.mService.setWallpaperBitmap(bitmap),再调用 sGlobals.mService.refreshWallpaper刷新界面。这样用户看起来很快,但设置壁纸的对话框还是很久在才消失,因为保存图片是在客户端进程中运行的,所以我们可以开一个线程来保存图片,new Thread(){
try {
ParcelFileDescriptor fd = sGlobals.mService.setWallpaper(null);
if (fd == null) {
return;
}
FileOutputStream fos = null;
try {
fos = new ParcelFileDescriptor.AutoCloseOutputStream(fd);
bitmap.compress(Bitmap.CompressFormat.PNG, 90, fos);
} finally {
if (fos != null) {
fos.close();
}
}
} catch (RemoteException e) {
// Ignore
}
}。
最新文章
- NGUI实现技能CD效果
- MyEclipse 不能编译Java类到Classes文件夹
- SrsDataConnector The SQL Server Reporting Services account is a local user and is not supported.
- 被解放的GPU CSS3动画加速
- Android 蓝牙 BLE 开发笔记
- SQL优化之索引
- udp服务器监听(多线程)
- asp.net core 四 IOC&;DI Autofac
- oracle锁表与解表
- source insight 中文乱码解决方法
- Codeforces 219E Parking Lot 线段树
- python之小数据池
- sqler sql 转rest api 的docker 镜像构建(续)使用源码编译
- redis异常和注意点
- Java后台面试 常见问题
- PCA--主成份分析
- 使用python管理Cisco设备-乾颐堂
- C语言实现冒泡排序算法
- python基础===Excel处理库openpyxl
- Android Studio 项目中集成百度地图SDK报Native method not found: com.baidu.platform.comjni.map.commonmemcache.JNICommonMemCache.Create:()I错误