Android四大组件的启动

四大组件的启动

Activity的启动

1.startActivity
  • 通常使用startActivity函数来启动一个Activity
public void startActivity(Intent intent) {
	this.startActivity(intent ,null);
}

public void startActivity(Intent intent, @Nullable Bundle options) {
	...
	if (options != null) {
		startActivityForResult(intent, -1, options);
	else {
		startActivityForResult(intent, -1);
	}
}

pulic void startActivityForResult(Intent intent, int requestCode) {
	startActivityForResult(intent, requestCode, null);
}
2.startActivityForResult
public void startActivityForResult(Intent intent, int requestCode, Bundle options) {
	if (mParent == null) { // 应用第一次创建Activity, 此时不存在父类的Activity
		options = transferSpringboardActivityOptions(options);
		Instrumenttation.execStartActivity(this, mMainTread.getApplicationThread(), mToken, this, intent, requestCode, options);
	else {
		if (options != null) {
			mParents.startActivityFromChild(this, intent, requestCode, options);
		} else {
			mParents.startActivityFromChidl(this, intent, requestCode);
		}
	}
3.Instrumentation.execStartActivity
  • 这个工具类用来监视应用进程和系统交互的,调用该方法,其内部实际调用了ActivityTaskManager.getService().startActivity函数,这个类是在SystemServer里面的,看到这个进程,就知道这是个系统级别的东西,很重要
public ActivityResult execStartActivity(Context who, IBinder contextThread, IBinder token, Activity tartget, Intent intent, Int requestCode, Bundle otions) {
	IApplicationTread whoThread = (IApplicationThread) contextThread;
	...
	try {
		int result = ActivityTaskManager.getService().startActivity(.......);
	} catch (RemoteException e) {
	.......
	return null;
}
4.ATMS.startActivity
  • ATMS就是ActivityTaskManagerService
  • 类似的ConnectivityManager, ConnectivityService, 都是在Manager中定义一堆接口,然后在service中是具体的实现
pulic int startActivityAsUser(......) {
	return startActivityAsUser(........, UserHandle.getCallingUserId());
}
  • 这个函数的作用就是检查包名和userId是否一致等安全权限问题
pulic int startActivityAsUser(........., int userId) {
	return startActivityAsUser(..........,userId, true);
}

pulic int startActivityAsUser(........., int userId, boolean validateIncomingUser) {
	asserPackageMatchesCallingUid(callingPackage);
	enforceNotIsolatedCaller("startActivityAsUser");
	// 上面两个是一堆检查,没什么必要了解
	return getActivityStartController().obtainStarter(intent, "startActivityAsUser")
		.setCaller(caller)
		.setCallingPackage(callingPackage)
		.setCallingFeatureId(callingFeatureId)
		..........
		.setUser(userId)
		.execute();
}
5.ActivityStarter.execute
  • execute -> executRequest
  • 因为内部代码比较复杂,这里就不放,总之干了一件事,把上面含有一堆信息Build出的对象,封装成了一个ActivityRecord 对象,然后调用它的startActivityUnchecked方法
pulic int startActivityUnchecked(.........) {
	int result = START_CANCELED;
	..........
	result = startActivityInner(.......);
	.........
	return result;
}

int startActivityInner(...........) {
	.......

	mRootWindowContainer.resumeFocusedStacksTopActivities(......)

	return START_SUCCESS;
}
6.中间的一系列省略掉,最后调用了Activity.performCreate
final void performCreate(Bundle icicle, PersistableBundle persistentState) {
    dispatchActivityPreCreated(icicle);
    mCanEnterPictureInPicture = true;
    // initialize mIsInMultiWindowMode and mIsInPictureInPictureMode before onCreate
    final int windowingMode = getResources().getConfiguration().windowConfiguration
            .getWindowingMode();
    mIsInMultiWindowMode = inMultiWindowMode(windowingMode);
    mIsInPictureInPictureMode = windowingMode == WINDOWING_MODE_PINNED;
    restoreHasCurrentPermissionRequest(icicle);
    if (persistentState != null) {
        onCreate(icicle, persistentState);
    } else {
        onCreate(icicle);
    }
    EventLogTags.writeWmOnCreateCalled(mIdent, getComponentName().getClassName(),
            "performCreate");
    mActivityTransitionState.readState(icicle);

    mVisibleFromClient = !mWindow.getWindowStyle().getBoolean(
            com.android.internal.R.styleable.Window_windowNoDisplay, false);
    mFragments.dispatchActivityCreated();
    mActivityTransitionState.setEnterActivityOptions(this, getActivityOptions());
    dispatchActivityPostCreated(icicle);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值