在使用一些launcher的时候发现有些apk有更改桌面背景的选项,通过查看源代码得知,所谓更换桌面背景,实际上是设置壁纸,然后通过获取当前壁纸来改变桌面背景。
这样做的好处是避免自己存储当前桌面背景的信息,同时可以通过接受壁纸更改的广播,实时的修改当前桌面的背景。
关于如何设置壁纸,网络上有很多文章对此有过讲解,在我分析的这个apk里,使用以下代码更改壁纸:
InputStream stream = getResources().openRawResource(R.drawable.background);
setWallpaper(stream);
当然,也可以调用系统的设置壁纸的函数来更改壁纸:
private void setWallpaper() {
final Intent pickWallpaper = new Intent(Intent.ACTION_SET_WALLPAPER);
startActivity(Intent.createChooser(pickWallpaper, "Wallpaper"));
}
更改壁纸完毕后,可以获得当然默认的壁纸来修改当前apk的背景了:
private void setBackground() {
Drawable wallpaper = peekWallpaper();
if (wallpaper == null) {
try {
clearWallpaper();
} catch (IOException e) {
Log.e("tag", "Failed to clear wallpaper " + e);
}
} else {
getWindow().setBackgroundDrawable(wallpaper);
}
}
如果想利用壁纸更改的广播来实时修改apk的背景也是可以的:
private void registerIntentReceivers() {
IntentFilter filter = new IntentFilter(Intent.ACTION_WALLPAPER_CHANGED);
registerReceiver(mWallpaperReceiver, filter);
}
在接收广播的函数里修改背景就行了。
这样,就可以利用修改壁纸来更改apk的背景同时也不用自己保存任何相关信息了。
还有另外一种方法,就是将当前的apk应用背景设置为透明,直接使用壁纸图片作为背景,这样是最为方便的。
需要在Manifest.xml文件里面修改:
android:theme="@android:style/Theme.Translucent">
然后修改窗口属性(函数参数为true):
void setWallpaperVisibility(boolean visible) {
int wpflags = visible ? WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER : 0;
int curflags = getWindow().getAttributes().flags & WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER;
if (wpflags != curflags) {
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
WallpaperManager.getInstance(this).suggestDesiredDimensions(metrics.widthPixels, metrics.heightPixels);
getWindow().setFlags(wpflags, WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER);
}
}
即可。
修改壁纸,还需要再apk中增加相应的权限:
<uses-permission android:name="android.permission.SET_WALLPAPER" />
<uses-permission android:name="android.permission.SET_WALLPAPER_HINTS" />
参考:
http://blog.csdn.net/xiaodongvtion/article/details/8161695
http://blog.sina.com.cn/s/blog_62c194760100g9dx.html