android应用层-activity启动方式
2017-09-06 17:55
218 查看
Activity的启动
activity的启动可谓是老生常谈,但是面试了很多开发人员,大多还是对activity一知半解,今天就来深入讲解activity原理,有不当之处还望指正。
一:启动模式
1)standard 顾名思义(标准)就是Activity栈中不断创建新的界面,并叠加到顶部,
由于Activity栈采用LIFO(后进先出)的模式,所以,顶部界面返回时也是最先出栈的。
2)singleTop (单一顶部模式) 可以有多个实例,但相同的事例只允许一个位于顶部,
也就是用户可观察的UI。如果事例位于栈顶,则不会创建新的,而会调用其onNewIntent()方法。
3)singleTask(单一任务模式)同一个Application中只有一个实例,但是当其单例上
还有其他的Acitivity,再吊起他,会将上面的界面全部销毁掉。
4)singleInstance(单一事例模式)只有一个实例(在系统中),并且其独立运行在一个
task中,这个task只有这一个实例,不允许其他Activity存在。
有一些一线快讯信息,不可能来几条,就给用户创建几个界面,用户会很反感。
3.singleTask,典型程序的入口,IndexActivity主界面,只允许一个
存在,由于现有用户习惯,80%的用户使用App只访问首页,所以首页做的好不好很关键,
正是因为此,首页的内容功能往往很多,导致实例对象占用的内存也想比较大,所以采用singleTask也是比较科学的。
4.singleInstance这种应用非常少见,项目中基本也不会用到,他是一个系统的
实例,任何应用能访问他,例如一些系统级的闹钟,来电等,都是
采用此种模式,直到全部的Activity退出,不然一直在栈顶显示。
二:Activity启动流程
我也就不长篇大论了,网上这方面的资料也很多,我就简单说下流程,有兴趣的同学,
可以多搜集资料,刷机,查看frameworks里的AMS,(1W8的代码啊)
挑重点看
Launcher调用startActivity-->activity manager-->zygote(孵化) fork process-->linux
fork,孵化产生一个进程,Looper,ActivityThread
activity的启动可谓是老生常谈,但是面试了很多开发人员,大多还是对activity一知半解,今天就来深入讲解activity原理,有不当之处还望指正。
一:启动模式
1)standard 顾名思义(标准)就是Activity栈中不断创建新的界面,并叠加到顶部,
由于Activity栈采用LIFO(后进先出)的模式,所以,顶部界面返回时也是最先出栈的。
2)singleTop (单一顶部模式) 可以有多个实例,但相同的事例只允许一个位于顶部,
也就是用户可观察的UI。如果事例位于栈顶,则不会创建新的,而会调用其onNewIntent()方法。
3)singleTask(单一任务模式)同一个Application中只有一个实例,但是当其单例上
还有其他的Acitivity,再吊起他,会将上面的界面全部销毁掉。
4)singleInstance(单一事例模式)只有一个实例(在系统中),并且其独立运行在一个
task中,这个task只有这一个实例,不允许其他Activity存在。
单独说下应用场景:
1.标准就不用说了,每次都创建,例如我们购物或者看车(App)时候,
我们想记录所有浏览过的商品(相当于历史记录,返回可以查看),
我们就可以采取standard,但之前用乐视2手机时逛淘宝时,当不断刷商品,
最后没法返回最初的那个,可能也就30个Activity左右,就有点奇怪,后来发现淘宝
采用了内存处理,也就是只允许商品界面存放固定的实例,这其实降低内存消耗的举措,
可以想象,如果一个用户可以无限创建商品界面实例,会是什么样的后果。
2.singleTop适合只展示一个的场景,最典型的就是推送信息,我们项目中有一些一线快讯信息,不可能来几条,就给用户创建几个界面,用户会很反感。
3.singleTask,典型程序的入口,IndexActivity主界面,只允许一个
存在,由于现有用户习惯,80%的用户使用App只访问首页,所以首页做的好不好很关键,
正是因为此,首页的内容功能往往很多,导致实例对象占用的内存也想比较大,所以采用singleTask也是比较科学的。
4.singleInstance这种应用非常少见,项目中基本也不会用到,他是一个系统的
实例,任何应用能访问他,例如一些系统级的闹钟,来电等,都是
采用此种模式,直到全部的Activity退出,不然一直在栈顶显示。
二:Activity启动流程
我也就不长篇大论了,网上这方面的资料也很多,我就简单说下流程,有兴趣的同学,
可以多搜集资料,刷机,查看frameworks里的AMS,(1W8的代码啊)
挑重点看
Launcher调用startActivity-->activity manager-->zygote(孵化) fork process-->linux
fork,孵化产生一个进程,Looper,ActivityThread
相关文章推荐
- Android 启动activity的4种方式及打开其他应用的activity的坑
- Android利用activity启动模式退出整个应用
- 手把手教你_怎么找android应用的包名和启动activity
- android activity的启动方式
- Android四种启动Activity方式
- Activity生命周期的应用场景举例以及显隐式Activity启动的两种方式和启动系统常见的ACtivity
- Android 讲解:Activity 的启动方式
- Android实现点击通知栏后,先启动应用再打开目标Activity ,极光推送等推送的也可以参考一下(转)
- android学习--Activity及应用启动过程
- android开发(26) 和其他应用交换数据方式一,使用intent指定自定义action调用其他程序里的activity,并获得其返回的结果
- Android 根据apk获取应用包名和启动Activity
- (大总结)从寻找fragment静态导入activity总是失败的解决方法中了解android应用的系统启动过程
- Android中从一个应用中启动另外的应用的实现方式
- Android应用A启动应用B的某个Activity
- Android利用activity启动模式退出整个应用
- Android中实现Activity的启动拦截之----实现360卫士的安装应用界面
- Android实现点击通知栏后,先启动应用再打开目标Activity 144
- Android:Activity的生命周期和启动方式
- android启动activity的几种方式
- Android的Activity启动方式以及传值方式