Context 和 Activity 之 startActivity() 方法的区别

Activity 继承自 ContextThemeWrapper 和 ContextWrapper,基类是 Context,重写了 ContextWrapper 的 startActivity()。

1,Activity 的 startActivity() 方法,通过 Instrumentation 类,执行 IActivityTaskManager 的startActivity() 方法。

ActivityTaskManager.getService().startActivity()

2,Context 的 startActivity() 抽象方法。

public abstract void startActivity(@RequiresPermission Intent intent);

在 ContextImpl 实现类。

@Override
public void startActivity(Intent intent, Bundle options) {
    warnIfCallingFromSystemProcess();
    final int targetSdkVersion = getApplicationInfo().targetSdkVersion;

     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?");
    }
    mMainThread.getInstrumentation().execStartActivity(
                getOuterContext(), mMainThread.getApplicationThread(), null,
                (Activity) null, intent, -1, options);
}

查询 Intent 是否存在 flag: FLAG_ACTIVITY_NEW_TASK,否则报出异常。

当 Service 或者 BroadcastReceiver 调用 startActivity() 方法时,二者未重写此方法,调用
ContextWrapper 的 startActivity() 方法 。

@Override
public void startActivity(Intent intent) {
    mBase.startActivity(intent);
}

即调用 ContextImpl 类启动方法 。


任重而道远

你可能感兴趣的:(Context 和 Activity 之 startActivity() 方法的区别)