刘海屏适配 参考
<meta-data android:name="android.max_aspect"
android:value="ratio_float"/>
- android.max_aspect:Android官方提供了适配方案,即提高App所支持的最大屏幕纵横比
- 其中ratio_float为浮点数,官方建议为2.1或更大,因为18.5:9=2.055555555……,如果日后出现纵横比更大的手机,此值将需要设为更大。
- 在AndroidManifest中针对Activity标签添加android:resizeableActivity = “true”,也可以实现全屏显示,但此设置只针对Activity生效,且增加了此属性该activity也会支持分屏显示
小米8和8SE上获取屏幕高度问题
```
public static int getHeight(Context context) {
WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
Display display = windowManager.getDefaultDisplay();
DisplayMetrics dm = new DisplayMetrics();
display.getMetrics(dm);
int height = dm.heightPixels;
return height;
}
public static int getRealHeight(Context context) {
WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
Display display = windowManager.getDefaultDisplay();
DisplayMetrics dm = new DisplayMetrics();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
display.getRealMetrics(dm);
} else {
display.getMetrics(dm);
}
int realHeight = dm.heightPixels;
return realHeight;
}
- 正常获取手机屏幕方法有以上两种方式,用的比较多的是方法一
- 在全面屏中,利用方法一获取屏幕高度是不包含下面的虚拟按键的高度的。不管是在设置里面切换虚拟按键隐藏还是显示。
- 用原生的方法去判断小米全面屏手机是否带有虚拟按键也是不行的,不管虚拟按键是隐藏或是显示,都是返回true(有虚拟按键)
- 对于如何监听小米手机虚拟按键的显示还是隐藏,可以通过下面的方法做判断。
// 判断小米全面屏手机的虚拟按键是否显示,也就是判断是否为全面屏
boolean isFull = Settings.Global.getInt(context.getContentResolver(), "force_fsg_nav_bar", 0) != 0
启动页logo被虚拟按键挡住的问题
- 原本在主题里设置的是android:windowbackground = “…”,换成android:background = “…”就可以了
启动页在小米手机中刘海屏没有适配的问题
- 如果开发者认为应用的所有页面统一处理就行,可以使用该接口。在 Application 下增加一个 meta-data,用以声明该应用是否使用耳朵区。示例如下:
<meta-data
android:name="notch.config"
android:value="portrait|landscape"/>
- value 的取值可以是以下4种:
- “none” 横竖屏都不绘制耳朵区
- “portrait” 竖屏绘制到耳朵区
- “landscape” 横屏绘制到耳朵区
- “portrait|landscape” 横竖屏都绘制到耳朵区
项目中分割线消失的问题
- 在项目中发现,进入一个页面后,返回看其他页面的时候,列表页的分割线就不见了,注意用的是同一个资源的颜色。
- 后来发现android中从同一个资源文件中加载出来的drawable会有共享状态,如果你加载出来多个drawable,当改变了其中一个的状态时,其他drawable的状态也会相应改变。
- 之前同事在一个页面里隐藏一个分割线的时候设置色值透明度为0,这样就导致了其他用到这个色值的都变成0。
- 解决办法:把这个drawable变为mutate drawable后,这个drawable就不会与其他drawable共享状态,注意mutate是不可逆的
Only fullscreen opaque activities can request orientation
- 只有不透明的全屏activity可以自主设置界面方向
- 只有Android 8.0才会又这个问题,8.1貌似修复了
- 中转Activity不需要锁定屏幕
- 在activity节点中将设置方向的去掉
- 开始使用中发现Glide.with(_mActivity).load(url)后面没有fitCenter和placeholder这样的方法。后来发现API多了个GlideApp,哪来的呢?
- 新建一个类继承AppGlideModule
- 类上添加注解@GlideModule,类里面不需要添加任何内容
- clean project -> rebuild project
- build文件下会生成了四个类
- 这样就有GlideApp类了,用GlideApp代替Glide
- 支持gift
- 支持圆角,原生的Glide就提供了方法
GlideApp.with(_mActivity).load(headInfo.getImage())
// 实现圆形图片
.apply(RequestOptions.bitmapTransform(new CircleCrop()))
.placeholder(R.mipmap.icon_default_header)
.error(R.mipmap.icon_default_header)
.into(sdv_image)
混淆为什么要保留类名和方法名?
- 让C/C++程序可以通过jni使用对应的java方法
- 四大组件在AndroidManifest中已经注册了,需要保留,不然解析的时候会失败
- R文件如果混淆的话,会导致引用错误
ProGuard 去除log日记
- 一定要打开优化开关,也就是build.gradle中默认使用proguard-android-optimize.txt文件,这个文件已经默认打开了优化开关
proguard-android-optimize.txt和proguard-android.txt到底有什么区别?
- 前者优化开启,后者优化关闭
- 都是在sdk下的
- 后者里面有个 -dontoptimize 表示关闭优化,去掉的话就是开启优化
- 优化会存在风险,不能保证在所有版本的Dalvik上都正常运行。
- mac 上下载
- 1.将 wrapper script 脚本文件保存为 “apktool.sh”
- 2.下载apktool-X最新版 重新命名为apktool.jar
- 3.将这两个文件夹已到 /usr/local/bin 目录下
- 4.增加这两个文件可执行权限
samMacBook-Pro:~ sam$ cd /usr/local/bin
samMacBook-Pro:bin sam$ chmod a+x apktool.sh
samMacBook-Pro:bin sam$ chmod a+x apktool.jar
- 切换到apk所在的文件夹,执行apktool.sh d file.apk
- Apk 重新打包是指,首先用反编译工具得到smali代码(比如apktool),然后再由smali代码重新打包形成apk,最后重新签名才能运行在手机上。
- 如果apk被重新打包的话,如果想运行在真机上,是要重新签名的,这个时候我们可以判断签名和我们这的签名是否一致,不一致可以退出或杀死进程。
- 通过packageManager 可以获取签名信息
- 主线程在创建完成后,Android会默认创建一个looper循环
- 这个循环不停的读取消息队列(message queue 也是在主线程创建完成后生成的类)中的内容。
- 当一次循环读取到一个消息时就去进行一段处理代码,处理完成后,就将这条消息移除出消息队列。再在下一次循环中读取另一条消息。
- 比如,在屏幕上触摸一个button事件,会把这个消息放到消息队列的尾部,等待循环处理。这个是系统帮我们插入的。
- 如果要自己向主线程中插入消息的话,怎么办呢?当然是用Handler。sendMessage
- 至于looper读取到消息进行处理也是交给Handler去处理,一般系统插入的消息处理是交给dispatchMessage,而我们自己发送的消息是交给handleMessage处理,当然,没有明确规定,两者可以通用。
- 哪一个Handler发送消息就那个Handler处理消息,messageQueue是根据message的target去判断哪一个Handler发送消息的
- Handler必要在有Looper的实例的情况下才能实例化
Json解析key为关键字问题 详解
- 编译工具是不允许你命名的变量名称为一些关键字的
- 可以通过注解的方式关联解析对象的key来解决这个问题
- fastjson使用者
@JSONField(name="package")
private PaiRedPackageEntity redpackage;
@SerializedName(“abstract”)
public String myabstract;
- Json数据出现动态key问题, fastjson和org.json可以解析,存放在map里