Android Activity启动(一) Application创建的过程以及原理分析

      从这篇博客开始,总结一下我之前学到的一些东西,我准备按照Activity、Service、BroadcastReceiver、ContentProvider等的顺序,整理四大组件的启动过程,在写文章的过程中,当讲到某一个点的时候,如果我觉得这个点可能在面试过程中会遇到,或者说我见到过可以用该知识点当做答案的一些面试题,我就会把这个点用特殊颜色标注,或者特殊说明一下,在以后的博客中也会遵循这个原则,本人菜鸟一个,如有说错的地方,欢迎批评指正。

      关于Activity的启动相关的博客,我准备采用由近及远的方式,分为四篇来描述,在平时的开发过程中,遇到的最多的东西,我会首先讲解,我大体规划了一下,分为以下三篇,(1) Application的创建过程 (因为在首次启动应用,创建首页Activity的时候,会先创建Application,个人认为Application的创建也属于过程中的一部分,所以把这块单独抽出讲一下) (2) 在app内部,从一个Activity跳转到另一个Activity相关的Activity的创建过程  (3) 点击桌面app图标,首次进入app的时候,Activity的创建过程 (我估计看完之后应该有种恍然大明白的感觉~_~)   

下面开始第一篇, Application的创建过程。

      整个android应用启动的入口应该是ActivityThread中的main()方法,具体是什么时候调用的,我会在下一篇整理Activity启动过程的时候说一下,本篇文章中就先提一下,而Application的创建也是在这个main()方法中,下面我们来看下main()方法的代码,我用的sdk的版本是26

public static void main(String[] args) {

        ......
        
        //创建一个主线程的Looper
        Looper.prepareMainLooper();

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

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

        ......

        Looper.loop();

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

我们可以看到,在上述代码的第6行通过Looper.prepareMainLooper()方法创建了一个主线程的Looper,第17行代码中通过Looper.loop()方法开启了一个消息循环,我们平时候所发送的一些消息都是在这个Looper中去处理的,在上述代码的第8行创建了一个ActivityThread的对象,第9行调用了ActivityThread的attach()方法,Application也是在这个attach()方法中创建的,我们来看下attach()方法的代码

private void attach(boolean system) {
        
        ......

        if (!system) {
            
            ......

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

        } else {
            
            ......

        }

        ......        

}

上述代码中省略了一些不重要的代码,我们来看上述代码的第9行,通过ActivityManager.getService()方法获得了一个IActivityManager引用,其实这个引用代表的就是ActivityManagerService,我们来看下ActivityManager.getService()的代码

public static IActivityManager getService() {
        return IActivityManagerSingleton.get();
}

private static final Singleton<IActivityManager> IActivityManagerSingleton =
    new Singleton<IActivityManager>() {
        @Override
        protected IActivityManager create() {
            final IBinder b = ServiceManager.getService(Context.ACTIVITY_SERVICE);
            final IActivityManager am = IActivityManager.Stub.asInterface(b);
            return am;
        }
};

我们可以很清楚的看到,我们最终通过ServiceManager.getService()获得了一个IBinder引用,这个IBinder引用其实就是ActivityManagerService的引用,然后转换成了一个IActivityManager的引用,我们通过ActivityManager.getService()最终获得的也是这个引用,为什么ServiceManager.getService()获得的是一个ActivityManagerService的引用呢,这里简单提一下,在SystemServer中会调用ActivityManagerService的setSystemProcess()方法:

public void setSystemProcess() {
        try {
            ServiceManager.addService(Context.ACTIVITY_SERVICE, this, true);
            ServiceManager.addService(ProcessStats.SERVICE_NAME, mProcessStats);
            ServiceManager.addService("meminfo", new MemBinder(this));
            ServiceManager.addService("gfxinfo", new GraphicsBinder(this));
            ServiceManager.addService("dbinfo", new DbBinder(this));

            ......

        } catch (PackageManager.NameNotFoundException e) {
            throw new RuntimeException(
                    &#
  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值