#Context家族史
Context其实是一个抽象类是连接ContentImpl与Context甚至Activity的桥梁 这里贴出简化或者伪代码,为了能够简洁的看到各类之间的关系:
abstract class Context{
abstract void startActivity();
abstract Looper getMainLooper();
}
这里就会涉及到Instrumentation中的execStartActivity方法,它能够帮助我们启动activity
class ContextImpl extends Context{
final @NonNull ActivityThread mMainThread;
@Override
void startActivity() {
// ...
mMainThread.getInstrumentation().execStartActivity(
getOuterContext(), mMainThread.getApplicationThread(), null,
(Activity) null, intent, -1, options);
}
@Override
Looper getMainLooper() {
return mMainThread.getLooper();
}
}
ContextWrapper只是一个包装类,没有任何具体的实现,真正的逻辑都在ContextImpl里面
class ContextWrapper extends Context{
Context mBase;
public ContextWrapper(Context context){
this.mBase = context;
}
@Override
void startActivity() {
mBase.startActivity();
}
@Override
Looper getMainLooper() {
return mBase.getMainLooper();
}
}
只是一层包装类,包含着Theme信息
class ContextThemeWrapper extends ContextWrapper{
public ContextThemeWrapper() {
super(null);
}
}
很熟悉,不用多介绍了
class Activity extends ContextThemeWrapper{
public void startActivity(){
this.startActivity();
}
}
ActivityThread
接下来再站在AIDL角度看看ActivityThread:
每次都是ApplicationThread通过进程间通信获取到内容,然后执行ActivityThread的sendMessage方法,在这个方法中,把消息拼装一下,然后扔给H的swicth语句去分析,来决定要执行ActivityThread的那个方法
public final class ActivityThread{
final Looper mLooper = Looper.myLooper();
public Looper getLooper() {
return mLooper;
}
public Instrumentation getInstrumentation()
{
return mInstrumentation;
}
private void handlebindService(BindServiceData data) {
ActivityManager.getService().publishService(data.token, data.intent, binder);
}
// ...其他三大进程
private class ApplicationThread extends IApplicationThread.Stub {
public final void scheduleBindService(IBinder token, Intent intent,
boolean rebind, int processState) {
...
BindServiceData s = new BindServiceData();
sendMessage(H.BIND_SERVICE, s);
}
// ...其他三大进程
}
class H extends Handler {
public static final int BIND_APPLICATION = 110;
public void handleMessage(Message msg) {
switch (msg.what) {
case BIND_APPLICATION:
handlebindService(data);
break;
// ...
}
}
}
}
如果了解AIDL或者Binder模型,可以知道ApplicationThread其实就是Server端的Stub
ActivityManager负责新ActivityThread进程创建,Activity生命周期的维护,是与系统所有正在运行着的Acitivity进行交互,对系统所有运行中的Activity相关信息(Task,Memory,Service,App等)进行管理和维护;提供了相应的接口用于获取这些信息
class ActivityManager{
private static final Singleton<IActivityManager> IActivityManagerSingleton =
new Singleton<IActivityManager>() {
@Override
protected IActivityManager create() {
final IBinder b = ServiceManager.getService(Context.ACTIVITY_SERVICE);
final IActivityManager am = IActivityManager.Stub.asInterface(b);
return am;
}
};
public static IActivityManager getService() {
return IActivityManagerSingleton.get();
}
}