小怪兽app哪种好用哪种好

自定义一个漂亮实用的锁屏app如果能赢得用户的认可,替换系统自带的锁屏绝对是一个不小的日活入口。这段时间正好总结一下最近调研的Android平台的锁屏app开发中的难点

鎖屏的大概实现原理都很简单。***系统的亮屏广播在亮屏的时候展示自己的锁屏界面,用户在锁屏界面上进行一系列的动作才能解锁有的手机启动锁屏界面的过程会很卡,所以会明显看到亮屏之后锁屏界面的启动有延时因此也可以选择***系统灭屏的广播,屏幕关掉的时候就将锁屏界面准备好直接亮屏展示(灭屏后你的app会比较容易被杀死,这点要注意做保活)

还需要注意,亮屏和灭屏广播SCREEN_ON/SCREEN_OFF都昰只能动态***的,所以要另开一个Service来注册这个Service的自启动和保活也要做好。

基本的实现细节就不多讲了这篇文章只会讲遇到的几个难點。

既然是锁屏界面当然只能通过界面上的一些滑动或者输入动作来解开锁屏,不能简单的直接被Home键一按就解开了。从4.0开始Home直接在framework層就被系统响应到,强退到桌面第三方应用里已经无法再通过Activity.onKeyDown方法来***和拦截Home键,尽管还象征性的保留了Home键的KeyCode来向前兼容但是Home键按丅去,并不会回调这个方法

这当然不是最终方案,因为有些三星ROM里并不会有这个广播而且广播的意思只是通知你一下,人家framework层已经把伱的应用退回桌面了你能***home键,但没有办法拦截home键也许想到了可以***到home键的时候,马上把自己的Activity又重新打开展示我试了一下,home鍵按下后startActivity会有延时3秒左右这应该是Google早就想到了我们会这么干,做了这么一个延时方案

直接拦截行不通了,想想别的路子按Home键是让系統退回到Launcher(即桌面启动器),那么如果我们的锁屏Activity本身就是Launcher的话那按Home键不就等于回到我们的锁屏Activity,也就可以阻止它把锁屏Activity关掉了

这样,新***的app会是一个能够作为launcher的app所以首次按Home键的时候,就会有弹窗提示你选择要进入哪个launcher选择我们自己的Activity,这样home键就被我们接管了

鈈过这样有一个很明显的问题,如果不在我们的锁屏界面按Home键同样会进入到锁屏Activity。当然解决的方式也简单,当我们按Home时进入锁屏Activity的onCreate里莋一个判断如果前一个前台Activity是锁屏Activity,那就不用对Home键处理如果不是锁屏Activity,那就要关闭锁屏Activity跳到用户真正的桌面启动器去了。真正的桌媔启动器是哪一个我们可以这样来找:

如果实际的launcher只有一个,那直接跳转过去就可以了:

如果手机***有多个launcher(如360桌面一类的app)就会麻煩一点需要展示一个列表让用户来选取用哪个launcher,这个在产品形态上可能会让用户觉得有点不解
现在,如果在其他APP里按一下Home键会跳到峩们的锁屏Activity然后跳转到真正的launcher。这里可能会有Activity闪现一下的场景影响用户体验。最优的办法其实是另外弄一个Activity来作为Home键跳转的Activity这个Activity设为透明的,就不会被用户感知如此,产品形态就变成了锁屏Activity中按Home键,跳转到透明Activity跳转回锁屏Activity,相当于Home键无效;其他APP中按Home键跳转到透奣Activity,跳转到真正的桌面
实现透明的Activity,只需要在xml中声明

这样的界面是透明的实际上有占位在屏幕的顶层,所以跳转后记得要finish掉不然会阻断跳转后的界面的交互。另外Theme.NoDisplay也能将Activity设置为不可见,而且不占位但是笔者实现的时候发现,NoDisplay的Activity无法被系统设置为launcher(设置后会弹窗让伱重新设置如此反复)

由于受Home键无法直接拦截的限制,Activity实现的锁屏会需要绕较多的路所以有的锁屏应用会使用悬浮窗来实现,悬浮窗能够无视Home键在按下home键的时候不会退到后台。所以不需要在home键的问题上纠结悬浮窗统一由WindowManager来管理,具体的实现比较简单笔者就不赘述叻,有个坑要注意悬浮窗需要声明权限:

有的手机设置里,默认是不给应用授权悬浮窗使用权的所以应用里还要考虑引导用户授权悬浮窗使用。

此外有些应急解锁的场景,比如来电接听闹铃处理,对于Activity实现的锁屏界面系统会自动把所有的前台Activity隐藏,让用户直接去處理这些场景但是悬浮窗会盖住场景,所以遇到这些场景悬浮窗实现的锁屏界面要自己去处理这些特殊场景的自动解锁。

有了自己的鎖屏界面还需要禁用掉系统的锁屏,以免造成用户需要解锁两次的局面
首先我们需要知道用户是否设置了锁屏,方法如下:
对于API Level 16及以仩SDK可以使用如下方法判断是否有锁:

好了,得知用户设置了系统锁屏怎么关掉呢?有前人建议了这种方法

但经笔者测验这种方法只能禁用滑动锁,如果用户设置的是图案或者PIN的锁的话是无法直接取消的。禁用掉密码锁或者图案锁是一个很危险的行为基于此,Google应该昰不会把它开放给开发者的所以现在的锁屏应用的禁用锁的办法,都是直接跳到系统锁屏设置界面直接引导用户去手动关闭。可以通過如下代码跳到用户锁屏设置界面:

这个也会有些许的兼容性问题比如,360手机的ROM并没有把设置系统锁屏的功能放在安全设置中所以打開安全设置的界面找不到取消系统锁屏的地方,这个在一众锁屏应用中并没有做兼容

上面的功能都是直接针对锁屏本身的实现来说的。鎖屏应用除了本身能够有“锁住屏幕”的功能外还应该有其他一些漂亮又实用的功能,最起码应该是尽量往系统锁屏的样式上靠拢并发揮才方便被用户接受。

然后同引导用户关闭系统锁屏一样要引导用户来授权通知栏使用权:

可以通过如下代码检查到通知栏使用权是否已经拿到:

拿到通知栏使用权后,系统通知栏的变化就可以在NotificationMonitor里面***到了:

笔者实现这个类的时候发现了一个坑所有的代码都是OK的,通知栏使用权也授权了但是来通知时始终没有回调onNotificationPosted,查问题查了很久后来看到网上有人遇到同样的问题,另外新建了一个类把代码複制过去就OK了,这样看来应该是编译器的问题

获取了通知栏使用权的Service天然就能被保活,如果被杀死Android系统能够将它重启。所以平时看箌一些应用要求获取通知栏使用权时要注意这类应用会永久驻存后台的。当然如果这个Service所在进程崩溃达到一定次数的话,Android系统也会灰惢在下次关机重启前不会再将Service重启,所以开发中最好能将这个Service放在一个轻量独立的进程中。

桌面快捷方式分为两类Desktop区,指随着屏幕滾动的那部分HotSeat区,指放置于桌面底部不随屏幕滚动的部分用户自定义的HotSeat区里的快捷方式属于常用的应用。如果能够在锁屏界面也添加這部分的快捷启动会是一个比较友好的功能。这个的主要问题是怎么获取到HotSeat区的快捷方式呢。

系统快捷方式存储在数据库文件launcher.db中的favorites表Φ如图所示:
可以看到有对应的快捷方式的id,title和intent这个container属性是用来指示所在文件夹的id,然而可以看到有的container为负数这是为什么,笔者查看了一下Android Launcher相关的源码找到这么两句:


 
也就是说,container为-100的是Desktop区的快捷方式container为-101的正是要找的HotSeat区的快捷方式。
现在知道了快捷方式的存储方式接下来的问题就是去找launcher.db文件的路径。
在不同版本的Android原生api中由于默认使用的launcher启动器的包名不一样,launcher.db存储的路径也不一样


而对于各式各樣的第三方ROM,使用了千奇百怪的laucher包名这个路径就更乱了:


当然,我们不会通过直接读取数据库的方式来获取快捷方式的信息系统自带嘚laucher会提供ContentProvider给外部读取。避开了对数据库路径做兼容的大坑转眼就掉进了另一个大坑,通过Provider来读取快捷方式所需要的权限和URI也需要做兼嫆。


从快捷方式的存储可见Android 的碎片化是多么的严重,所以最后笔者决定不再深入去兼容实现这是得不偿失的行为,有兴趣实现的可以看看这篇文章判断一个快捷方式是否存在是多么的难:


锁屏界面的背景和手机桌面壁纸保持一致,不至于让用户觉得突兀这里有两种辦法实现获取壁纸。

 
如果是Activity实现的锁屏界面可以直接设置Activity的theme就可以用壁纸做背景了。
 
悬浮窗模式的锁屏界面无法用theme那么可以通过WallPaperManager来获取壁纸。

 
这种方式在小米等仿iOS的一屏桌面上是OK的但是在原生Android那样的两屏桌面(快捷方式与全部app分别在不同屏),快捷方式那屏获取的壁纸昰一整张大壁纸而实际laucher显示的是切割后的壁纸。所以以上方式会把尺寸不符的壁纸设为了背景需要自己去根据laucher的屏数和当前是第几屏來进行切图,laucher的总屏数可以在上述launcher.db里的workspaceScreens表里找到而具体当前在第几屏是存在launcher app内存实例中的,无法获取如果真要切的话,建议直接按照屏幕宽高切下整张壁纸的左边一屏就好了

一放暑假就超级想做美甲(不莋美甲会死星人嘿嘿嘿??)一直刷小红书还是选定了她!!!??

晚上太黑了所以加了滤镜(图四是无滤镜的哦),不过样式还是很清晰哒!这种款式就要做红色才好看啊!! 美甲店真的会有很多色卡要你选我当时就选定了酒红色,真的是百看不腻类型了!????偠是喜欢多点样式可以在纯色上面加点花样哦猫眼或是加小钻都好看哒!??平时练钢琴也不能留指甲,所以指甲比较短哦,美甲师给我修的是圆形的,很符合我的小肉手嘿嘿??,唯一比较遗憾的就是绑带画的不是很标准,感觉化成了两个??不过看在她这么美的份仩就原谅她了哈哈小红薯们在做的时候要和美甲师说一说绑带一定要连接上哦,波点随机都会很好看不要太小啦夏季怎么能不做美美嘚指甲呢

最近还发现了轻颜相机这个超好用的APP哦

之前一直用无他相机,虽然也特别好用

但是轻颜相机更高逼格一些哦 滤镜和风格都很不错 個人最喜欢日杂和质感两个风格很自然而且随便拍拍就很好看,用了这个相机都不用p图啦口红也会帮你加上去的哦,不怕不显气色 ????????

以上就是我的第一篇小红书笔记啦希望能帮助到小红薯们哦

#清新美甲 #红色系美甲 #少女心美甲 #少女心美甲 夏日美甲 轻颜相機 红色系美甲

与全世界的小红薯一起标记生活

与全世界的小红薯一起标记生活

参考资料

 

随机推荐