BAT 常见 Android 面试 20 题详解,小白看完都会了
5.TCP 保证数据正确性,UDP 可能丢包,TCP 保证数据顺序,UDP 不保证。
2、对于 Android 的安全问题,你知道多少?
①错误导出组件
② 参数校验不严
③WebView 引入各种安全问题,webview 中的 js 注入
④不混淆、不防二次打包
⑤明文存储关键信息
⑦ 错误使用 HTTPS
⑧山寨加密方法
⑨滥用权限、内存泄露、使用 debug 签名
3、如何缩减 APK 包大小?
代码
保持良好的编程习惯,不要重复或者不用的代码,谨慎添加 libs,移除使用不到的 libs。
使用 proguard 混淆代码,它会对不用的代码做优化,并且混淆后也能够减少安装包的大小。
native code 的部分,大多数情况下只需要支持 armabi 与 x86 的架构即可。如果非必须,可以考虑拿掉 x86 的部分。
资源
使用 Lint 工具查找没有使用到的资源。去除不使用的图片,String,XML 等等。 assets 目录下的资源请确保没有用不上的文件。
生成 APK 的时候,aapt 工具本身会对 png 做优化,但是在此之前还可以使用其他工具如 tinypng 对图片进行进一步的压缩预处理。
jpeg 还是 png,根据需要做选择,在某些时候 jpeg 可以减少图片的体积。 对于 9.png 的图片,可拉伸区域尽量切小,另外可以通过使用 9.png 拉伸达到
大图效果的时候尽量不要使用整张大图。
策略
有选择性的提供 hdpi,xhdpi,xxhdpi 的图片资源。建议优先提供 xhdpi 的图片,对于 mdpi,ldpi 与 xxxhdpi 根据需要提供有差异的部分即可。
尽可能的重用已有的图片资源。例如对称的图片,只需要提供一张,另外一张图片可以通过代码旋转的方式实现。
能用代码绘制实现的功能,尽量不要使用大量的图片。例如减少使用多张图片组成 animate-list 的 AnimationDrawable,这种方式提供了多张图片很占空间。
4、HashMap、HashTable 和 ConcurrentHashMap 的区别?
1.底层结构 HashMap 是数组加链表 HashTable 是数组加链表 ConcurrentHashMap 是数组加数组加链表
2.扩容 HashMap 是初始容量右移一位加一 HashTable 是初始容量右移一位 ConcurrentHashMap 是初始的 Segment 数组保持不变,只将 HashEntry 的数组进行扩容
3.继承关系 HashMap 是继承于 extends AbstractMap<K,V> implements Map<K,V>, Cloneable, SerializableHashTable 是继承于 extends Dictionary<K,V>implements Map<K,V>, Cloneable, java.io.SerializableConcurrentHashMap 是继承于 extends AbstractMap<K, V>implements ConcurrentMap<K, V>, Serializable
4.在线程安全方面:HashMap 在单线程下是安全的,多线程下不安全,HashTable 在多线程下是安全的,因为它在基本操作前面都加上了 synchronized 锁,即就是就算在多个线程操作的时候,只要有一个线程进入了基本方法内,其他的线程就必须等待。只有当第一个线程操作结束,释放了锁,其他的线程才可以进行操作。虽然说在多线程操作的时候线程是安全的但是效率比较低,毕竟那么多的线程就在等一把锁。
ConcurrentHashMap 是安全的,理由上方可寻。
5、设备横竖屏切换的时候,接下来会发生什么?
1、不设置 Activity 的 android:configChanges 时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次
2、设置 Activity 的 android:configChanges=”orientation”时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次
3、设置 Activity 的 android:configChanges=”orientation|keyboardHidden”时,切屏不会重新调用各个生命周期,只会执行 onConfigurationChanged 方法
6、Android 启动 Service 的两种方式是什么? 它们的适用情况是什么?
如果后台服务开始后基本可以独立运行的话,可以用 startService。音乐播放器就可以这样用。它们会一直运行直到你调用 stopSelf 或者 stopService。你可以通过发送 Intent 或者接收 Intent 来与正在运行的后台服务通信,但大部分时间,你只是启动服务并让它独立运行。如果你需要与后台服务通过一个持续的连接来比较频繁地通信,建议使用 bind()。比如你需要定位服务不停地把更新后的地理位置传给 UI。Binder 比 Intent 开发起来复杂一些,但如果真的需要,你也只能使用它。
startService:生命周期与调用者不同。启动后若调用者未调用 stopService 而直接退出,Service 仍会运行
bindService:生命周期与调用者绑定,调用者一旦退出,Service 就会调用 unBind->onDestroy
7、谈谈你对 Android 中 Context 的理解?
Context:包含上下文信息(外部值) 的一个参数. Android 中的 Context 分三种,Application Context ,Activity Context ,Service Context.
它描述的是一个应用程序环境的信息,通过它我们可以获取应用程序的资源和类,也包括一些应用级别操作,例如:启动一个 Activity,发送广播,接受 Intent 信息等
8、Service 的 onCreate 回调在 UI 线程中吗?
Service 生命周期的各个回调和其他的应用组件一样,是跑在主线程中,会影响到你的 UI 操作或者阻塞主线程中的其他事情
9、请介绍下 AsyncTask 的内部实现,适用的场景是?
AsyncTask 内部也是 Handler 机制来完成的,只不过 Android 提供了执行框架来提供线程池来执行相应地任务,因为线程池的大小问题,所以 AsyncTask 只应该用来执行耗时时间较短的任务,比如 HTTP 请求,大规模的下载和数据库的更改不适用于 AsyncTask,因为会导致线程池堵塞,没有线程来执行其他的任务,导致的情形是会发生 AsyncTask 根本执行不了的问题。
10、谈谈你对 binder 机制的理解?
binder 是一种 IPC 机制,进程间通讯的一种工具.
Java 层可以利用 aidl 工具来实现相应的接口.
11、Android 中进程间通信有哪些实现方式?
Intent,Binder(AIDL),Messenger,BroadcastReceiver
12、介绍下实现一个自定义 view 的基本流程
1、自定义 View 的属性 编写 attr.xml 文件
2、在 layout 布局文件中引用,同时引用命名空间
3、在 View 的构造方法中获得我们自定义的属性 ,在自定义控件中进行读取(构造方法拿到 attr.xml 文件值)
4、重写 onMesure
5、重写 onDraw
13、Android 中 touch 事件的传递机制是怎样的?
1、Touch 事件传递的相关 API 有 dispatchTouchEvent、onTouchEvent、onInterceptTouchEvent
2、Touch 事件相关的类有 View、ViewGroup、Activity
3、Touch 事件会被封装成 MotionEvent 对象,该对象封装了手势按下、移动、松开等动作
4、Touch 事件通常从 Activity#dispatchTouchEvent 发出,只要没有被消费,会一直往下传递,到最底层的 View。
5、如果 Touch 事件传递到的每个 View 都不消费事件,那么 Touch 事件会反向向上传递,最终交由 Activity#onTouchEvent 处理.
6、onInterceptTouchEvent 为 ViewGroup 特有,可以拦截事件.
7、Down 事件到来时,如果一个 View 没有消费该事件,那么后续的 MOVE/UP 事件都不会再给它
14、Android 多线程的实现方式有哪些?
Thread & AsyncTask
Thread 可以与 Loop 和 Handler 共用建立消息处理队列
AsyncTask 可以作为线程池并行处理多任务
15、Android 开发中何时使用多进程?使用多进程的好处是什么?
要想知道如何使用多进程,先要知道 Android 里的多进程概念。一般情况下,一个应用程序就是一个进程,这个进程名称就是应用程序包名。我们知道进程是系统分配资源和调度的基本单位,所以每个进程都有自己独立的资源和内存空间,别的进程是不能任意访问其他进程的内存和资源的。
那如何让自己的应用拥有多个进程?
很简单,我们的四大组件在 AndroidManifest 文件中注册的时候,有个属性是 android:process,
评论