android 锁屏独立壁纸

news/2024/11/3 1:27:31/

之前的一个项目开发的支持锁屏壁纸和桌面壁纸。

开始时,有考虑从lockscreen做文章。在锁屏时,切换锁屏壁纸,进入home,再切换home壁纸。效果很差,卡顿,效率极低。

后来只能从WallpaperManager,WindowManager从考虑。最终实现了锁屏壁纸,效果很好。

WindowManagerService管理着各种窗口,Launcher, Lockscreen, InputMethodWindow, 以及其他的应用APP窗口。对于WindowManagerService来说他们都是一个个Window。ActivityManagerService调整这些Window的Z轴位置,以及可见性。来达到我们所看到的效果。因为android默认支持Launcher壁纸。所以在WindowManagerService的windows里只能看到这一个wallpaper。所以要再支持lockscreen wallpaper。只要再启动一个wallpaper window。当lockscreen时,将lockscreen wallpaper window, 调整到home wallpaper的窗口上面。就OK了。


首先看针对WindowManagerService的修改:

我们在WindowManagerService.java里添加支持lockscreen wallpaper 窗口方法addWallpaperWindowToken(),以及lockscreen wallpaper窗口变量mLockScreenWallpaperWindowToken

这样WallpaperManagerService就可以调用WindowManagerService.addWallpaperWindowToken()来把Lockscreen wallpaper window 添加到系统的窗口列表中。



设置了Lockscreen Wallpaper 后,在adjustWallpaperWindowsLocked() 方法里,就可以对Lockscreen Wallpaper 和Home Wallpaper这两个壁纸窗口的位置进行调整。

如果当前的窗口为Lockscreen,就将Lockscreen Wallpaper调整到Home Wallpaper上面。反之,则调整到下面。

怎么区分当前要显示的是Lockscreen还是Home?

通过获取当前需要显示wallpaper的窗口名称,Lockscreen 为 Keyguard 而home则可能为Launcher2等。

这样通过名称来区分,下述代码中1875行,String title = mWallpaperTarget.getWindowTitle();

是在WindowState中增加的一个方法,用于返回该窗口title。


在removeWindowToken()方法里,还有将wallpaper window token 从mWallpaperTokens里删除,否则会有重复的Lockscreen wallpaper 窗口。

代码如下:

if (wtoken.windowType == TYPE_WALLPAPER) {

mWallpaperTokens.remove(wtoken);

}

对WindowManagerService的改动,到这里就结束了。这部分改动也是最关键的部分。


接下来看下上面提到的WindowState的改动,增加一个方法getWindowTitle()返回窗口title:

代码如下:





接着看对WallpaperManagerService的改动,改动首先从systemReady()开始。因为系统启动后,会调用该方法。

可以仿照启动Home Wallpaper的code, 再开启一个Lockscreen Wallpaper。

(锁屏壁纸功能是在android 4.3 上开发的,framework部分的改动代码,在patch 文件lockscreen_independent_wallpaper.patch里。可从下面连接下载

http://download.csdn.net/detail/lavashengpeng/7469425)


开启Lockscreen Wallpaper组件后,就可以调用WindowManagerService.java里添加支持lockscreen wallpaper 窗口方法addWallpaperWindowToken()将锁屏壁纸窗口添加到window列表中。

开启Lockscreen Wallpaper组件时,要设置默认的组件。同样copy一份Home wallpaper的代码即可。

Home wallpaper default component: /SystemUI/src/com/android/systemui/ImageWallpaper.java

我们copy 一份 /SystemUI/src/com/android/systemui/ImageWallpaperLockScreen.java,对里面的代码稍加改动,改动点就是对壁纸图片的bitmap使用,加上 synchronize锁,不然会导致出错。


接下来就是添加接口供应用层调用,在WallpaperManager添加setLockscreenWallpaper(),setLockscreenWallpaperComponent(),getLockScreenWallpaper()等,以及需要改动IWindowManager.aidl添加addWallpaperWindowToken()接口。

涉及到的文件如下:

core/java/android/app/IWallpaperManager.aidl

core/java/android/app/WallpaperManager.java

core/java/android/view/IWindowManager.aidl

tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java


这样framework部分的改动就完成了。应用这边就可以调用接口,设置锁屏壁纸了。





http://www.ppmy.cn/news/220810.html

相关文章

如何获取Windows 10的锁屏壁纸

本功能仅限于Windows 10锁屏界面设置为聚焦模式的用户,设置聚焦模式后才会每天自动下载不同的壁纸。 如果没有开启锁屏界面聚焦模式那么只有系统默认壁纸。 打开路径 C:\Users\XXX\AppData\Local\Packages\Microsoft.Windows.ContentDeliveryManager_cw5n1h2txyew…

win10锁屏壁纸的提取方法

win10锁屏壁纸每隔几天就会更新,并且存储在特定的文件夹下面,提取方法也很简单: 先找到当前用户的 C:\Users\Administrator\AppData\Local\Packages文件夹 搜索Microsoft.Windows.ContentDeliveryManager 字符,会有以这个字符开…

如何获得Win10联想锁屏的壁纸(联想锁屏的壁纸灰常好看,那么我们如何获得呢?)

我是小康小白,一个平平无奇的Java小白。热爱有趣的文字,生活和远方。每天开机最眼馋的就是联想锁屏的壁纸了,那么我们如何获得呢? 1.打开我的电脑—C盘 2.打开Windows文件夹 3.找到其中的Web文件夹 4.打开Screen文件夹 5.里面就可…

kafka 集群是如何选择 leader,你知道吗?

前言 kafka集群是由多个broker节点组成,这里面包含了许多的知识点,以下的这些问题你都知道吗? 你知道topic的分区leader是怎么选举的吗? 你知道zookeeper中存储了kafka的什么信息吗?起到什么做呢? 你知道kafka消息…

win7锁屏壁纸更换,解除壁纸256Kb限制教程

参考文献: 百度经验连接:点击打开链接 贴吧某大神贴连接:点击打开链接 今天闲来无事,看着桌面,锁屏壁纸越来越不入眼,正好最近迷恋滑板,就想着把自己的桌面壁纸跟锁屏壁纸弄个滑板&#xff0c…

如何找到win10的锁屏推送壁纸

如何找到win10的锁屏推送壁纸 大家好,我们经常使用win10的时候有没有发现,win10锁屏的壁纸每天都会变而且特别精美,有的壁纸真的想下载下来自己设置为壁纸,可是怎么能保存每个壁纸呢,错过了第二天就变成另外的了&#…

【2022年】Win11修改锁屏界面、登录界面背景图片方法(亲测有效)

最近想给自己的电脑换个壁纸,桌面壁纸自定义已经玩的很熟了,就想设置一个登录界面的壁纸。毕竟每次锁屏(winL),或者是开机输密码的时候都是那个大蓝色背景(见图1),看久了也累了。故作…

一键获取Windows锁屏壁纸

一键获取Windows锁屏壁纸 win10锁屏壁纸每日一图,图片质量相当赞,但奈何系统并没有提供保存方法,每次发现自己喜欢的壁纸都要手动去壁纸的保存目录一个个的找啊翻啊,真心麻烦,而且与壁纸一起存放的还要其他文件&#…