service = context组件 + binder
IntentService = Service + HandlerThread + ServiceHandler(Handler);
在onStart中把接收到的intent设置到msg.obj,并在HandlerThread的线程上下文中回调 onHandleIntent() ,每次接收到新intent时,在onStart中给的startID,单调递增,每次跑完一个intent,将该intent一起给过来的startID,传入stopSelf(startID),因为intent的msg是队列的方式丢给Handler的,那么当最后一个收到的Intent的msg处理完后,stopSelf() 的 startID等于 onStart()给的最后一个startID,那么当前service停止
简单来说,就是一个带有后台工作线程专门处理发来的intent的Service
JobService = Service + IJobService(Binder服务) + JobHandler(Handler,looper基于MainThread)
自定义类继承它后,实现onStartJob和onStopJob,这2个函数在JobHandler中根据IJobService这个binder接收到的函数调用(startJob或stopJob)在MainThread的Looper线程上下文中被回调。
简单来说,就是一个带有固定binder服务方法(startJob或stopJob)和参数(JobParameters类型参数)的,且把消息跑在MainThread上的,带有handler队列的service
再简化一点说,就是一个带有默认binder可以发送JobParameters 来 startJob()或stopJob() 的service
Messenger = Handler + IMessenger(Binder服务);
(IMessenger 是一个基于binder的aidl,在Framework层以aidl文件定义,只有send(message)这一个方法被声明,只支持让client方send一个message,server的实现是handler的内部类(MessengerImp extends IMessenger.Stub),接收到send调用后,会将binder传递过来的msg对象,用当前所属handler对象的sendMessage方法插入到messageQueue中), 可以基于binder让进程以Handler的收发message对象的方式进行IPC
这样看来其实可以不用Messenger,对于Handler的基于binder的IPC,只要自己在2个进程间用任意一个自定义的,支持发送message对象的binder服务,再加上接收到msg消息后,将他转发到handler,就可以实现一样的功能;只不过这里Messenger和Handler已经帮我们封装好了基于binder的IPC方式发送message对象到server端的Handler的方法。
Handler = Looper + MessageQueue
Looper = ThreadLocal.set(new Looper())
线程独有
sp = RefBase / LightRefBase + 基于引用计数 + 基于构造和析构函数的 模仿java强指针进行自动对象释放的C++层强指针
wp = RefBase + 基于引用计数 + 基于构造和析构函数的 模仿java弱指针进行自动对象释放的C++层弱指针
-------bootloader-------
Uboot - start.S - ENTRY(_start) bootloader 第一阶段汇编层入口
Uboot - board.c - start_armboot() bootloader 第二阶段入口
-------kernel-------
arch/arm/kernel/head.S - ENTRY(stext) - kernel第一阶段入口
init/main.c - start_kernel() - kernel第二阶段c层函数入口
-------用户态-------
init - app_main.cpp - main() 内核启动后,用户态第一个进程的入口
-------java层-------
RuntimeInit.java - main() 一个新jvm(带有虚拟机)的java层主线程入口
ZygoteInit.java - main() init启动的从c层到java层(带有虚拟机)的framework层入口
SystemServer.java - main() java世界的Framework服务集的入口
ActivityThread.java - main() 一个新app进程的java层入口
好好背题,好好面试,好好成为多汁水,耐榨汁的人力资源制造机