activity启动流程分析

activity启动流程分析

1.相关代码文件路径:

\frameworks\base\core\java\android\app\ContextImpl.java

\frameworks\base\core\java\android\app\ActivityThread.java

\frameworks\base\core\java\android\app\Instrumentation.java

\frameworks\base\core\java\android\app\ActivityManager.java

\frameworks\base\services\core\java\com\android\server\am\ActivityStartController.java

\frameworks\base\services\core\java\com\android\server\am\ActivityStarter.java

\frameworks\base\core\java\android\app\ClientTransactionHandler.java

\frameworks\base\core\java\android\app\servertransaction\ClientTransaction.java

\frameworks\base\core\java\android\app\servertransaction\LaunchActivityItem.java

\frameworks\base\core\java\android\app\servertransaction\ResumeActivityItem.java

 

2.流程图如下:

1.1.contentImpl部分:

StartActivity中检查了flag合理性,后进入到Instrumentation中:

@Override
public void startActivity(Intent intent, Bundle options) {
    //系统用户拉起activity没有指定user会打印警告信息
    warnIfCallingFromSystemProcess();
    final int targetSdkVersion = getApplicationInfo().targetSdkVersion;
    //必须添加FLAG_ACTIVITY_NEW_TASK
    if ((intent.getFlags() & Intent.FLAG_ACTIVITY_NEW_TASK) == 0
            && (targetSdkVersion < Build.VERSION_CODES.N
                    || targetSdkVersion >= Build.VERSION_CODES.P)
            && (options == null
                    || ActivityOptions.fromBundle(options).getLaunchTaskId() == -1)) {
        throw new AndroidRuntimeException(
                "Calling startActivity() from outside of an Activity "
                        + " context requires the FLAG_ACTIVITY_NEW_TASK flag."
                        + " Is this really what you want?");
    }
    //进入instrumentation
    mMainThread.getInstrumentation().execStartActivity(
            getOuterContext(), mMainThread.getApplicationThread(), null,
            (Activity) null, intent, -1, options);
}

1.2 Instrumentation部分

public ActivityResult execStartActivity(
        Context who, IBinder contextThread, IBinder token, Activity target,
        Intent intent, int requestCode, Bundle options) {
    IApplicationThread whoThread = (IApplicationThread) contextThread;
    Uri referrer = target != null ? target.onProvideReferrer() : null;
    if (referrer != null) {
        intent.putExtra(Intent.EXTRA_REFERRER, referrer);
    }
    //省略mActivityMonitors处理,未见其初始化与向列表中插入数据调用
    try {
        intent.migrateExtraStreamToClipData();
        intent.prepareToLeaveProcess(who);
        //进入远程服务拉起activity
        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;
}

1.3 ActivityManager 部分

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

1.4 ActivityManagerService 部分

public final int startActivityAsUser(IApplicationThread caller, String callingPackage,
        Inten
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值