1、activity的生命周期:
- activity的生命周期大致可以分为三个状态:
运行态:可以接受用户的点击事件,一般是在用户执行完onResume方法后的状态
暂停态:用户可看见这个activity,但是它已不接收点击事件,是onPause方法后的状态
停止态:用户已看不见这个activity,被其他的activity遮挡了,是onStop方法后的状态
- 这几个状态类似于Android中进程的状态:前台进程、可见进程、服务进程、后台进程、空进程
- 还有activity生命周期对应的几个方法
2、activity的四种启动模式:
- standard 模式:
程序启动的时候,会默认创建一个任务栈,Activity是放在任务栈里面的,比如我们新建一个项目,默认生成一个ActivityA,比如我们在ActivityA中有一个按钮,点击按钮跳转到ActivityB,ActivityB中有一个按钮,点击按钮跳转到ActivityC,那么如果在ActivityC中有个按钮跳转到ActivityB呢?没错,是再次创建一个ActivityB实例。点击返回按键,activity会逐个从栈中弹出。
- singleTop模式:
1、任务栈中可以有多个实例,但是不能有多个相同的activity叠加。如果在启动这种模式的Activity的时候,当前任务栈中已经存在了相同的Activity,那系统就不会再创建新的,而是回调任务栈中已经存在的该Activity的onNewIntent( )方法,将其调到栈顶进行使用。
2、所以如果指定了一个Activity的启动模式是singleTop的那就应该既要重写onCreated()方法用于应对第一次创建的情况,也要重写onNewIntent( )方法来应对重复创建的情况。
3、应用场景:我们在搜索框中输入想要搜索的内容点击搜索进入SearchResultActivty(搜索结果页)查看搜索的结果(一般我们也会在搜索结果页提供搜索框,这样用户无需点击返回键回到上一个页面再在搜索框中输入搜索内容点击搜索),如果此时用户还想搜点别的东西,就可以直接在当前的搜索结果页SearchResultActivty中的搜索框输入搜索内容继续搜索。
- singleTask模式:
1、只有一个实例。在同一个应用程序中启动他的时候,若Activity不存在,则会在当前task创建一个新的实例,若存在,则会把task中在其之上的其它Activity destory掉并调用它的onNewIntent方法。
2、应用场景:用户在支付完成页直接跳转到首页,并把不需要的Activity销毁
- singleInstance模式:
1、这种启动模式和singleTask几乎一样,它也只允许系统中存在一个目标Activity,包括上面我们所说的SingleTask的一些特性singleInstance都有。唯一不同的是,持有目标Activity的任务栈中只能有目标Activity一个Actvitiy,不能再有别的Activity,对! 就是承包了这个任务栈!
2、如果该模式的activity启动了其他的activity,启动的activity需要放到其他的任务栈中去管理。
- 在Lollipop之前,当前activity启动其他APP的activity时,activity会被放到同一个任务栈中;但是Lollipop之后,不同APP的activity会被放到不同的任务栈中。
- 启动模式的使用:
1、通过清单文件使用:
2、通过intent添加标签来使用:
3、activity的启动流程:
- 一个Activity启动app内部另一个standard模式的Activity为例。Activity启动另一个Activity之前,当前的Activity先要执行onPause,被启动的Activity才会执行到onResume方法。这中间实际上是会执行4次IPC过程的:
1、当前Activity发起启动另一个Activity的请求——>ActivityManagerService
2、ActivityManagerService——> 通知App暂停当前Activity
3、当前App告知已经暂停了当前的Activity——> ActivityManagerService
4、ActivityManagerService ——> 通知App启动新的Activity
1、Launcher通过Binder进程间通信机制通知ActivityManagerService,
它要启动一个Activity;
2、ActivityManagerService通过Binder进程间通信机制通知Launcher进入Paused状态;
3、Launcher通过Binder进程间通信机制通知ActivityManagerService,它已经准备就绪进入Paused状态, 于是ActivityManagerServicey利用Zygote.fork()创建一个新的进程,用来启动一个ActivityThread实例, 即将要启动的Activity就是在这个ActivityThread实例中运行;
4、ActivityThread通过Binder进程间通信机制将一个ApplicationThread类型的Binder对象传递给ActivityManagerService,以便以后ActivityManagerService能够通过这个Binder对象和它进行通信;
5、ActivityManagerService通过Binder进程间通信机制通知ActivityThread,
现在一切准备就绪,它可以真正执行Activity的启动操作了。
网友评论