文章目录
  • 单元测试

  • 对mvp框架的理解,有什么优点?

  • activity的四种启动模式: standard(标准模式)、singtop 栈顶模式 singtask、singinstance

  • Activity生命周期? oncreate—>onrestart—>onstart—>onresume—>onpause—>onstop—>ondestory

  • Service生命周期?这里要注意service有两种启动方式,startService()和bindService():

    oncreate—>onstartcommand—>ondestory

    oncreate—>onbind—>onunbind—>ondestory

  • 理解Activity,View,Window三者关系?

    activity 启动的时候会初始化一个Window,准确的说是phonewindow,这个phonewindow有一个ViewRoot,这个ViewRoot是一个view或viewgroup,是最初始的根布局,“ViewRoot”通过addView方法来一个个的添加View。比如TextView,Button等,这些View的事件监听,是由WindowManagerService来接受消息,并且回调Activity函数。比如onClickListener,onKeyDown等。

  • View的绘制流程?

  • Touch事件传递机制?

  • 界面性能优化?

    • ui过渡绘制,
    • android 系统要求每一帧都要在16ms内完成
    • 耗时操作放在非ui线程操作
    • Lint工具检测布局
    • 对布局嵌套进行优化
  • java内存的分配:

    • 静态存储区:编译时就分配好,在程序整个运行期间都存在。主要存在静态数据和常量
    • 栈区:方法执行时,会在栈区内存中创建方法体内的局部变量,方法结束后,自动释放内存。
    • 堆区:通常存放new 出来的对象,由java 垃圾回收器回收。
  • 四种引用类型的介绍:

    • 强引用:JVM宁可跑出oom,也不让gc回收具有强引用的对象
    • 软引用:只有当内存不足的时,才会被回收的对象
    • 弱引用:在GC时,一旦发现了具有弱引用的对象,不管内存是否足够与否,都会回收ta的内存
    • 虚引用:任何时候都可以被GC回收
  • 造成内存泄漏的几个原因:

    • 单例模式
    • handle
    • context 的不正确使用
    • 资源没有关闭,比如cursor, stream broadcastrevices
    • 注册监听器的泄漏
    • 非静态内部类的静态实例
    • Webview 造成的泄漏
    • 集合中对象没有清理造成的内存泄漏
    • 线程造成的内存泄漏,比如 AsyncTask, 任务没有执行完,ta 隐式的拥有activity的引用
  • ANR

  • Threadlocal 怎么使用?

  • 设计模式

  • 算法

  • handle 原理

  • http tcp ip 怎么理解

  • 对链表结构的理解?

  • 对于集合的理解:

    • List:有序、元素可重复,有索引
      • ArrayList :查询快,增删慢,不同步
      • LinkedList:查询慢,增删快,不同步
    • Set:无序,无索引,元素不可以重复
      • HashSet:底层是哈希表,无序,线程不同步
        • LinkedHashSet 有序,是hashset的子类
      • TreeSet:底层是二叉树,可对元素进行排序
    • Map:
      • HashTable:底层数据结构是哈希表,同步,不能存入null键和null值
      • HashMap:底层数据结构也是哈希表,不同步,能存null键和null值
      • TreeMap:底层数据结构是二叉树,不同步,可排序
  • collection与map的区别?

    • 单列集合,一次只能存入一个元素collection, map双列集合,一次存一对集合
  • 对于多线程的理解?

    • 进程和线程:进程是静态的,而线程是动态的,是真正执行的单元,执行的过程,线程是作为进程的一个单元存在的
    • 同样作为基本的执行单位,线程是划分的比进程更小的执行单位
    • 每个进程都有一段专用的内存区域。于此相反,线程却共享内存单元(包括代码和数据),通过共享的内存单元来实现数据交换,实时通信与必要的同步操作。
    • 创建线程的方式:
      • 继承thread
        • 定义一个类继承Thread
        • 覆盖Thread中的run方法
        • 直接创建Thread子类对象
        • 调用start 方法
      • 实现runnbale
        • 定义类实现runnable接口
        • 覆盖Runnable接口中的run方法
        • 通过Thread创建线程对象
        • 将Runnable接口的子类对象作为Thread类的构造函数参数进行传递
      • 两个的区别:继承方式:线程代码放在继承thread子类的run方法中,实现方式,线程代码放在Runnable的子类run方法中,这样的好处避免了单继承的局限性,建议使用。
    • 线程的状态
      • 创建: start()
      • 临时状态
      • 运行状态
      • 冻结状态
      • 消亡状态
    • wait和sleep的区别?
    • 进程的级别:
      • 前台进程
      • 可视进程
      • 服务进程
      • 后台进程
      • 空进程
  • android中的四大组件?

  • android序列化的方式 ,原理有什么区别?

  • 线程池是什么?

  • 位移?

  • xml/json解析数据区别?

  • 怎么加载一张大图片?

  • android 消息推送原理?

  • webview的bug?

  • 奔溃日志的处理?

文章目录