Android面试知识点汇总

更新时间:2019-05-30 11:25:44 点击次数:1346次

四大组件:

Activity:

Service:

  1. 在onStartCommand()中使用startforegound,将service变成前台进程(详见android的集中进程等级)
  2. 在onStartCommand中return sart_sticky
  3. 注册静态BroadcastReceiver,监听系统广播,然后判断Service状态
  4. 守护进程

BroadcastReceiver:

ContentProvider:


Android进程(等级)

  1. foreground process 前端进程

前端进程就是目前显示在屏幕上和用户交互的进程

比如说:

  1. 顶层可交互的activity(已执行onResume);
  2. 有个Service,并绑定到跟用户正在交互的activity;
  3. 在Service里调用了startForground函数;
  4. 正在执行onReceive函数的BroadCastReceiver
  • visible process 可见进程

  • 没有任何前台组件,但是仍然能影响用户在屏幕上看到东西。 
    比如:

  • Service process 服务进程 
    服务进程不会直接为用户所见 
    比如在后台播放mp3或者从网上下载东西

  • background process 后台进程 
    比如:Activity执行了onStop

  • empty process 空进程


  • 数据持久化

    SQLight:

    - SQLite是一个轻量级的数据库,支持基本的SQL语法
    - SQLiteDatabase的类,封装了一些操作数据库的api
        1. context.openOrCreateDatabase()方法创建SQLiteDatabase实例
        2. SQLiteDatabase实例调用insert()方法插入数据
        3. 调用query()方法查询数据
        4. 调用execSQL()方法执行SQL语句 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    SharedPreference:

    - 是一种轻量级的数据存储方式,采用简直对的方式来存储数据。
    - 其本质就是一个xml文件,一般位于/data/data/包名/shared_prefs/目录下。
    - 由于内存中存在sharedPreference文件的缓存,所以在多进程的环境下,系统对它的读写不可靠。因此不建议用在IPC中 
    
    • 1
    • 2
    • 3
    • 1
    • 2
    • 3

    ContentProvider:

    - Android系统中能实现不同应用间共享的一种数据存储方式。例如音频,视频,图片和通讯录,一般都可以采用此种方式进行存储
    - 每个Content Provider都会对外提供一个公共的URI,应用程序通过这个URI来对数据进行操作。
    - Content Provider天生支持跨进程访问,因此可以用于IPC 
    
    • 1
    • 2
    • 3
    • 1
    • 2
    • 3

    Android应用程序之间是通过哪些方式共享数据的?

    File,Sqlite,Content Provider,BroadCast Receiver,Intent,同个Application内部的话还可以通过静态变量共享数据。


    webView

    加载

    1. 提高渲染的优先级

    webSettings.setRenderPriority(RenderPriority.HIGH);

  • 把图片加载放在最后来加载渲染

  • webSettings.setBlockNetworkImage(true);

  • 使用硬件加速,该功能在Android 3.0 (API level 11)才加入。 
    硬件加速可以在一下四个级别开启或关闭:Application、Activity、Window、View 
    比如,在AndroidManifest.xml中添加android:hardwareAccelerated属性;关闭view的硬件加速myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);

  • 开启缓存 
    设置websetting

  • js和java对象交互

    1. 获取webview控件的websetting
    2. 设置websetting.setJavascriptEnabled( true )
    3. 将一个对象暴露给JavaScript:webview.addJavascriptInterface。这个对象包含了JS调用的方法,这些方法用@JavascriptInterface修饰

    4. JS通过这些方法与Android交互

    防止OOM

    1. 在代码中动态地将webview设置到布局中,而不是直接写到xml文件中;
    2. 在Activity的onDestory中销毁webview

    线程相关

    Linux线程基础

    ANR

    - what
        - Activity 5s内无响应,BroadcastReceiver 10s内无响应
        - /data/anr/traces.txt 文件记录了ANR的信息
    - why
    - how 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 1
    • 2
    • 3
    • 4
    • 5

    耗时任务或者线程间通讯

    Handler

    MessageQueue本质上是一个单链表,不是Queue。采用FIFO方式管理,enqueueMessage()方法是将消息插入一条队列,next()方法是一个无限循环的方法。如果有消息,则取出,如果没有,就阻塞

    本质上是一个继承了Thread的线程类。 
    通过创建HandlerThread**获取looper对象,传递给Handler对象,执行异步任务。在HandlerThread中通过**Looper.prepare()来创建消息队列,并通过Looper.loop()来开启消息循环。创建HandlerThread后必须先调用start()方法,才能调用getLooper()获取Looper对象。

    HandlerThread封装了Looper对象,使我们不用关心Looper的开启和释放的细节问题。如果不用HandlerThread的话,需要手动去调用Looper.prepare()和Looper.loop()这些方法。

    IntentService

    OOM

  • Handler造成OOM

  • WebView造成OOM


  • View相关

    三部曲

    三个核心步骤:Measure、Layout、Draw

    Touch分发机制

    重要

    滑动冲突

    简述Activity、Window、WindowManager、View、ViewRootImpl的作用和相互之间的关系

    RecyclerView

  • 缺点:

  • RecyclerView.Adapter


  • IPC

    Linux中IPC的方式:命名管道、信号量、共享内存

    基础

    序列化

    机制:Bundle、文件共享、ContentProvider、Socket、AIDL、Messager

    Binder

    四个角色:Client、Server、ServiceManager、BinderDriver

    调用过程: 
    1. Server向ServiceManager注册 
    2. Client通过ServiceManager获取Server的代理对象 
    3. Client向代理对象发起请求,该请求通过BinderDriver发送给Server处理 
    4. Server通过BinderDriver返回处理结果

    在一个应用有多个使用AIDL的场景,无需为每一个AIDL创建自己的Service。而是使用一个Service,创建并返回一个Binder连接池的Binder对象。Activity在使用AIDL的时候,可以通过该Binder连接池对象,获取不同的Binder对象(类似于工厂模式)

    AIDL

    Messager

    1. 在Service中new一个Messenger(这个Messenger需要指定Handler)
    2. 然后在onBind函数中,返回messenger的Binder对象(messenger.getBinder())
    3. 在Activity中,通过bindService启动service,通过ServiceConnection获取到Binder对象。
    4. 通过这个Binder对象实例化一个Messenger,然后messenger.send(message)进行通信

    启动流程

    Android开机流程

    init进程-zygote进程-SystemServer进程-各种ManagerService(AMS,PMS,WMS)- launcher程序

    App启动流程

    launcher-AMS-(pause)-zygote-新进程ActivityThread-(main函数)-向AMS注册-通知ActivityThread创建Activity并执行生命周期

    App内Activity启动流程

    Activity1-AMS-(pause)-在同一个ActivityThread-加载Activity2类,执行生命周期

    ActivityManagerService 和 Instrument 的区别


    性能及优化

    apk包大小

    1、减少不必要的jar包依赖 
    2、优先使用代码来设置UI效果 
    3、去除没用到的资源文件,压缩其他资源文件的大小,不用适配所有尺寸的设备 
    4、尽量重用代码,避免代码的冗余 
    5、限制app支持的cpu架构的数目:在当前的Android 生态系统中,让你的app支持 armabi 和 x86 架构就够了;

    方法数越界 multiDex方案

    1. 删除无用的代码和第三方库
    2. 采用插件化机制,动态加载dex。这是一个重量级的方案
    3. multiDex方案——可以从apk中加载多个dex文件
  • 基本使用:

    1. 配置Gradle,添加 multiDexEnabled true
    2. 添加multiDex依赖
    3. 在Application中添加 MultiDex.install(this) 代码

    其他

    目标:

    - 快:流畅
    - 稳:稳定
    - 省:省电、省流量
    - 小:安装包小 
    
    • 1
    • 2
    • 3
    • 4
    • 1
    • 2
    • 3
    • 4

    优化方案:

  • OOM优化

  • ANR优化

  • ListView(GridView)优化

  • Bitmap优化


  • 架构:本质上都是一种代码架构思想

    MVC

    其中M层处理数据,业务逻辑等;V层处理界面的显示结果;C层起到桥梁的作用,来控制V层和M层通信 
    视图层(View):一般采用XML文件进行界面的描述,这些XML可以理解为AndroidApp的View。 
    控制层(Controller):Android中由Activit、Fragment承担,负责逻辑处理 
    模型层(Model):提供数据,从进行数据库或者网络的操作。

    缺点:在Android开发中,Activity并不是一个标准的MVC模式中的Controller,它的首要职责是加载应用的布局和初始化用户界面,接受并处理来自用户的操作请求,进而作出响应,既是view层,又是controller层。随着界面及其逻辑的复杂度不断提升,Activity类的职责不断增加,以致变得庞大臃肿。

    MVP

  • 优点:将在Activty中的大量逻辑操作放到Presenter控制层中,避免Activity的臃肿。

  • 缺点:MVP模式需要多写许多新的接口;过于复杂的逻辑会使得Presenter臃肿

  • 实现方法:

  • MVVM

    AAC(Android Architecture Components,架构组件)

  • ViewModel:将视图的数据和逻辑从具有生命周期特性的实体(如 Activity 和 Fragment)中剥离开来。比如 AndroidViewModel(ViewModle的子类)

  • Room:官方数据库框架,对原生的SQLite API进行了一层封装。

  • MVVM和AAC

    个人理解:MVVM是一种思想,AAC提供多种工具。利用AAC中的工具实现MVVM的思想

    View:

    ViewModel:

    Model:

    这里写图片描述


    响应式编程

    RxJava/RxAndroid

    基于观察者模式,可以方便地以流的方式处理异步事件

    1. 创建: 
      Observable.create/just/from

    2. Schedulers线程调度

  • observeOn():

  • 举例: 
    AndroidSchedulers.mainThread(); 
    Schedulers.single(); 
    Schedulers.newThread(); 
    Schedulers.computation(); 
    Schedulers.io();
  • 变换 操作符

    1. map():将发射的每一项数据都用一个函数进行变换
    2. flapMap():
  • 背压

  • 在异步场景下,被观察者的发送速度远远大于观察者的处理速度。

    Retrofit

    是一个网络请求框架,底层依赖OkHttp

    支持两种模式:callback、RxJava/RxAndroid


    其他

    JIN

    由于Java的跨平台的特性,导致Java同本地交互的能力不够强大,一些和操作系统相关的操作无法完成。通过JNI可以调用C和C++的代码,提高自己的本地交互能力

    JNI开发流程:

    1. 在Java中编写native方法
    2. 将Java编译成class文件,然后导出JNI的.h头文件。
    3. 用C或者C++实现java中声明的JNI方法
    4. 编译.so库文件,然后在java中调用

    设计一个图片加载类

    画出一个项目中网络请求的流程图

    第三方库源码解析:

    OkHttp

    说说XML、JSON、GSON有什么样的联系

    XML全称叫做可扩展标记语言,它的结构相对简单,数据共享比较方便。但是对于一些比较复杂的数据,XML文件格式复杂,解析的代价大。 
    JSON的数据格式比较简单,易于读写。但是目前还没有XML应用广泛。 
    GSON的Google的一个开源库。这个开源库可以很方便地将JSON数组转换为对象,这在开发中简化了将JSON的字段转换为属性的步骤。

    Android访问权限

    apk下载到cache目录,只有 rw 权限,没有 x 权限,所以无法安装

    Runtime.getRuntime().exec() 
    执行 chmod 命令,修改为rwx


    APM

    Android性能信息

    异常捕获:

    UncaughtExceptionHandler: 
    android全局异常捕获器——在Application中调用**Thread.setDefaultUncaughtExceptionHandler 
    (uncaughtExceptionHandler)**,定制自己的错误日志系统。比如在发生Exception时,记录exception的堆栈信息。

    监控Activity生命周期

    在application中,调用registerActivityLifecycleCallbacks(),通过实现了ActivityLifecycleCallbacks接口的实例,完成对Activity各个生命周期信息的采集。比如哪个Activity在什么时间处于onCreate、onStop等等,进而统计出Activity的使用时间和使用次数。

    对于Fragment的信息采集

    SDK提供不同接口,分别对应Fragment的各个生命周期,进而采集信息。使用时,需要用户在Fragment的生命周期中的各个环节中,调用对应的接口。 
    会不会使用麻烦?会的,解决方法就是:在SDK中封装一个Fragment的子类,在这个子类中按照上述方法采集信息。用户在使用SDK过程中,可以直接继承使用这个子类,而不是继承使用Fragment。

    对HTTP接口的监测

    采用插装的办法:SDK提供两个接口,用户在发起HTTP请求时,调用第一个接口,可以记录下url和时间。在结束HTTP时,调用第二个接口,记录下url、时间和返回码。这两组记录就完成了对HTTP接口的数据采集? 
    会不会麻烦?会的,但是这种方法很通用,其他商用的SDK中也是这种方法。或者使用Gradle插件,在编译的时候,将上述代码自动插入项目中。

    错误信息上报机制:

    方案一:发现错误后立即上报。优点:实时性好;缺点:不能保证每一条信息都能上报成功。 
    方案二:发生错误后,记录在本地,当第二次启动App的时候,上报上一次的信息。

    本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责,本站只提供参考并不构成任何投资及应用建议。本站是一个个人学习交流的平台,网站上部分文章为转载,并不用于任何商业目的,我们已经尽可能的对作者和来源进行了通告,但是能力有限或疏忽,造成漏登,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

    回到顶部
    嘿,我来帮您!