4种activity的启动模式
standard: 标准模式,一调用startActivity()方法就会产生一个新的实例。
singleTop: 如果已经有一个实例位于Activity栈的顶部时,就不产生新的实例,而只是调用Activity中的newInstance()方法。
如果不位于栈顶,会产生一个新的实例。singleTop适合接收通知启动的内容显示页面。例如,某个新闻客户端的新闻内容页面,如果收到10个新闻推送,每次都打开一个新闻内容页面是很烦人的。
singleTask: 会在一个新的task中产生这个实例,以后每次调用都会使用这个,不会去产生新的实例了。singleTask适合作为程序入口点。例如浏览器的主界面。不管从多少个应用启动浏览器,只会启动主界面一次,其余情况都会走onNewIntent,并且会清空主界面上面的其他页面。
singleInstance: 这个跟singleTask基本上是一样,只有一个区别:在这个模式下的Activity实例所处的task中,只能有这个activity实例,不能有其他的实例。
singleInstance适合需要与程序分离开的页面。例如闹铃提醒,将闹铃提醒与闹铃设置分离。singleInstance不要用于中间页面,如果用于中间页面,跳转会有问题,比如:A -> B (singleInstance) -> C,完全退出后,在此启动,首先打开的是B。
http://mp.weixin.qq.com/s?__biz=MjM5NDkxMTgyNw==&mid=2653058030&idx=1&sn=d926905b72512cee1a339a14fe304e53&scene=4#wechat_redirect
如果指定了一个Activity的启动模式是singleTop的那就应该既要重写onCreated()方法用于应对第一次创建的情况,也要重写onNewIntent( )方法来应对重复创建的情况
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
首先从startActivityForResult方法开始分析
ApplicationThread是ActivityThread的一个内部类
我们来看Instrumentation的execStartActivity方法
启动activity的实现最终是由ActivityManagerNative.getDefault()的startActivity方法来完成;
ActivityManagerService继承ActivityManagerNative.而ActivityManagerNative继承于Binder并实现了IActivityManager这个Binder接口因此AMS也是一个Binder;它是IActivityManager的具体实现;
Activity是由ActivityManagerNative.getDefault()来启动而ActivityManagerNative.getDefault()实际上是AMS
因此Activity的启动又转移到了AMS中;那么来看AMS的startActivity方法
接着看Instrumentation的execStartActivity方法其中有一个checkStartActivityResult方法
checkStartActivityResult的作用检查Activity的启动结果;
Activity的启动过程又转移到了ActivityStackSupervisor的startActivityMayWait方法中
ActivityStackSupervisor转移到了ActivityStack中
HandlerH对消息的处理
ActivityThread的handlerLaunchAcitivity方法来实现内部有一个performLaunchActivity方法
performLaunchActivity方法主要完成了这几件事情
1.ActivityClientRecord中获取启动Activity组件的信息;
2.通过Instrumentation的newActivity方法来使用类加载器来创建Activity对象
3.通过LoadApk的makeApplication方法来创建Application对象;
4.创建ContextImpl对象并通过Activity的attach方法来完成一些重要数据的初始化;
5。调用Activity的onCreate方法;
网友评论