18.其他
1. Android 使用 HTTPS
2. Jar和Aar的区别
Jar包里面只有代码,aar里面不光有代码还包括资源文件,比如 drawable 文件,xml资源文件。对于一些不常变动的 Android Library,我们可以直接引用 aar,加快编译速度。
3. Merge、ViewStub 的作用。
Merge: 减少视图层级,可以删除多余的层级。
ViewStub: 按需加载,减少内存使用量、加快渲染速度、不支持 merge 标签。
4. Asset目录与res目录的区别?
assets:不会在 R 文件中生成相应标记,存放到这里的资源在打包时会打包到程序安装包中。(通过 AssetManager 类访问这些文件)
res:会在 R 文件中生成 id 标记,资源在打包时如果使用到则打包到安装包中,未用到不会打入安装包中。
res/anim:存放动画资源。
res/raw:和 asset 下文件一样,打包时直接打入程序安装包中(会映射到 R 文件中)。
5. 类的初始化顺序依次是?
(静态变量、静态代码块)>(变量、代码块)>构造方法
6. Oom 是否可以try catch ?
【参考】https://blog.csdn.net/sinat_29912455/article/details/51125748
只有在一种情况下,这样做是可行的:
在try语句中声明了很大的对象,导致OOM,并且可以确认OOM是由try语句中的对象声明导致的,那么在catch语句中,可以释放掉这些对象,解决OOM的问题,继续执行剩余语句。
但是这通常不是合适的做法。
Java中管理内存除了显式地catch OOM之外还有更多有效的方法:比如SoftReference, WeakReference, 硬盘缓存等。 在JVM用光内存之前,会多次触发GC,这些GC会降低程序运行的效率。 如果OOM的原因不是try语句中的对象(比如内存泄漏),那么在catch语句中会继续抛出OOM。
7. 编译期注解跟运行时注解
运行期注解(RunTime)利用反射去获取信息还是比较损耗性能的,对应@Retention(RetentionPolicy.RUNTIME)。
编译期(Compile time)注解,以及处理编译期注解的手段APT和Javapoet,对应@Retention(RetentionPolicy.CLASS)。 其中apt+javaPoet目前也是应用比较广泛,在一些大的开源库,如EventBus3.0+,页面路由 ARout、Dagger、Retrofit等均有使用的身影,注解不仅仅是通过反射一种方式来使用,也可以使用APT在编译期处理
8. 强引用置为null,会不会被回收?
不会立即释放对象占用的内存。 如果对象的引用被置为null,只是断开了当前线程栈帧中对该对象的引用关系,而垃圾收集器是运行在后台的线程,只有当用户线程运行到安全点(safe point)或者安全区域才会扫描对象引用关系,扫描到对象没有被引用则会标记对象,这时候仍然不会立即释放该对象内存,因为有些对象是可恢复的(在 finalize方法中恢复引用 )。只有确定了对象无法恢复引用的时候才会清除对象内存。
9. 如何通过Gradle配置多渠道包?
用于生成不同渠道的包
android {
productFlavors {
xiaomi {}
baidu {}
wandoujia {}
_360 {}
}
}
<span class="copy-code-btn">复制代码</span>
执行./gradlew assembleRelease ,将会打出所有渠道的release包;
执行./gradlew assembleWandoujia,将会打出豌豆荚渠道的release和debug版的包;
执行./gradlew assembleWandoujiaRelease将生成豌豆荚的release包。
因此,可以结合buildType和productFlavor生成不同的Build Variants,即类型与渠道不同的组合。
10. ddms 和 traceView 的区别?
ddms 原意是:davik debug monitor service。简单的说 ddms 是一个程序执行查看器,在里面可以看见线程和堆栈等信息,traceView 是程序性能分析器。traceview 是 ddms 中的一部分内容。
Traceview 是 Android 平台特有的数据采集和分析工具,它主要用于分析 Android 中应用程序的 hotspot(瓶颈)。Traceview 本身只是一个数据分析工具,而数据的采集则需要使用 Android SDK 中的 Debug 类或者利用DDMS 工具。二者的用法如下:开发者在一些关键代码段开始前调用 Android SDK 中 Debug 类的 startMethodTracing 函数,并在关键代码段结束前调用 stopMethodTracing 函数。这两个函数运行过程中将采集运行时间内该应用所有线程(注意,只能是 Java线程) 的函数执行情况, 并将采集数据保存到/mnt/sdcard/下的一个文件中。 开发者然后需要利用 SDK 中的 Traceview工具来分析这些数据。
11. AndroidManifest的作用与理解
AndroidManifest.xml文件,也叫清单文件,来获知应用中是否包含该组件,如果有会直接启动该组件。可以理解是一个应用的配置文件。
作用:
- 为应用的 Java 软件包命名。软件包名称充当应用的唯一标识符。
- 描述应用的各个组件,包括构成应用的 Activity、服务、广播接收器和内容提供程序。它还为实现每个组件的类命名并发布其功能,例如它们可以处理的 Intent - 消息。这些声明向 Android 系统告知有关组件以及可以启动这些组件的条件的信息。
- 确定托管应用组件的进程。
- 声明应用必须具备哪些权限才能访问 API 中受保护的部分并与其他应用交互。还声明其他应用与该应用组件交互所需具备的权限
- 列出 Instrumentation类,这些类可在应用运行时提供分析和其他信息。这些声明只会在应用处于开发阶段时出现在清单中,在应用发布之前将移除。
- 声明应用所需的最低 Android API 级别
- 列出应用必须链接到的库
12. 为什么要有内部类?静态内部类和普通内部类区别是什么?
-
为什么要有内部类
1、内部类一般只为其外部类使用;
2、内部类提供了某种进入外部类的窗户;
3、也是最吸引人的原因,每个内部类都能独立地继承一个接口,而无论外部类是否已经继承了某个接口。因此,内部类使多重继承的解决方案变得更加完整。
-
内部类和外部类区别?
1、内部类是一个编译时概念,编译后外部类及其内部类会生成两个独立的 class 文件:
OuterClass.class 和 OuterClass$InnerClass.class
2、内部类可以直接访问外部类的元素,但是外部类不可以直接访问内部类的元素
3、外部类可以通过内部类引用间接访问内部类元素
4、对于静态内部类来说,静态内部类是不依赖于外部类的,也就说可以在不创建外部类对象的情 况下创建内部类的对象。另外,静态内部类是不持有指向外部类对象的引用的静态内部类和普通内部类静态内部类与非静态内部类之间存在一个最大的区别,我们知道非静态内部类在编译完成之后会隐含地保存着一个引用,该引用是指向创建它的外围内。但是静态内部类却没有。没有这个引用就意味着:静态内部类的创建是不需要依赖于外围类,可以直接创建静态内部类不可以使用任何外围类的非static 成员变量和方法,而内部类则都可以
-
注意:
1.非静态内部类中不允许定义静态成员
2.外部类的静态成员不可以直接使用非静态内部类
3.静态内部类,不能访问外部类的实例成员,只能访问外部类的类成
13. Android UI 线程和非 UI 线程的交互方式
【参考】:用于实现后台线程与 UI 线程的交互。
1、Handler
2、Activity.runOnUIThread(Runnable)
3、View.Post(Runnable)
4、View.PostDelayed(Runnabe,long)
5、AsyncTask
-
Handler
handler 是 android 中专门用来在线程之间传递信息类的工具。
-
Activity.runOnUIThread(Runnable)
这个方法相当简单,我们要做的只是以下几步
- 编写后台线程,这回你可以直接调用 UI 控件
- 创建后台线程的实例
- 调用 UI 线程对应的 Activity 的 runOnUIThread 方法,将后台线程实例作为参数传入其中。
注意:无需调用后台线程的 start 方法
-
View.Post(Runnable)
该方法和方法二基本相同,只是在后台线程中能操控的 UI 控件被限制了,只能是指定的 UI
控件 View。方法如下
- 编写后台线程,这回你可以直接调用 UI 控件,但是该 UI 控件只能是 View
- 创建后台线程的实例
- 调用 UI 控件 View 的 post 方法,将后台线程实例作为参数传入其中
-
View.PostDelayed(Runnabe, long)
该方法是方法三的补充,long 参数用于制定多少时间后运行后台进程
-
AsyncTask
AsyncTask 是一个专门用来处理后台进程与 UI 线程的工具。通过 AsyncTask,我们可以非常方便的进行后台线程和 UI 线程之间的交流。
AsyncTask 拥有 3 个重要参数
<1> Params,Params 是后台线程所需的参数。在后台线程进行作业的时候,他需要外界为其提供必要的参数,就好像是一个用于下载图片的后台进程,他需要的参数就是图片的下载地址
<2> Progress,Progress 是后台线程处理作业的进度。依旧上面的例子说,就是下载图片这个任务完成了多少,是 20%还是 60%。这个数字是由 Progress 提供
<3> Result,Result 是后台线程运行的结果,也就是需要提交给 UI 线程的信息。按照上面的例子来说,就是下载完成的图片
AsyncTask 还拥有 4 个重要的回调方法
<1> onPreExecute,onPreExecute 运行在 UI 线程,主要目的是为后台线程的运行做准备。当他运行完成后,他会调用 doInBackground 方法
<2> doInBackground,doInBackground 运行在后台线程,他用来负责运行任务。他拥有参数 Params,并且返回 Result。在后台线程的运行当中,为了能够更新作业完成的进度,需要在 doInbackground 方法中调用 PublishProgress 方法。该方法拥有参数 Progress。通过该方法可以更新 Progress 的数据。然后当调用完 PublishProgress 方法,他会调用onProgressUpdate 方法用于更新进度
<3> onProgressUpdate,onProgressUpdate 运行在 UI 线程,主要目的是用来更新 UI 线程
中显示进度的 UI 控件。他拥有 Progress 参数。在 doInBackground 中调用 PublishProgress
之后,就会自动调 onProgressUpdate 方法
<4> onPostExecute,onPostExecute 运行在 UI 线程,当 doInBackground 方法运行完后,
他会调用 onPostExecute 方法,并传入 Result。在 onPostExecute 方法中,就可以将 Result
更新到 UI 控件上
注意:AsyncTask 实例只能执行一次,否则就出错哦
算法与数据结构专项
1、百度,腾讯,阿里对数据结构和算法要求掌握适中就行
2、快手、头条、拼多多刷题就一般能过。
一般都是大厂需要手写代码,比如头条,快手,腾讯,阿里。
1、比如常见的单链表,反转,插入,删除,双链表插入,删除
2、常见的排序,堆排序,归并排序、快排等。
3、二叉树的前序遍历,中序遍历,后序遍历等
4、最大 K 问题。经典的广度、深度优先搜索算法
5、单链表是否有环等经典问题。
【备注:以上内容必掌握~】
leetcode 刷题技巧:
可以先刷面试高频类:https://leetcode.com/problemset/top-interview-questions/
常考题:https://leetcode-cn.com/explore/interview/card/bytedance/
腾讯常考题:https://leetcode-cn.com/problemset/50/
github:https://github.com/zhedahht/ChineseCodingInterviewAppendix
也可以针对哪个公司常考题刷,也可以分类别刷,比如动态规划不好就多刷几道。 或者暴力刷(推荐有很长刷题时间)。