Android_Binder startAcitivity的Binder过程

2021/9/23 23:12:34

本文主要是介绍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_Binder startAcitivity的Binder过程的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程