Android的activity启动的过程(一)

个人理解,如若有误,欢迎指正


Instrumentation.callActivityOnCreate(Activity, Bundle) line: 1047    

ActivityThread.performLaunchActivity(ActivityThread$ActivityRecord, Intent) line: 2459    
ActivityThread.handleLaunchActivity(ActivityThread$ActivityRecord, Intent) line: 2512    
ActivityThread.access$2200(ActivityThread, ActivityThread$ActivityRecord, Intent) line: 119    
ActivityThread$H.handleMessage(Message) line: 1863    
ActivityThread$H(Handler).dispatchMessage(Message) line: 99    
Looper.loop() line: 123    
ActivityThread.main(String[]) line: 4363    
Method.invokeNative(Object, Object[], Class, Class[], Class, int, boolean) line: not available [native method]    
Method.invoke(Object, Object...) line: 521    
ZygoteInit$MethodAndArgsCaller.run() line: 860    
ZygoteInit.main(String[]) line: 618    

NativeStart.main(String[]) line: not available [native method]    


由于在   ActivityThread.main(String[]) line: 4363    下面的为c++代码,是整个Zygote进程的启动和初始化,还有一些android虚拟机dalvik的加载的部分,这里就不做分析了。。。。。。。本文的主要目的是分析activity的启动过程。


首先,在android源代码的 frameworks.base.core.java.android.app 的文件夹下,有一个ActivityThread的类。。。。。。。。在这个类的最底部,我们可以发现一个main函数

  public static final void main(String[] args) {
        SamplingProfilerIntegration.start();

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

        Looper.prepareMainLooper();
        if (sMainThreadHandler == null) {
            sMainThreadHandler = new Handler();
        }

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

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

        Looper.loop();

        if (Process.supportsProcesses()) {
            throw new RuntimeException("Main thread loop unexpectedly exited");
        }

        thread.detach();
        String name = (thread.mInitialApplication != null)
            ? thread.mInitialApplication.getPackageName()
            : "<unknown>";
        Slog.i(TAG, "Main thread of " + name + " is now exiting");
    }
}

每个应用程序都以ActivityThread.main()为入口进入到消息循环处理。对于一个进程来讲,我们需要这个闭合的处理框架。


进入到Looper类中的loop函数,我们可以看到一个无限循环。在循环中可以发现一个Message的队列。每一个message的处理是通过 msg.target.dispatchMessage(msg);来派遣消息完成的。在dispatchMessage的函数里,消息的具体完成则是通过那些实现了interface Callback的类去重写public boolean handleMessage(Message msg);。。。。。。例如:在ActivityThread里我们就可以发现一个继承于Handle类的内部类H( private final class H extends Handler ),它就实现了一个handleMessage的方法。。。。。在这里我们就看到了有关Activity的所有操作

  case LAUNCH_ACTIVITY: {
                    ActivityClientRecord r = (ActivityClientRecord)msg.obj;


                    r.packageInfo = getPackageInfoNoCheck(
                            r.activityInfo.applicationInfo);
                    handleLaunchActivity(r, null);
                } break;
                case RELAUNCH_ACTIVITY: {
                   。。。
                } break;
                case PAUSE_ACTIVITY:
                   。。。
                    break;
                case PAUSE_ACTIVITY_FINISHING:
                   。。。
                    break;
                case STOP_ACTIVITY_SHOW:
                   。。。
                    break;
                case STOP_ACTIVITY_HIDE:
                    。。。
                    break;
                case SHOW_WINDOW:
                   。。。
                    break;
                case HIDE_WINDOW:
                   。。。
                    break;
                case RESUME_ACTIVITY:
                   。。。
                    break;
                case SEND_RESULT:
                    。。。
                    break;
                case DESTROY_ACTIVITY:
                    。。。
                    break;
                case BIND_APPLICATION:
                    。。。
                    break;
                case EXIT_APPLICATION:
                    。。。
                    break;
                case NEW_INTENT:
                   。。。
                    break;
                case RECEIVER:
                   。。。
                    break;
                case CREATE_SERVICE:
                   。。。
                    break;
                case BIND_SERVICE:
                   。。。
                    break;
                case UNBIND_SERVICE:
                   。。。
                    break;
                case SERVICE_ARGS:
                   。。。
                    break;
                case STOP_SERVICE:
                   。。。
                    break;
                case REQUEST_THUMBNAIL:
                   。。。
                    break;
                case CONFIGURATION_CHANGED:
                    。。。
                    break;
                case CLEAN_UP_CONTEXT:
                   。。。
                    break;
                case GC_WHEN_IDLE:
                   。。。
                    break;
                case DUMP_SERVICE:
                   。。。
                    break;
                case LOW_MEMORY:
                   。。。
                    break;
                case ACTIVITY_CONFIGURATION_CHANGED:
                   。。。
                    break;
                case PROFILER_CONTROL:
                   。。。
                    break;
                case CREATE_BACKUP_AGENT:
                   。。。
                    break;
                case DESTROY_BACKUP_AGENT:
                   。。。
                    break;
                case SUICIDE:
                   。。。
                    break;
                case REMOVE_PROVIDER:
                   。。。
                    break;
                case ENABLE_JIT:
                   。。。
                    break;
                case DISPATCH_PACKAGE_BROADCAST:
                   。。。
                    break;
                case SCHEDULE_CRASH:
                    throw new RemoteServiceException((String)msg.obj);


这样,整个世界都明亮了!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值