最近项目中,需要给手机设置桌面壁纸与锁屏。
大家都知道使用 WallpaperManager.setStream()方法就好
@RequiresPermission(android.Manifest.permission.SET_WALLPAPER)
public int setStream(InputStream bitmapData, Rect visibleCropHint,boolean allowBackup, @SetWallpaperFlags int which)
其中,该方法的最后一个参数就是用来标记该图像是应用于桌面壁纸还是锁屏的。
@Retention(RetentionPolicy.SOURCE) public @interface SetWallpaperFlags {}/*** Flag: set or retrieve the general system wallpaper.*/ public static final int FLAG_SYSTEM = 1 << 0;/*** Flag: set or retrieve the lock-screen-specific wallpaper.*/ public static final int FLAG_LOCK = 1 << 1;
如上, WallpaperManager 此类中已经帮我们定义了两个静态常量,分别是:1——代表设置于桌面壁纸,2——代表设置于锁屏。
天真的我就以为如果要同时设置桌面壁纸与锁屏时,就连续呼叫setStream() 两次,分别带上参数1和2,结果就悲剧了,在连续呼叫setStream()时,第二次会明显比较耗时,经测试:
//第一次
11-16 14:43:18.271: W/test(22332): WallpaperManager - setStream(): completion.waitForCompletion() Begin
11-16 14:43:18.315: W/test(22332): WallpaperManager - setStream(): completion.waitForCompletion() End
......
//第二次
11-16 14:43:18.405: W/test(22332): WallpaperManager - setStream(): completion.waitForCompletion() Begin
11-16 14:43:21.468: W/test(22332): WallpaperManager - setStream(): completion.waitForCompletion() End
可以发现,执行 completion.waitForCompletion()方法时,第二次耗时明显。
一番研究后才发现,原来同时设定桌面壁纸与锁屏时,直接将标记参数设置为3就好,如下:
InputStream is = new FileInputStream(f);
if (Build.VERSION.SDK_INT >= 24) {bmp = BitmapFactory.decodeFile(f.getAbsolutePath());manager.setStream(is, new Rect(0, 0, bmp.getWidth(), bmp.getHeight()), false, WallpaperManager.FLAG_SYSTEM|WallpaperManager.FLAG_LOCK);
} else {manager.setStream(is);
}
ok,同时设置桌面壁纸与锁屏的速度明显变快了。