simple android

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层入口

好好背题,好好面试,好好成为多汁水,耐榨汁的人力资源制造机

猜你喜欢

转载自www.cnblogs.com/cyy12/p/12160830.html