Activity:活动,用户交互的界面。
Activtiy的启动过程:
启动activity的方式有以下几种:
- 在应用程序中startActivity()或startActivityForResult()方法启动指定activity
- 在HOME(桌面)程序中单击应用图标,启动新的activity
- 按"BACK"键结束当前activity,自动启动上一个activity
- 长按“Home”键,显示出当前任务列表,从中选择一个启动
Activity启动另一个Activity之前,当前的Activity先要执行onPause,被启动的Activity才会执行到onResume方法。这中间实际上是会执行4次IPC过程的:
- 当前Activity发起启动另一个Activity的请求——>ActivityManagerService
- ActivityManagerService——> 通知App暂停当前Activity
- 当前App告知已经暂停了当前的Activity——> ActivityManagerService
- ActivityManagerService ——> 通知App启动新的Activity
Activity启动涉及到的类
首先要简单介绍一下Activity启动过程涉及到的类,以便于更好的理解这个启动过程。
- ActivityThread:App启动的入口
- ApplicationThread:ActivityThread的内部类,继承Binder,可以进程跨进程通信。
- ApplicationThreadProxy:ApplicationThread的一个本地代理,其它的client端通过这个对象调用server端ApplicationThread中方法。
- Instrumentation:负责发起Activity的启动、并具体负责Activity的创建以及Activity生命周期的回调。一个应用进程只会有一个Instrumentation对象,App内的所有Activity都持有该对象的引用。
- ActivityManagerService:简称AMS,是service端对象,负责管理系统中所有的Activity
- ActivityManagerProxy:是ActivityManagerService的本地代理
- ActivityStack:Activity在AMS的栈管理,用来记录已经启动的Activity的先后关系,状态信息等。通过ActivityStack决定是否需要启动新的进程。
- ActivityRecord:ActivityStack的管理对象,每个Activity在AMS对应一个ActivityRecord,来记录Activity的状态以及其他的管理信息。其实就是服务器端的Activity对象的映像。
- TaskRecord:AMS抽象出来的一个“任务”的概念,是记录ActivityRecord的栈,一个“Task”包含若干个ActivityRecord。AMS用TaskRecord确保Activity启动和退出的顺序。
Activity启动最终会调用到startActivityForResult方法,我们只需要关注mParent == null中的逻辑即可。mParent代表的是ActivityGroup,其最开始是为了在一个界面中嵌入多个子Activity,在API13的时候就已经废弃了,可以使用Fragment表示一个界面的多个区域。
由startActivity()——〉startActivityForResult() ——〉execStartActivity()(Instarumentation的对象调用该方法)——〉ActivityManagerNative.getDefault()
方法获取ActivityManagerService的一个本地代理对象ActivityManagerProxy,然后调用了其startActivity()——〉
- Activity.startActivity
- Activity.startActivityForResult
- Instrumentation.execStartActivity
- ActivityManagerProxy.startActivity
- ActivityManagerService.startActivity
- ActivityStack.startActivityMayWait
- ActivityStack.startActivityLocked
- ActivityStack.startActivityUncheckedLocked
- ActivityStack.resumeTopActivityLocked
- ActivityStack.startPausingLocked
- ApplicationThreadProxy.schedulePauseActivity
- ApplicationThread.schedulePauseActivity
- ActivityThread.queueOrSendMessage
- H.handleMessage
- ActivityThread.handlePauseActivity
- ActivityManagerProxy.activityPaused
- ActivityManagerService.activityPaused
- ActivityStack.activityPaused
- ActivityStack.completePauseLocked
- ActivityStack.resumeTopActivityLokced
- ActivityStack.startSpecificActivityLocked
- ActivityStack.realStartActivityLocked
- ApplicationThreadProxy.scheduleLaunchActivity
- ApplicationThread.scheduleLaunchActivity
- ActivityThread.queueOrSendMessage
- H.handleMessage
- ActivityThread.handleLaunchActivity
- ActivityThread.performLaunchActivity
- AcitiviyB.onCreate
Activity的生命周期:onCreate() ——〉onStart() ——〉onResume() ——〉onPause() ——〉onStop() ——〉onDestory()
Activity的启动模式:standard(开启一个就创建一个Activity)、singleTop(先判断Task栈顶是否有,若有则直接返回栈顶活动,若不在栈顶还是需要重新创建新的)、singleTask(判断Task中是否存在Activity,若有则将该活动之上的所有活动全部出栈,若没有则重新创建新的)、singleInstance(创建一个单独的栈,一般用于多个程序共享一个Activity)
如何知晓当前是那个活动:创建一个Class,命名为BaseActivity,继承AppCompatActivity,并重写onCreate的方法,使用Log记录,getClass().getSimpleName(),这个类不需要再清单文件注册。然后让项目中所有的Activity继承这个类。
如何随时退出程序:创建一个管理器,管理活动ActivityCollector,使用List来存储activity对象,编写三个方法:addActivity,removeActivity,finishAll;然后在创建一个继承AppCompatActivity的BaseActivity来调用,在onCreate方法调用ActivityCollector.addActivity,在onDestory方法调用ActivityCollector.removeActivity的方法,若要在指定的Activity中退出程序,可调用ActivityCollector.finishAll的方法。