四大组件之Activity

四大组件之首Activity,联系图形界面和用户的交互,分下一下启动初始化的过程。

先将调用栈打印出来:在onCreate里执行

Log.d(TAG,Log.getStackTraceString(new Throwable()));

打印出如下的Log,从Lanunch启动Activity。

06-25 13:15:56.485 22075-22075/com.xue.qin.demo.onkeydowntest D/MainActivity: java.lang.Throwable
                                                                                  at com.xue.qin.demo.onkeydowntest.MainActivity.onCreate(MainActivity.java:50)
                                                                                  at android.app.Activity.performCreate(Activity.java:6270)
                                                                                  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1113)
                                                                                  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2500)
                                                                                  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2613)
                                                                                  at android.app.ActivityThread.-wrap11(ActivityThread.java)
                                                                                  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1469)
                                                                                  at android.os.Handler.dispatchMessage(Handler.java:111)
                                                                                  at android.os.Looper.loop(Looper.java:207)
                                                                                  at android.app.ActivityThread.main(ActivityThread.java:5692)
                                                                                  at java.lang.reflect.Method.invoke(Native Method)
                                                                                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:908)
                                                                                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:769)


最下面的三行代码就不去分析了,倒数第四行log启动了一个应用线程 android.app.ActivityThread.main 这就是当前的应用的界面刷新线程。继续看调用栈,调用loop当前的主线程的looper启动循环,之后的逻辑大概是看到Handler收到一个信息,然后开始执行handleLaunchActivity(),performLaunActivity(),preformCreate(),onCreate()等函数,在ActivityThread,和Activity中很容易找到这些函数调用。

分析到这,有一个节点就是哪里传递进入的这个消息来创建,分析一下这个节点。OK从程序入口Main()函数开始。看一下做了什么

ActivityThread.java

public static void main(String[] args) {
        Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "ActivityThreadMain");
        SamplingProfilerIntegration.start();

        // CloseGuard defaults to true and can be quite spammy.  We
        // disable it here, but selectively enable it later (via
        // StrictMode) on debug builds, but using DropBox, not logs.
        CloseGuard.setEnabled(false);

        Environment.initForCurrentUser();

        // Set the reporter for event logging in libcore
        EventLogger.setReporter(new EventLoggingReporter());

        // Make sure TrustedCertificateStore looks in the right place for CA certificates
        final File configDir = Environment.getUserConfigDirectory(UserHandle.myUserId());
        TrustedCertificateStore.setDefaultUserDirectory(configDir);

        Process.setArgV0("<pre-initialized>");

        Looper.prepareMainLooper();

        ActivityThread thread = new ActivityThread();
        thread.attach(false);

        if (sMainThreadHandler == null) {
            sMainThreadHandler = thread.getHandler();
        }

        if (false) {
            Looper.myLooper().setMessageLogging(new
                    LogPrinter(Log.DEBUG, "ActivityThread"));
        }

        // End of event ActivityThreadMain.
        Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
        Looper.loop();

        throw new RuntimeException("Main thread loop unexpectedly exited");
    }

可以看出,创建一个主线程Looper,并loop起来,其间还创建了一个ActivityThread对象,并且调用attach()方法。在这个方法中

ActivityThread.java中的attach()方法,

final IActivityManager mgr = ActivityManagerNative.getDefault();
            try {
                mgr.attachApplication(mAppThread);
            } catch (RemoteException ex) {
                throw ex.rethrowFromSystemServer();
            }

代码中没mAppThread是ActivitityThread类中直接new出来的对象,其实就是个Binder,可以在进程间通信。

这段代码需要很好的分析,因为它初始化了很多Activity启动必须的东西。都是Binder通信,如果熟悉AIDL的java代码,虽不知道BInder具体原理,但也能猜个差不多,具体怎么通信就不管了,直接上结果。

这段中第一句获得一个IActivityManager 这个东西一看就是个进程间通信的接口,这个getDefault()其实就是获得系统Service,代码看一下就可以。这个系统Service的代码在ActivityManagerService 这个类,继承自 ActivityManagerNative ,上面的调用于是就变成了,

ActivityManagerService .java

调用过程

attachApplication()

attachApplicationLocked()


ActivityThread.java 内部类ApplicationThread

bindApplication()----->sendMessage(H.BIND_APPLICATION, data); H就是处理生命周期的那个一个Handler它的Looper就是刚才main中创建的主线程looper

在H中的处理如下

 case BIND_APPLICATION:
                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "bindApplication");
                    AppBindData data = (AppBindData)msg.obj;
                    handleBindApplication(data);
                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
                    break;

handleBindApplication中创建了mInstrumentation这个对象。Instrumentation根据注释来说这个类是建立系统与Application之间的桥梁这个意思吧。


分析到这里还是没有看到需要H处理的LAUNCH_ACTIVITY 这个消息。从哪里启动也好,从Launch启动,Launch是系统App,也是通过startAcitvity来启动的。从StartActivy来看一下

Activity.java

startActivity()

startActivityForResult()代码如下使用。

Instrumentation.ActivityResult ar =
                mInstrumentation.execStartActivity(
                    this, mMainThread.getApplicationThread(), mToken, this,
                    intent, requestCode, options);

看一下这个方法

Instrumentation.java

execStartActivity()

 int result = ActivityManagerNative.getDefault()
                .startActivity(whoThread, who.getBasePackageName(), intent,
                        intent.resolveTypeIfNeeded(who.getContentResolver()),
                        token, target != null ? target.mEmbeddedID : null,
                        requestCode, 0, null, options);

又来获取系统AcitivityManagerService来启动Activity

startActivity()

startActivityAsUser()

ActivityStarter.java

startActivityMayWait()

startActivityLocked()

startActivityUnchecked()

ActivityStackSupervisor.java

resumeFocusedStackTopActivityLocked()管理栈顶

ActivityStack.java

resumeTopActivityUncheckedLocked()

resumeTopActivityInnerLocked()

startSpecificActivityLocked.java

startSpecificActivityLocked()

realStartActivityLocked()

ActivityThread$ApplicationThread

scheduleLaunchActivity()

sendMessage(H.LAUNCH_ACTIVITY, r);  //这里发送了这个message,来启动Activity,之后就进入了Activity的生命周期,生命周期的回调函数都在H这个handler中调用。代码就很好理解了不分析了。


转载一张图,博客地址点击打开链 7.0的源码和书上的5.0是不一样的。









  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值