前言
好久都没有发文章了,最近工作比较忙,下班也忙着锻炼身体。不过不得不吐槽一下,最近的技术圈子是越来越浮躁了,各种知识星球、收费教程、软文广告满天飞,对此不作任何评价,存在即合理,只要不是太过分天天打广告、对大家的付出对得起你所收的费用,我觉得都可以理解。对于这些收费圈子,大家都需要戴着有色眼镜去看待,尤其是一些劣质的资料。
正文
稍微吐槽了一下,下面开始转入正题。话说最近呐,项目中又遇到了一个比较奇葩的BUG,测试的小姐姐告诉我,现象的描述是:
- 在系统设置中,关闭屏幕旋转开关
- 打开图库,图库不可以旋转(正常现象)
- 从相机的缩略图打开图库,图库可以旋转(测试小姐姐觉得不正常)
为了更加清楚地描述这个测试小姐姐……我呸,是这个BUG,先来回顾一些基础的知识点(已经知道的可以跳过),正所谓温故而知新嘛,每一个BUG我都可以从中学到技术知识(与测试小姐姐沟通的技巧)。
知识点1——聊聊系统开关
如下图所示,这就是我们平常经常使用的系统开关,虽然经常用,但是相关的操作用得比较少。系统设置的开关状态实际上是由一个系统的ContentProvider来管理的,因此通过ContentResolver可以对其进行各种操作。核心代码如下:
//获取值
int orientation = Settings.System.getInt(
context.getContentResolver(),
Settings.System.ACCELEROMETER_ROTATION,
//默认值
ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
//设置值
Settings.System.putInt(
context.getContentResolver(),
Settings.System.ACCELEROMETER_ROTATION,
//默认值
ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
//设置值变化的监听
Uri uri = Settings.System.getUriFor(Settings.System.ACCELEROMETER_ROTATION);
context.getContentResolver().registerContentObserver(
uri,
true,
mContentObserver);
知识点2——聊聊屏幕旋转
对于一般的互联网应用来说,如果不考虑适配平板电脑、一些比较特殊的界面的话,基本上就是一棍子打死竖屏,一般都会在Activity中配置,防止Activity旋转导致界面重新创建、数据丢失。
除了跟随系统之外,我们也可以通过代码主动去设置屏幕的方向,核心代码如下:
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_XXX);
另外,我们也可以自己实现一个OrientationEventListener,去监听传感器的变化,从而实现一些自动以的逻辑、有趣的功能。
public class MyOrientationEventListener extends OrientationEventListener {
public MyOrientationEventListener(Context context) {
super(context);
}
@Override
public void onOrientationChanged(int orientation) {
if (orientation == ORIENTATION_UNKNOWN) {
return;
}
//这里可以去改变屏幕方向
}
}
结论——可以做到
说了一大篇,其实想告诉大家的结论就是:即使关闭了系统设置中的屏幕旋转开关,我们还是可以通过自己去监听传感器的变化,APP主动去旋转屏幕,实现一套自己的屏幕监听机制。(想当年初学的时候一直搞不明白为什么要这么设计)
回顾一下测试小姐姐提的BUG:
- 在系统设置中,关闭屏幕旋转开关
- 打开图库,图库不可以旋转(正常现象)
- 从相机的缩略图打开图库,图库可以旋转(测试小姐姐觉得不正常)
从代码的角度上面,第3点是可以做得到的。从相机的缩略图点击跳转到图库,肯定会触发Activity的onResume方法,这里如果我们通过Intent参数判断一下是否从相机跳转过来:
@Override
protected void onResume() {
super.onResume();
if (isFromCamera) {
//开启屏幕旋转的监听
}
}
与测试小姐姐的讨论
纯脑补剧情:


细节决定成败
俗语有云:细节决定成败,很多用户都很关注细节上的东西,对于一个产品,拿APP举例来说,流畅度、省电、省流量、一个细节上的动画、小功能等,都会受到用户的喜爱。
写了那么久公众号,一直都没有给自家的产品——Flyme打过广告,今天抛开手机硬件不谈,单纯从Flyme出发,聊聊我们Flyme在细节上面做过的一些努力(我自己常用的)。
一、索引
第一个要说的就是List索引功能了,索引能够帮我们打打缩减查找的时间。例如下面的桌面索引,对于一些喜欢装N多个APP的用户来说,这个小功能绝对是最有用的!

还有文件管理中的索引:

应用管理中的索引:

其中,我们Android开发者会经常打开应用管理,找到自己的APP,然后做一些清除数据、卸载更新之类的操作。小楠总发现啊,大部分ROM都没有这个索引的小细节,导致我们每次找自己的APP都找得好辛苦o(╥﹏╥)o!
二、文件传输实时信息展示
第二个要介绍的就是文件传输上面的细节体验了:

经常刷机、升级固件的开发者们都知道,我们经常会通过电脑的文件管理器、或者ADB命令,拷贝固件到我们的Android手机当中。如果你使用的是Flyme的ROM的话,你可以看到上图所示的细节:文件管理器中会展示文件拷贝的实时文件大小,而其他的ROM的话,只有在文件传输完成的时候,文件才会一瞬间出现在文件列表当中。这一点也是Flyme在细节上面的体验优化,作为一名Android开发者,我尤其喜欢这个小细节!
三、夜间模式
夜间模式是Flyme7新增加的一个小功能:

Flyme7的夜间模式并不是只局限于系统界面、系统应用,而是适配了大量第三方应用的一个夜间模式,一个很好的沉浸式夜间体验,更好地保护了我们的眼睛。
四、抬腕亮屏
最后要说的就是抬腕亮屏功能:

抬腕亮屏,配合人脸识别,可以实现一个很不错的手机解锁体验!
小总结
今天除了学习了技术,也总算是感受到了老板的人格魅力、工匠精神了,但是这只是冰山一角,细节上的体验真的很重要。当然,我们平时做任何事情都要细心,尤其是你们在跟女生沟通的时候更为重要,你的一条鼻毛突出来都会影响到对方对你的看法(这个例子是刚入职的时候HR小姐姐给新员工培训的时候说的)!
昨天阿里云就因为运维的失误导致云服务器出现故障,因此我们更需要敬畏每一行代码!
网友评论