Activity的启动解析,launcher点击启动应用

本文详细分析了Android中Activity的启动过程,包括跨进程启动和同一进程内的启动。阐述了从用户点击应用图标到Activity完全启动的整个流程,涉及socket和binder通信机制,以及AMS与ApplicationThread的交互细节。

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

关于framework中的某些源码的分析,只记录下结论,以及主要的一些地方,具体的代码逻辑就不一一分析了,平时也不一定能用得上,需要用到的时候在根据记录的一些标记去寻找。这样方便记录与查看,没那么费脑。

本文所提到的Activity的启动包括两种情况,第一种是在不同的进程中启动Activity,主要包括点击桌面的应用图标,启动新的应用,第二种情况是在同一个进程中启动一个Activity,主要包括应用程序内页面的跳转。下面分别对着另种情况的Activity启动做一个大致分析。

  • 启动不同进程中的Activity

这种方式启动Activity最常用到的情景是点击桌面上的应用图标,启动一个新的应用。以点击桌面上的应用图标启动一个app为例:

1.点击LauncherActivity中list的数据执行onListItemClick方法。

2.之后会通过Activity,Instrumentation,走到ActivityManagerNative.getDefault.startActivity,通过binder机制,实际上是执行的ActivityManagerService.startActivity方法。

3.AMS会通知Process使用Socket和Zygote进程通信,请求创建一个新的进程。(socket是另一种进程通信)

4.Zygote收到socket请求,fork出一个新的进程,调用ActivityThread.main方法。(作为一个进程的启动)

5.ActivityThread通过binder通知AMS启动应用程序。

6.AMS通知ActivityStackSupervisor真正的启动Activity。

7.ASS通知ApplicationThread启动Activity。

8.ApplicationThread通知ActivityThread启动一个Activity。

9.ActivityThread会先启动一个Application然后在启动Activity。

上述中存在多个进程间通信,有socket和binder机制,其中AMS中是通过ApplicationThreadNative.asInterface获得IApplicationThread的代理对象ApplicationThreadProxy,然后与ApplicationThread交互,ActivityThread是通过ActivityManagerNative与AMS交互。

  • 启动同一个进程中的activity

这一种启动就是平时最常用到的在应用中界面跳转,通过调用一个startActivity方法来完成跳转,当调用startActivity时,它涉及到一个流程大致如下:调用启动startActivity------>Instrumentation执行启动Activity----->通过AMN进程通信调用AMS的启动Activity的方法----->通过ApplicationThreadProxy进行进程通信调用ApplicationThread的启动Activity方法---->ActivityThread中的启动Activity的方法。

Activity都有生命周期方法,如果当前的Activity要启动另一个Activity,那么当前的Activity会执行onPause方法,然后被启动的Activity才会执行onResume方法,所以在启动一个Activity时,这中间会执行4次ipc的调用:

1)当前的Activity启动另一个Activity请求----->AMS。

2)AMS---->通知APT暂停当前的Activity。

3)ActivityThread----->告知AMS当前的Activity已经停了。

4)AMS----->通知APT启动新的Activity。

 

  • AMS与ApplicationThread的交互:

在启动Activity,Service,发送广播等时,在Context的实现类ContextImpl中可以看到都是通过ActivityManagerNative调用到AMS,由AMS来实现真正的启动与销毁,然后AMS通过与ApplicationThread与应用进程交互,ApplicationThread作为ActivityThread的内部类就会直接通知到ActivityThread也就是应用的主线程(UI线程)执行相应的生命周期方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值