在桌面点击一个图标启动一个APP,或者在程序中启动其他APP,都涉及App的启动。最近看了一下app的启动,网上很多博客太深入源码,导致初学者在源码的世界中迷了路,不能从整体的角度了解和把握app的启动。我会从整体上简略的介绍app的启动,对初学者很友好哦~
了解app启动不得不说的几个部分
App启动的几个重要部分:Launcher,ActivityServiceManager,Binder,Zygote,ActivityThread。
Launcher
Launcher就是安卓的桌面应用,其实Launcher也是一个App,这个App是在安卓系统启动后自动运行,用来显示并启动已安装的应用程序,添加小部件(Widget)等。
这个Launcher应用和普通的应用的区别,在于其中Manifest清单文件中多了两行category过滤规则
<category android:name="android.intent.category.HOME" />
<category android:name="android.intent.category.DEFAULT" />
有这两行,系统会自动识别该APP为桌面APP,在点击HOME键时启动该APP。
用户点击桌面上的应用图片,打开新的APP,内部也是使用startActivity实现的,如下所示
String pkg = info.activityInfo.packageName; //该应用的包名
String cls = info.activityInfo.name; //应用的主activity类
ComponentName componet = new ComponentName(pkg, cls);
Intent i = new Intent();
i.setComponent(componet);
startActivity(i); //启动Activity
可以看到,在桌面应用中,相应用户的点击事件,将目标APP的报名和主Activity名放入intent中,使用startActivity来启动新的应用(至于startActivity怎么启动新的APP,接着看)。
ActivityServiceManager
ActivityServiceManager是由SystemService启动的众多服务(如:WindowManagerService,PowerManagerService)中的一个,ActivityServiceManager是安卓系统中一个很重要的服务,管理着安卓的四大组件,调用应用进程。AMS中有客户端和服务端,客户端运行在各个APP进程中,通过AMS服务端提供的接口(如IActivityManager,IApplicationThread,Context)来与AMS服务端进行通信。详见Android ActivityManagerService基本介绍。
Binder
Binder是安卓进程间通信(IPC)的机制。不同的APP,不同的系统服务都运行在不同的进程中,他们之间的通信就需要binder。Binder采用CS架构,所有的服务器都注册在ServiceManager中,客户端向服务端通信需要先获取服务,获取服务后通过共享内存的方式进行通信。
Zygote
安卓系统启动时创建的守护进程,安卓中几乎所有进程都是由Zygote创建的,Zygote会启动SystemService进程。Zygote还会向外提供socket接口用于创建进程。
ActivityThread
安卓系统中每一个APP都拥有独立的进程,该进程中的主线程就是ActivityThread,也是APP的主线程。ActivityThread中的main方法会创建消息队列,在ActivityServiceManager中注册APP(通过binder),初始化App,调用onCreate方法。
有了上面的知识,下面我们来看看App是怎么启动的。
Application的启动
结合上图我们来分析App的启动:
1.桌面应用(launcher)相应用户的点击事件,通过binder与ActivityManagerService通信,发出启动APP的请求(请求中包含要启动的APP的包名和主Activity名)
2.ActivityManagerService检查该App进程是否已经存在,如果不存在,通过Zygote提供的socket接口与Zygote通信,请求创建新进程。
3.Zygote创建新进程,创建ActivityThread实例,ActivityThread将自身注册到Service中以便进行管理。
4.ActivityThread开启消息队列
5.ActivityService向ActivityThread发出BIND_APPLICATION请求,ActivityThread加载APP的字节码到内存中,ActivityService发出LAUNCH_ACTIVITY请求,ActivityThread中相应请求最终调用onCreate,onResume方法,启动Activity。
到这里一个App就启动完成了。
如果你觉得文中有错误或者补充,请留言。