Android:Context家族史

382 阅读2分钟

image.png

#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 image.png 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();
    }

}

参考:写给Android App开发人员看的Android底层知识