美文网首页
Context 和 Activity 之 startActivi

Context 和 Activity 之 startActivi

作者: gczxbb | 来源:发表于2021-07-31 18:26 被阅读0次

    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 之 startActivi

          本文链接:https://www.haomeiwen.com/subject/gstudltx.html