Android面试问题

  • Service 与 IntentService 的区别
IntentService是Service 的子类,默认给我们开启了一个工作线程执行耗时任务,并且执行完任务后自 动停止服务。扩展IntentService比较简单,提供一个构造方法和实现onHandleIntent 方法就可了,不用重写父类的其他方法。但是如果要绑定服务的话,还是要重写onBind 返回一个IBinder 的。使用Service 可以同时执行多个请求,而使用IntentService 只能同时执行一个请求。
  • Android 应用中如何保存数据
android 五种数据存储 :SharePreferences、SQLite、Contert Provider、File、网络存储
  • 两个 Fragment 之间如何通信
  • 拿到Fragment实例然后调用它的函数
  • 自定义接口回调
  • EventBus
  • 两个不同的 app 之间如何交互
  • 使用ContentProvider
  • 使用文件或云端方式共享
  • BroadcastReceiver
  • 使用AIDL
  • 为什么 Bundle 被用来传递数据,为什么不能使用简单的 Map 数据结构
  • Bundle内部是由ArrayMap实现的,ArrayMap的内部实现是两个数组,一个int数组是存储对象数据对应下标,一个对象数组保存key和value,内部使用二分法对key进行排序,所以在添加、删除、查找数据的时候,都会使用二分法查找,只适合于小数据量操作,如果在数据量比较大的情况下,那么它的性能将退化。而HashMap内部则是数组+链表结构,所以在数据量较少的时候,HashMap的Entry Array比ArrayMap占用更多的内存。因为使用Bundle的场景大多数为小数据量,我没见过在两个Activity之间传递10个以上数据的场景,所以相比之下,在这种情况下使用ArrayMap保存数据,在操作速度和内存占用上都具有优势,因此使用Bundle来传递数据,可以保证更快的速度和更少的内存占用。
  • 另外一个原因,则是在Android中如果使用Intent来携带数据的话,需要数据是基本类型或者是可序列化类型,HashMap使用Serializable进行序列化,而Bundle则是使用Parcelable进行序列化。而在Android平台中,更推荐使用Parcelable实现序列化,虽然写法复杂,但是开销更小,所以为了更加快速的进行数据的序列化和反序列化,系统封装了Bundle类,方便我们进行数据的传输。
  • 解释下 Android 的 View
view是所有控件的父类,他的位置主要由他的四个顶点来决定。分别对应view的四个基本属性:left,top,right,bottom。其中top是左上角纵坐标,left是左上角的横坐标,right右下角的横坐标,bottom右下角的纵坐标。这些坐标都是相对于view的父控件来说的,因此它是一种相对坐标。在Android系统中,x轴和y轴的方向分别是向右和向下的
  • 什么是 ViewGroup ,它与 View 的区别在哪里
View是所有UI组件的基类,而 ViewGroup是容纳这些组件的容器,其本身也是从View派生出来的.简单的说就是:view指某些具体的控件,如Textview,imageview等,ViewGroup是用来盛放这些控件的容器,如LinearLayout和Relativelayout等
  • 解释一下 Android 中的 Intent
Intent这个单词的意思就是"意图,目的,意向",Intent是一种运行时绑定(runtime binding)机制,它能在程序运行的过程中连接两个不同的组件。通过Intent,程序可以向Android表达某种请求或者意愿,Android会根据意愿的内容选择适当的组件来响应。Intent是由以下组件组成:
  • component(组件):目的组件
  • action(动作):用来表现意图的行动
  • category(类别):用来表现动作的类别,或范畴
  • data(数据):表示与动作要操纵的数据
  • type(数据类型):对于data范例的描写
  • extras(扩展信息):扩展信息
  • Flags(标志位):期望这个意图的运行模式
  • LocalBroadcastManager
  • JobScheduler
  • 什么是 support libary
  • 什么是 Data Binding
  • 什么是adb
  • ADB是我们用来操作(调试)android设备(比如android手机)的一套指令集
  • 常用指令集
  • Dalvik 虚拟机
  • Android 的权限有多少个不同的保护等级
  • normal:低风险权限,只要申请了就可以使用(在AndroidManifest.xml中添加标签),安装时不需要用户确认;
  • dangerous:高风险权限,安装时需要用户的确认才可使用;
  • signature:只有当申请权限的应用程序的数字签名与声明此权限的应用程序的数字签名相同时(如果是申请系统权限,则需要与系统签名相同),才能将权限授给它;
  • signatureOrSystem:签名相同,或者申请权限的应用为系统应用(在system image中)。
上述四类权限级别同样可用于自定义权限中。如果开发者需要对自己的应用程序(或部分应用)进行访问控制,则可以通过在AndroidManifest.xml中添加标签,将其属性中的protectionLevel设置为上述四类级别中的某一种来实现。
  • aapt
  • Loader
  • Lint
  • SurfaceView
  • PendingIntent
  • Spannable
  • Dalvik 虚拟机模式和 ART
  • 组件化
  • 插件化
  • fragment懒加载原理
  • 混淆后代码bug定位
  • ARouter源码分析
  • Recyclerview和listview区别
  • Glide源码解析
  • Scoket心跳包
  • jvm虚拟机,堆和栈的结构
  • kotlin优劣势
  • 热修复和插件化原理
  • Synchronized相关
    • Synchronized几种用法
    • Synchronized几种用法区别
    • Synchronized原理
  • 泛型擦除
  • 线程安全的单例模式有哪几种
  • MVC,MVP,MVVM
  • apk瘦身
  • Eventbus原理
  • GC回收算法
  • 进程间通信
  • Binder
  • Retrofit
  • volatile关键字
  • 网络优化
  • 处理后台返回的骚数据
  • Hook技术
  • 动态代理
  • Http报文体结构
-Http常用头
  • 【Android面试问题】crashHandler
  • Android 常见崩溃问题
  • AOP
  • 线程池原理
  • AS调试技巧
  • hashmap为什么大于8才转化为红黑树
  • Context
  • handler缓存池大小
  • 获取view的宽高
  • ARN分析
  • leakCanary原理
  • Binder机制

    推荐阅读