android应用程序窗口框架学习(3)-应用程序的进程的启动过程

本文详细阐述了Android应用程序启动过程的核心机制,包括ActivityThread类的作用、主线程创建与消息循环实现,以及如何在此过程中启动Activity和服务。通过理解这些原理,开发者能够更深入地掌握Android应用的启动机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

注意这里分析的是应用程序得到进程的启动过程,参考下面的第二篇文章,大家也可以看看第一篇文章。这里作为自己的笔记参考

http://blog.youkuaiyun.com/luoshengyang/article/details/6689748 

老罗博客-Android应用程序启动过程源代码分析

http://blog.youkuaiyun.com/luoshengyang/article/details/6747696 

老罗博客-Android应用程序进程启动过程的源代码分析


ActivityThread 类:

该类为应用程序的主线程类,所有的APK程序都有且只有一个ActivityThread类,程序的入口为该类的static main()函数,ActivityThread所在的线程即为UI线程或主线程。

ActivityThread.main()

       这个函数定义在frameworks/base/core/java/android/app/ActivityThread.java文件中:


public final class ActivityThread {  
    ......  
  
    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从mian函数中开始执行,调用prepareMainLooper()为UI线程创建一个消息队列(MessageQueue)

然后从这里我们可以看出,这个函数首先会在进程中创建一个ActivityThread对象:

ActivityThread thread = newActivityThread(); 

在ActivityThread的初始化代码中会创建一个H(Handler)对象和一个Application(Binder)对象,其中Binder负责接收远程AmS的IPC调用,接收到调用后,则通过Handler把消息发送到消息队列,UI主线程会异步地从消息队列中取出消息并执行相应操作。比如start,stop,pause等。

接着然后进入消息循环中:

Looper.loop(); 

进入后就会不断的从消息队列中读取处理的消息。

       这样,我们以后就可以在这个进程中启动Activity或者Service了。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值