Android工作学习收集整理(七月)

刘海屏适配 参考

  <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 4.0使用

  • 开始使用中发现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上Apktool下载和使用 Apktool源码

  • 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 消息机制

  • 主线程在创建完成后,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;
  • Gson 使用者
    @SerializedName(“abstract”) 
    public String myabstract;
  • Json数据出现动态key问题, fastjson和org.json可以解析,存放在map里
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ltym2014

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值