Skip to content

title: Android知识 author: 书虫 tags:

  • 技术原理 categories:
  • 工作 top: false date: 2021-01-13 21:01:00

https://github.com/JsonChao/Awesome-Android-Notebook

Window指得是什么?

各厂商手机Debug时的问题

我用的是VIVO X21A,Android 8.1.0系统,遇到的奇怪问题如下:

开发者模式打开之后,无法连接adb命令,导致无法连接Android Studio。反复开关debug开关无效,切换debug充电,传输文件等无效。最后发现重启之后就可以了。

安装完测试包之后,所有功能无法正常联网,全部显示网络错误。而且部分功能一旦触发直接崩溃,就好像是安装包不完整一样。这在其他手机上是没有遇到过的。我原本以为是系统时间被修改了,检查了一下,发现使用的是网络时间。最后找出了问题原因。引用别人的文章内容如下:

Android Studio 3.0会在debug apk的manifest文件application标签里自动添加 android:testOnly="true"属性,导致IDE中run跑出的apk在大部分手机上只能用adb install -t <apk>来安装,在oppo手机上甚至安装不了。

解决办法:

在gradle.properties(项目根目录或者gradle全局配置目录 ~/.gradle/)文件中添加

android.injected.testOnly=false

测试有效。

值得研究的技术专题

1.  Activity 启动流程 和 AMS 那些事

2.  Context 与 Android四大组件

3.  Activity Manager Service 与 Window Manager Service

4.  自定义View系列(onMeasure、onLayout、onDraw)、事件传递

5.  Android ClassLoader机制(插件化准备)

6.  Android 资源打包流程(插件化)

7.  Java反射 注解

8.  Android 插件化与热修复技术

9.  Fragment框架解析

  1. 手势返回框架

  2. Android中的进程和线程

  3. Binder机制

  4. Flutter上手

  5. Android Push原理

  6. dex 与 Android 虚拟机

  7. gradle task系列

  8. OpenGL技术视频特效处理

知识点记录

  1. View中getTop,getY,getTranslationY之间的关系
  2. listview滚动状态保存和恢复

经常遇到的代码错误总结

ListView中类转换异常,错误日志。

java.lang.ClassCastException: android.view.ViewGroup$LayoutParams cannot be cast to 
android.widget.AbsListView$LayoutParams
at android.widget.ListView.setupChild(ListView.java:1901)

导致错误的代码是按下面第一行写法写的,第三行写法是正确的。

view.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));

view.setLayoutParams(new AbsListView.LayoutParams(AbsListView.LayoutParams.MATCH_PARENT,AbsListView.LayoutParams.MATCH_PARENT));

这是因为在4.x系统上setupChild原代码是这样写的

AbsListView.LayoutParams p = (AbsListView.LayoutParams) child.getLayoutParams();
if (p == null) {
    p = (AbsListView.LayoutParams) generateDefaultLayoutParams();
}

所以 导致类转换异常。

ImageView

缺省的scaleType是FIT_CENTER

Android文件路径

什么是APP专属文件?

所谓专属文件就是它是属于某个具体的应用的,他的文件路径都带有相应的包名,当APP卸载时,它们会随应用一起删除,当我们在设置里面手动清除某个应用数据时(不是清除缓存),它们也会一起被清掉。Android使用这种专属文件的目的就是为了方便文件管理,避免文件随意保存,显得很乱,另一个目的就是为了当应用被卸载时不会留下很多垃圾文件。

清除数据和清除缓存到底清除了什么数据

清除缓存:我们知道应用程序在运行过程中需要经过很多过程,比如读入程序,计算,输入输出等等,这些过程中肯定会产生很多的数据,它们在内存中,以供程序运行时调用。所以清除缓存清除的是APP运行过程中所产生的临时数据

清除数据:清除数据才是真正的删除了我们保存在文件中的数据(永久性数据,如果不人为删除的话会一直保存在文件中)例如当我们在设置里面清除了某个应用的数据,那么/data/user/0/packname/和/storage/emulated/0/Android/data/packname/下的文件里面的数据会全部删除,包括cache,files,lib,shared_prefs等等。

内部保存,外部保存,机身保存

机身保存;机身保存是指手机自身携带的保存空间,出厂时就已经有了,4.4以前机身保存就是内部保存,4.4及以后机身保存包含了内部保存和外部保存

Android手机路径

在Google Pixel 3A, Android Q手机上测试结果如下:

Context().getExternalCacheDir()

Context().getExternalCacheDirs()

对应的路径是/storage/emulated/0/Android/data/com.xxx.xxx/cache

Context().getFilesDir()

对应的路径是/data/user/0/com.xxx.xxx/files

Context().getCacheDir()

对应的路径是 /data/user/0/com.xxx.xxx/cache

Environment.getExternalStorageDirectory()

Environment.getExternalStorageDirectory()

对应的路径是 /storage/emulated/0

小结:

Android中.9图片的含义

绘制之前先来说一下.9图片的四条黑边的意义,每条黑边的意义都不一样。

  • 顶部:在水平拉伸的时候,保持其他位置不动,只在这个点的区域做无限的延伸(拷贝)
  • 左边:在竖直拉伸的时候,保持其他位置不动,只在这个点的区域做无限的延伸(拷贝)
  • 底部:在水平拉伸的时候,指定图片里的内容显示的区域
  • 右边:在竖直拉伸的时候,指定图片里的内容显示的区域

参考 https://www.jianshu.com/p/3fd048644e3f