一. 通过堆栈快速定位系统版本
这个地方主要分享大家两个个技巧,通过问题堆栈简快速定位当前系统版本:
1. 快速区分当前系统版本是Android10以下,还是Android10及以上;
首先Android10及以上引入了一个新的服务Service:ActivityTaskManagerService
,将原本ActivityMangerService
原本负责的一些职能拆分给了前者,所以当你的问题堆栈中出现了ActivityTaskManagerService
相关的字眼,那肯定是Android10及以上了。
大家在Android9及以下的源码中是找不到这个类的。
2. 快速区分当前系统版本是Android12以下,还是Android12及以上;
这个就得借助Looper
了,给大家看下Android12上Looper
的源码:
Looper分发消息的核心方法loop()
,现在会转发给loopOnce()
进行处理,这个可是Android12及以上特有的,而Looper又是Android处理消息必要的一环,是咱们问题堆栈的源头祖宗,类似于下面的:
所以这个技巧相信还是非常有必要的:当你从问题堆栈中一看有loopOnce()
这个方法,那必定是Android12无疑了。
二. 实现按钮间距的一种奇特方式
最近看了一个新的项目代码,发现该项目实现按钮之间、按钮与顶部底部之间间距实现了,用了一种我之前没了解过的方式,于是这里分享给大家瞧瞧。
这里就以TextView和屏幕顶部间设置间距为例,初始的效果如下:
接下来我们来进行一步步改造:
1. 首先TextView是有一个自定义的xml背景:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"><itemandroid:height="70dp"android:gravity="center_vertical"><shape><solid android:color="#ff0000" /></shape></item>
</layer-list>
核心就是定义了android:height
和android:gravity
这两个属性,来确保我们自定义背景在组件中的高度及居中位置。
2. 其次将布局中TextView
的属性调整下:
- 首先
height
属性一定要调整为wrap_content
,保证最后TextView按钮的高度的测量最终取minHeight
设置的属性值和背景设置的高度这两者的最大值; - 其次还要设置
minHeight
最小高度属性,注意一定要比背景设置的高度值大,保证能和屏幕顶部产生边距效果; - 最后要设置字体的位置为垂直居中,保证字体位置和背景不发生错位;
经过上面处理,效果就出来了:
其实上下空白的部分都是属于TextView,设置点击事件也会被响应,这算是其中的缺点之一,当前也可能在业务场景中认为这是一种合理表现。
上面实现的逻辑和TextView的测量逻辑密不可分,感兴趣的同学可以看下这块代码,这里就不带大家进行一一分析了:
三. logcat快速查看当前跳转的Activity类信息
日志过滤start u0
,可以看到每次跳转的Activity信息
使用时记得将logcat右边的过滤条件置为No Filters,否则你就只能在左边切换到系统进程去看了:
这里我们演示下效果:
1. 跳转到Google浏览器
logcat界面会输出:
会打印一些跳转到包名类名等相关信息。
2. 跳转到系统设置界面
logcat输出:
四. 项目gradle配置最好指向同一本地路径
最近开发中经常存在需要一次性检索多个项目的场景,而这样项目的gradle版本都是相同的,没啥区别。但每打开一个项目就得重新走一遍gradle下载流程,下载速度又是蜗牛一样的慢。
所以强烈建议大家,本地提前准备好几个gradle版本,然后通过设置将项目的gradle指向本地已存在好的gradle:
如果项目好好的编译运行着,突然没网了,可能会提示一些找不到依赖库资源啥的,其实你本地都已经缓存好依赖库资源了,只需要设置下off-mode,不走网络直接通过本地资源编译运行即可: