Android_Binder startAcitivity的Binder过程

以  startActivity(newIntent);  为例


路径  frameworks/base/core/java/android/app/Activity.java

@Override
    public void startActivity(Intent intent, @Nullable Bundle options) {
        if (options != null) {
            startActivityForResult(intent, -1, options);
        } else {
            // Note we want to go through this call for compatibility with
            // applications that may have overridden the method.
            startActivityForResult(intent, -1);
        }
    }

调用    mInstrumentation.execStartActivity

 public void startActivityForResult(@RequiresPermission Intent intent, int requestCode,
            @Nullable Bundle options) {
        if (mParent == null) {
            options = transferSpringboardActivityOptions(options);
            Instrumentation.ActivityResult ar =
                mInstrumentation.execStartActivity(
                    this, mMainThread.getApplicationThread(), mToken, this,
                    intent, requestCode, options);
            ...
    }

mMainThread.getApplicationThread()实现为 

路径  frameworks/base/core/java/android/app/ActivityThread.java 

public ApplicationThread getApplicationThread()
    {
        return mAppThread;
    }

final ApplicationThread mAppThread = new ApplicationThread();

private class ApplicationThread extends IApplicationThread.Stub

 实际上这也是一个binder通信类 把这个传过去 就实现了binder的双向通信


路径  frameworks/base/core/java/android/app/Instrumentation.java

调用  ActivityManager.getService().startActivity

public ActivityResult execStartActivity(
            Context who, IBinder contextThread, IBinder token, Activity target,
            Intent intent, int requestCode, Bundle options) {
        IApplicationThread whoThread = (IApplicationThread) contextThread;
        ...
            int result = ActivityManager.getService()
                .startActivity(whoThread, who.getBasePackageName(), intent,
                        intent.resolveTypeIfNeeded(who.getContentResolver()),
                        token, target != null ? target.mEmbeddedID : null,
                        requestCode, 0, null, options);
            checkStartActivityResult(result, intent);
        } catch (RemoteException e) {
            throw new RuntimeException("Failure from system", e);
        }
        return null;
    }

路径  frameworks/base/core/java/android/app/ActivityManager.java

public static final String ACTIVITY_SERVICE = "activity";

public static IActivityManager getService() {
        return IActivityManagerSingleton.get();
    }

    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;
                }
            };

关于服务何时被add到ServiceManager中的可以参考这篇

android8.1启动过程(八) SystemServer 下_we1less的博客-CSDN博客

上一篇:互联网寒冬公司倒闭后,Android面试题库


下一篇:Android跨进程传大图思考及实现——附上原理分析