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在构造函数中调用了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

Java类中

关闭app的方法

各个动画的实现机制

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

Activity的启动过程是什么?

AIDL的原理?

Universal-ImageLoader,Picasso,Fresco,Glide对比

OKhttp, Volley, Retrofit对比

View绘制的流程

事件分发机制

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

谢谢您的鼓励~