2

1四大组件

Activity

Activity的四种启动模式是什么?

  • standard : 默认的启动模式,启动会创建一个实例,也可以用Intent.FLAG_ACTIVITY_NEW_TASK而改变

  • singleTop:当启动activity时,有相同的activity在前台与用户交互,那就复用这个activity,这个实例会被调用Activity.onNewIntent())。

    当只需要一个实例的时候需要用这种模式

  • singleTask:在启动activity时,若有一个运行着这个activity的task,那这个activity实例会被调到前台,并调用Activity.onNewIntent())

    这里常用的地方为层级重复的地方,比如说个人页,就会使用这种模式

  • singleInstance:开辟一个只允许一个activity实例在里头运行的task. 如果用同样的intent再次启动这个activity,task会被调到前台

    重新启动的时候回调动onNewIntent();

    用到的地方是完全分离程序的地方

    例子:b为singelInstance 进入abc ->出来cab

Activity的生命周期都有哪些?

  • onCreate:点击activity的时候,初始化布局setContentLayout();
  • onStart:activity为可见状态,但是没有焦点,不能交互
  • onResume:可以交互
  • onPause:onPuase中,是可见的但是没有焦点不能交互
  • onStop:不可见的,内存紧张的状态可能被回收,所以这里做资源回收,并且透明的actiivty除非销毁不会执行stop方法。
  • onDestory:销毁,可以结束当前的activity
  • onRestart :Home再回来的时候,切换到其他的Activity再回来的时候,
  • onStaveInstance:onstop之后,destory之前

Activity的进程优先级

Low Memory Killer是什么

oom_adj

  • 前台进程:activity正在与用户交互onreume状态

  • 可见进程:

    • 有一个acitivyt,不在前台,处于onPause

    • 有一个service,service和一个activity绑定

  • service进程:

    • startService()启动一个service服务的时候就是服务进程
  • 后台进程:

    • stop被调用的时候
  • 空进程

    • 没有任何运行的数据,保留内存空间,没有被kill

Service

Service和Thread的区别?

首先Thread是程序执行的最小单元,是分配CPU的基本单位,可以用Thread来执行一些基本的操作

Service是Android的一种机制,如果是本地服务,那么它是在主进程上运行的,如果是远程服务它是在独立进程上的mainThread上运行的,从这个角度来讲Thread包含在Service中。

并且Thread的优先级是低于Service的优先级的。

Service的启动方式?

  • startService方式:分别执行的onCreate() onstartCommend() onDestory(),我们需要注意的是:
    • 多次调用startService的话执行多次onStartCommend()方法,onCreate()只会执行一次
    • 以startService方式启动可以调用bind,也可以调用unbind,但是必须调用stopService才可以销毁service
    • 启动后调用bindService后调用stopService并不会销毁服务,调用stopService后调用unBindService会执行onUnbind和onDestroy
  • bind方式:分别执行onCreatea() onBind() onUnbind() onDestory()

Handler的原理?

一般的情况下用于线程间的切换。

首先说说handler的构造,handler的构造当中调用了Looper.myLooper()创建了一个得到一个Looper,和从looper当中拿到的messagequeue。,如果当前的looper没有的话,就从threadlocal当中去创建一个looper,然后,放入到其当中去

附加。

handler分发消息的方法有很多,有post()postdelay() sendmessage()sendmessagedelay()sendtmptymessage()

给handler的全局变量。

其里面都调用了sengmessageatTime()方法。如果没有指定时间,那么他们的时间就是0;

Looper的构造,Looper中做的主要的事情就是构建一个messagerQueue,Looper中有很多方法主要用到的是prepare()loop(),

messageQueue里面的数据结构是一个arraylist(),里面的方法主要是get()和set()Message。

Message()就是在开发中常用到的,其实他的数据结构是一个单链表,在Message里面维护了一个大小为50的单链表,来去执行Message的回收

前面有说到在handler的构造函数当中,我拿到了当前Looper的MessageQueue,然后也有说到handler里面的方法都是执行了sendMessageAtTtime(),他实际就是调用了message的enqueue方法,当message退出的flat标志位true的时候,就会把这个message放入到Message类的静态链表当中。用message。obtain来使用。

首先从构造函数来讲,handler在构造函数中调用了mylooper创建了一个当前线程的looper,

然后从looper中拿到一个messageQueue对象。

那么构成handler的最主要的三个成员就准备好了

  • Looper
    • mainlooper的具体实现是什么?Looper调用mylooper会从ThreadLocal中get一个looper对象,threadlocal底层是一个threadmap,是由android系统实现的一个hashmap
    • threadlocal的中的looper是从哪里来的?是从activity启动的时候获取的,在app的启动的时候,会调用ActivityThread,而在ActivityThread的main方法中,调用了Looper的prepareMainLooper()方法,并且在之后调用了looper.prepare()方法和looper.loop()方法。
    • prepareMainLooper()方法的实现?有点像单例模式,但是这个是创建了一个looper对象mainLooper,存放在Looper当中做一个静态变量,当需要获取主线程的looper的时候可以从这个地方获取
    • Looper.prepare方法的实现?新建一个looper,并且把这个looper保存到threadlocal当中,这里就解释了为什么我们创建hadler的时候可以取出来一个looper对象了。
    • Looper.loop()方法的实现?就是一个死循环,然后拿到Looper中的messagequeue,从messagequeue中拿到message之后调用dispathmessage分发给handler
    • Looper的构造方法做了哪些事情?新建一个messageQueue,然后通过Thead.getcurrentThread拿到当前线程。
  • MessageQueue
    • 就是一个消息队列,里面存放了所有的message
  • Message:
    • obtain方法怎么怎么实现的?message其实就是一个链表,在Message中有50个size的链表,当obtain的时候讲链表的头结点取出然后移动到下个结点。
  • Handler:
    • post(Runnable)方法怎么实现的?就是从Message中obtain一个message,然后将callback传给message,这样message就可以回调回去了。

热修复的原理?

java虚拟机是java加载类的class文件,而dalvik虚拟机呢是加载dex文件的。

而他们加载类的时候Classloader,classloader有一个子类BaseDexClassLoader,而其之下有一个DexpathList,用来存放dex文件的列表,当BaseDexClassLoader调用findClass方法的时候实际上就是遍历数组找到对应的文件。而热修复的解决方法就是加到dex当中去。并且在旧的dex之前,这样就会取出来返回了。

JVM和divlik之间的区别?

JVM是加载

Android跨进程通信的机制

四大组件

AIDL

socket

pip

Android中资源查找的过程?

MVC MVP MVVM

mvc的关注点是分离,业务模型,视图,数据模型的解耦

view将指令传递给controller controller完成任务时候,传递给model,model将新的数据发送给view。用户得到了反馈

优点:是实现简单,视图和业务的分离,可以更改视图而不需要改动controller和model的代码

缺点:视图和controller和model结合比较紧密,基本上一个view绑定了一个controller,让controller的复用很难

mvp

和mvc类似,也是为了视图控制数据模型的解耦,他们之前的区别是改变了数据传递的方向,数据模型不再传递给view,controller负责他们之间的通信。

优点: 模型与视图完全完全解耦

​ 增加了present的复用,的可能性,

​ 独立测试,因为将present处理逻辑,view的接口

缺点:view和present联系紧密,交互比较频繁

mvvm:

优点:独立测试:完全解耦,可重用,可独立开发

缺点:实现复杂,对MVVM需要有比较深入的理解。

实现难度:

耦合性:

重用性:

测试性:

独立开发性:

关闭app的方法

各个动画的实现机制

帧动画

补间动画

属性动画

HashMap

http://baijiahao.baidu.com/s?id=1585269929754900992&wfr=spider&for=pc

hashMap里面存档的是散列+链表实现的,并且在JDK1.7之后用的是平衡b-树,红黑树

主要记得他们的get put 还有扩容机制还有版本

要描述他们的put和get首先要从他们的扩容量来说默认是1无符号左位移了4位,大小为16,那么当前大小大于这默认值16的时候回进行第一次扩容,扩容的操作是做了一次无符号的左位移1,也就是扩容了二倍,那么下次扩容是基于他扩容后的带下*扩容能力的,默认是3/4也可以去指定。

接下来说一下put方法,首先将大小得到key的hash,然后用size-1,由于size是2的n次方扩容的所以减一位数为011111,那么与hashcode就得到了一个值,如果散列数组中这个位置为null,就将keyvalue设置到链表的一个节点,并将此节点放入到这个位置上,如果不为null,则放入到下个节点,在jdk1.7之后节点的长度当达到7的时候,会用红黑树来存储。

Activity的启动过程是什么?

AIDL的原理?

NDK的注册方式?

分为两种注册方式

静态注册和动态注册:

静态注册是调用System.loadLibrary()方法。将相应的so库注册到里面

动态注册其实和静态注册的原理是一样的,调用System.Load()时候,调用JNI_load()方法,里面会执行JNIEnv的registerNative方法,那么我们只需要在registerNative方法中奖C++和java代码关联起来。

Universal-ImageLoader,Picasso,Fresco,Glide对比

OKhttp, Volley, Retrofit对比

View绘制的流程

onmeasure onlayout ondraw

屏幕适配解决方案

https://www.cnblogs.com/yaozhongxiao/archive/2014/07/14/3842908.html

今日头条解决方法

事件分发机制

https://www.cnblogs.com/huangjialin/p/8657696.html

down,move,cancel 。

cancel的触发

asynctask的原理

binder机制

图片加载三级缓存,有一个功能,做一个能放大缩小的图片查看器,加载一张巨大的图片,怎么做

图片加载框架优劣比较

断点续传

四种线程池区别

###

异常关闭页面之后的恢复

谢谢您的鼓励~