博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
源码探探之startActivity(二)
阅读量:6881 次
发布时间:2019-06-27

本文共 12118 字,大约阅读时间需要 40 分钟。

源码基于API26

在上一篇中,讲到由ActivityThread启动activity了
ActivityThread即我们平时提到的主线程,上一篇中AMS处理启动activity的task和record信息后通过binder跨进程到应用当前线程继续启动activity
现在看ActivityThread的scheduleLaunchActivity()

@Override    public final void scheduleLaunchActivity(Intent intent, IBinder token, int ident,            ActivityInfo info, Configuration curConfig, Configuration overrideConfig,            CompatibilityInfo compatInfo, String referrer, IVoiceInteractor voiceInteractor,            int procState, Bundle state, PersistableBundle persistentState,            List
pendingResults, List
pendingNewIntents, boolean notResumed, boolean isForward, ProfilerInfo profilerInfo) { //更新进程状态 updateProcessState(procState, false); //创建ActivityClientRecord并赋值 ActivityClientRecord r = new ActivityClientRecord(); r.token = token; r.ident = ident; r.intent = intent; r.referrer = referrer; r.voiceInteractor = voiceInteractor; r.activityInfo = info; r.compatInfo = compatInfo; r.state = state; r.persistentState = persistentState; r.pendingResults = pendingResults; r.pendingIntents = pendingNewIntents; r.startsNotResumed = notResumed; r.isForward = isForward; r.profilerInfo = profilerInfo; r.overrideConfig = overrideConfig; updatePendingConfiguration(curConfig); //带着ActivityClientRecord由Handler启动Activity sendMessage(H.LAUNCH_ACTIVITY, r); }复制代码

接着看Handler

public void handleMessage(Message msg) {           ...        switch (msg.what) {            case LAUNCH_ACTIVITY: {                Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityStart");                //handler传递过来的ActivityClientRecord                final ActivityClientRecord r = (ActivityClientRecord) msg.obj;                //赋值LoadedApk                r.packageInfo = getPackageInfoNoCheck(                        r.activityInfo.applicationInfo, r.compatInfo);                //继续启动activity                handleLaunchActivity(r, null, "LAUNCH_ACTIVITY");                Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);            } break;复制代码

接着handleLaunchActivity()

private void handleLaunchActivity(ActivityClientRecord r, Intent customIntent, String reason) {    //跳过后台执行gc    unscheduleGcIdler();    mSomeActivitiesChanged = true;    if (r.profilerInfo != null) {        mProfiler.setProfiler(r.profilerInfo);        mProfiler.startProfiling();    }    // 确保执行最新的配置    handleConfigurationChanged(null, null);    if (localLOGV) Slog.v(        TAG, "Handling launch of " + r);    // 创建activity之前初始化WindowManagerGlobal,获取IWindowManger    WindowManagerGlobal.initialize();    //启动activity    Activity a = performLaunchActivity(r, customIntent);    //activity不为null    if (a != null) {        r.createdConfig = new Configuration(mConfiguration);        reportSizeConfigurations(r);        Bundle oldState = r.state;        //恢复activity        handleResumeActivity(r.token, false, r.isForward,                !r.activity.mFinished && !r.startsNotResumed, r.lastProcessedSeq, reason);        if (!r.activity.mFinished && r.startsNotResumed) {            performPauseActivityIfNeeded(r, reason);            //pre-Honeycomb apps需要保存初始状态以便再次创建            if (r.isPreHoneycomb()) {                r.state = oldState;            }        }    } else {        //不管什么原因出错调用AMS销毁activity        try {            ActivityManager.getService()                .finishActivity(r.token, Activity.RESULT_CANCELED, null,                        Activity.DONT_FINISH_TASK_WITH_ACTIVITY);        } catch (RemoteException ex) {            throw ex.rethrowFromSystemServer();        }    }}复制代码

接着performLaunchActivity()

private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {    //LoadedApk检验    ActivityInfo aInfo = r.activityInfo;    if (r.packageInfo == null) {        r.packageInfo = getPackageInfo(aInfo.applicationInfo, r.compatInfo,                Context.CONTEXT_INCLUDE_CODE);    }    //component检验    ComponentName component = r.intent.getComponent();    if (component == null) {        component = r.intent.resolveActivity(            mInitialApplication.getPackageManager());        r.intent.setComponent(component);    }    //原activity不为空可新建component    if (r.activityInfo.targetActivity != null) {        component = new ComponentName(r.activityInfo.packageName,                r.activityInfo.targetActivity);    }    //创建contextImpl    ContextImpl appContext = createBaseContextForActivity(r);    Activity activity = null;    try {        java.lang.ClassLoader cl = appContext.getClassLoader();        //通过Instrumentation创建activity实例        activity = mInstrumentation.newActivity(                cl, component.getClassName(), r.intent);        StrictMode.incrementExpectedActivityCount(activity.getClass());        r.intent.setExtrasClassLoader(cl);        r.intent.prepareToEnterProcess();        if (r.state != null) {            r.state.setClassLoader(cl);        }    } catch (Exception e) {        if (!mInstrumentation.onException(activity, e)) {            throw new RuntimeException(                "Unable to instantiate activity " + component                + ": " + e.toString(), e);        }    }    try {        //创建我们亲爱的application        Application app = r.packageInfo.makeApplication(false, mInstrumentation);        if (localLOGV) Slog.v(TAG, "Performing launch of " + r);        if (localLOGV) Slog.v(                TAG, r + ": app=" + app                + ", appName=" + app.getPackageName()                + ", pkg=" + r.packageInfo.getPackageName()                + ", comp=" + r.intent.getComponent().toShortString()                + ", dir=" + r.packageInfo.getAppDir());        if (activity != null) {            //加载label            CharSequence title = r.activityInfo.loadLabel(appContext.getPackageManager());            Configuration config = new Configuration(mCompatConfiguration);            if (r.overrideConfig != null) {                config.updateFrom(r.overrideConfig);            }            if (DEBUG_CONFIGURATION) Slog.v(TAG, "Launching activity "                    + r.activityInfo.name + " with config " + config);            Window window = null;            if (r.mPendingRemoveWindow != null && r.mPreserveWindow) {                window = r.mPendingRemoveWindow;                r.mPendingRemoveWindow = null;                r.mPendingRemoveWindowManager = null;            }            //context表示为activity            appContext.setOuterContext(activity);            //准备好了吗我们的activity来了            activity.attach(appContext, this, getInstrumentation(), r.token,                    r.ident, app, r.intent, r.activityInfo, title, r.parent,                    r.embeddedID, r.lastNonConfigurationInstances, config,                    r.referrer, r.voiceInteractor, window, r.configCallback);            if (customIntent != null) {                activity.mIntent = customIntent;            }            r.lastNonConfigurationInstances = null;            checkAndBlockForNetworkAccess();            activity.mStartedActivity = false;            int theme = r.activityInfo.getThemeResource();            //设置主题            if (theme != 0) {                activity.setTheme(theme);            }            activity.mCalled = false;            //activity已启动执行onCreate()了            if (r.isPersistable()) {                mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);            } else {                mInstrumentation.callActivityOnCreate(activity, r.state);            }            if (!activity.mCalled) {                throw new SuperNotCalledException(                    "Activity " + r.intent.getComponent().toShortString() +                    " did not call through to super.onCreate()");            }            r.activity = activity;            r.stopped = true;            //没有关闭就要执行onStart()了            if (!r.activity.mFinished) {                activity.performStart();                r.stopped = false;            }            if (!r.activity.mFinished) {                //执行onRestoreInstanceState()                if (r.isPersistable()) {                    if (r.state != null || r.persistentState != null) {                        mInstrumentation.callActivityOnRestoreInstanceState(activity, r.state,                                r.persistentState);                    }                } else if (r.state != null) {                    mInstrumentation.callActivityOnRestoreInstanceState(activity, r.state);                }            }            //没有finish()执行onPostCreate()            if (!r.activity.mFinished) {                activity.mCalled = false;                if (r.isPersistable()) {                    mInstrumentation.callActivityOnPostCreate(activity, r.state,                            r.persistentState);                } else {                    mInstrumentation.callActivityOnPostCreate(activity, r.state);                }                if (!activity.mCalled) {                    throw new SuperNotCalledException(                        "Activity " + r.intent.getComponent().toShortString() +                        " did not call through to super.onPostCreate()");                }            }        }        r.paused = true;        mActivities.put(r.token, r);    } catch (SuperNotCalledException e) {        throw e;    } catch (Exception e) {        if (!mInstrumentation.onException(activity, e)) {            throw new RuntimeException(                "Unable to start activity " + component                + ": " + e.toString(), e);        }    }    return activity;}复制代码

系不系上面这个方法有点长了,但是很显然是我们开发平时接触很近的方法了

再看看attach()

//主要是给我们activity赋一大堆值final void attach(Context context, ActivityThread aThread,        Instrumentation instr, IBinder token, int ident,        Application application, Intent intent, ActivityInfo info,        CharSequence title, Activity parent, String id,        NonConfigurationInstances lastNonConfigurationInstances,        Configuration config, String referrer, IVoiceInteractor voiceInteractor,        Window window, ActivityConfigCallback activityConfigCallback) {    attachBaseContext(context);    mFragments.attachHost(null /*parent*/);    //window创建并赋值    mWindow = new PhoneWindow(this, window, activityConfigCallback);    mWindow.setWindowControllerCallback(this);    mWindow.setCallback(this);    mWindow.setOnWindowDismissedCallback(this);    mWindow.getLayoutInflater().setPrivateFactory(this);    if (info.softInputMode != WindowManager.LayoutParams.SOFT_INPUT_STATE_UNSPECIFIED) {        mWindow.setSoftInputMode(info.softInputMode);    }    if (info.uiOptions != 0) {        mWindow.setUiOptions(info.uiOptions);    }    //看见没这就是uiThread    mUiThread = Thread.currentThread();    //主线程为ActivityThread    mMainThread = aThread;    //原来这货再这赋值的每一个activity都有这个监控类    mInstrumentation = instr;    mToken = token;    mIdent = ident;    mApplication = application;    mIntent = intent;    mReferrer = referrer;    mComponent = intent.getComponent();    mActivityInfo = info;    mTitle = title;    mParent = parent;    mEmbeddedID = id;    mLastNonConfigurationInstances = lastNonConfigurationInstances;    if (voiceInteractor != null) {        if (lastNonConfigurationInstances != null) {            mVoiceInteractor = lastNonConfigurationInstances.voiceInteractor;        } else {            mVoiceInteractor = new VoiceInteractor(voiceInteractor, this, this,                    Looper.myLooper());        }    }    mWindow.setWindowManager(            (WindowManager)context.getSystemService(Context.WINDOW_SERVICE),            mToken, mComponent.flattenToString(),            (info.flags & ActivityInfo.FLAG_HARDWARE_ACCELERATED) != 0);    if (mParent != null) {        mWindow.setContainer(mParent.getWindow());    }    mWindowManager = mWindow.getWindowManager();    mCurrentConfig = config;    mWindow.setColorMode(info.colorMode);}复制代码

还要问我activity启动了没有吗,我说没有

scheduleLaunchActivity()、handleLaunchActivity()、performLaunchActivity()

将activity的相关信息淋漓尽致的展现,没事多看看,我还没专研细致的方法呢。

转载地址:http://rzfbl.baihongyu.com/

你可能感兴趣的文章
【python3.5】安装lxml中没有etree模块的问题解决方法
查看>>
pgpool-II的性能缺陷
查看>>
spin_lock浅析【转】
查看>>
MVC前台Post/Get异步获得数据时参数的取值问题
查看>>
8086/8088指令详解
查看>>
iOS:自定义代码块{ }
查看>>
C# 远程链接指定计算机,获取该计算机的计算机名等信息
查看>>
OpenGL入门笔记(十一)
查看>>
windowsXP用户被禁用导致不能网站登录
查看>>
第 8 章 TokyoCabinet/Tyrant
查看>>
智慧城市逐步推进 未来城市建设突破口分析
查看>>
是谁在推动路由器智能连接功能的普及?
查看>>
物联网软件更新政策不明 智能冰箱也易沦为犯罪工具
查看>>
基于 SaaS 解决库存问题, Nextail 获 160 万美元融资
查看>>
Windows 10新版可以更新了!这些新功能值得升级
查看>>
《微信公众平台开发最佳实践》——2.2 微信开发者中心
查看>>
《IPv6精髓(第2版)》——1.4 常见误解
查看>>
《精通ArcGIS Server 应用与开发》——2.2 ArcGIS Server架构
查看>>
《UNIX网络编程 卷1:套接字联网API(第3版)》——2.10 TCP端口号与并发服务器...
查看>>
Centrifugo —— 用 Golang 实现的实时消息通信平台
查看>>