1.Activity的启动和通信原理
对于做App的开发人员而言,Activity是四大组件中用的最多的,也是最复杂的,
a。App是怎么启动的。
在手机屏幕上点击某个App的Icon,这个App的首页(或引导页)就出现在我们面前了。实际上是Activity和AMS的反反复复的通信过程。
首先要搞清楚,在手机屏幕上点击App的icon快捷图标,此时手机屏幕就是一个Activity,而这个Activity所在的App,业界称之为Launcher(不是我们app的launcher)。Launcher是手机系统厂商提供的,类似小米华为这样的手机,比拼的就是谁的Launcher绚丽和人性化。
Launcher这个App,其实和我们做的各类应用类App没有什么不同,我们大家用过华为、小米之类的手机,预装App以及我们下载的各种App,都显示在Launcher上,每个App表现为一个Icon。Icon多了可以分页,可以分组,此外,Launcher也会发起网络请求,调用天气的数据,显示在屏幕上,所谓的人性化界面。
我们的第一个页 action and category 是重点
而Launcher中为每个App的icon提供了启动这个App所需要的Intent信息,如下所示(比如说斗鱼的包名是):
action:android.intent.action.MAIN
category: android.intent.category.LAUNCHER
cmp(ComponentName): 斗鱼的包名+ 首页Activity名
这些信息是App安装(或Android系统启动)的时候,PackageManagerService从斗鱼的apk包的manifest文件中读取到的。
仔细看,我们会发现,Launcher和斗鱼是两个不同的App,他们位于不同的进程中,它们之间的通信是通过Binder完成的——这时候AMS出场了。
- Launcher通知AMS,要启动斗鱼App,而且指定要启动斗鱼的哪个页面(也就是首页)。
- AMS通知Launcher,好了我知道了,没你什么事了,同时,把要启动的首页记下来。
- Launcher当前页面进入Paused状态,然后通知AMS,我睡了,你可以去找斗鱼App了。
- AMS检查斗鱼App是否已经启动了。是,则唤起斗鱼App即可。否,就要启动一个新的进程。AMS在新进程中创建一个ActivityThread对象,启动其中的main函数。
- 斗鱼App启动后,通知AMS,说我启动好了。
- AMS翻出之前在第二步存的值,告诉斗鱼App,启动哪个页面。
- 斗鱼App启动首页,创建Context并与首页Activity关联。然后调用首页Activity的onCreate函数。
这里插一句:ActivityManagerService 简称AMS,是Android内核的核心功能之一,在系统启动SystemServer时启动此服务。
Activity Manager的组成主要分为以下几个部分:
1.服务代理:由ActivityManagerProxy实现,用于与Server端提供的系统服务进行进程间通信
2.服务中枢:ActivityManagerNative继承自Binder并实现IActivityManager,它提供了服务接口和Binder接口的相互转化功能,并在内部存储服务代理对像,并提供了getDefault方法返回服务代理
3.Client:由ActivityManager封装一部分服务接口供Client调用。ActivityManager内部通过调用ActivityManagerNative的getDefault方法,可以得到一个ActivityManagerProxy对像的引用,进而通过该代理对像调用远程服务的方法
4.Server:由ActivityManagerService实现,提供Server端的系统服务
AMS提供的功能主要包括以下几个方面:
1。对于Android四大组件(activity service broadcast content provider)的管理,包括启动,生命周期管理等
2.进程OOM adj以级LRU weight管理
至此启动流程完成,分成两部分,Launcher和AMS相互通信(Launcher通知AMS启动那个APP),斗鱼App和AMS(AMS去创建新的进程启动APP)相互通信。
第1阶段 Launcher通知AMS
ps:ActivityThread代表了App应用程序,其实,Application对我们App开发人员来说也许很重要,但是在Android系统中还真的没那么重要,他就是个上下文。Activity不是有个Context上下文吗?Application就是整个ActivityThread的上下文。Android App的main函数,在ActivityThread里面,而这个类是Android系统提供的底层类,不是我们提供的。Android App的入口是Mainifest中定义默认启动Activity。这是由Android AMS与四大组件的通信机制决定的。
所以点击icon就启动了斗鱼App中的首页。
关注本人公众号获取更多干货.