android开发工作经验总结-activity

本人目前4年开发经验,奈何还是一个菜鸟,之前一直没有更新过,现在想着写一些东西,挖掘一下自己的大脑,用来当作日记,记录一下自己这些年来的工作经验

一.生命周期与启动模式        

如果单纯的谈生命周期来讲,想必对于android开发来说,再简单不过,如下图

如果加上启动模式 ,可能生命周期会有一些变化,启动模式包括四种  

1.标准模式 -standard    在清单文件中声明,如果未声明,默认也是这种模式,即每次启动标准模式的activit都会重新创建一个新的实例,不管任务栈中是否存在,都会重新创建,并且每个新的实例都会调用完整的生命周期。谁启动了这个Activity,那么这个Activity实例就运行在启动它的那个Activity所在的栈中 。根据上面所说,我们就了解了当用ApplicationContext启动或者在Service中直接调用startActivity启动标准模式Activity时报如下错误的原因了。

android.util.AndroidRuntimeException: Calling startActivity from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?

上面错误的原因就是被启动的Activity是标准模式,而发起启动请求的Context不是Activity的Context,未存在Activity栈,而每个Activity实例启动销毁都需要进栈出栈,用栈来存储Activity的信息,所以非Activity Context需要设置FLAG_ACTIVITY_NEW_TASK属性,启动一个新的Activity栈。

2.   栈顶复用模式-sing top:在这种模式下,如果新启动的Activity已经位于任务战的栈顶,那么此Activity不会被重新创建,只会重新调用 onNewIntent 方法,这个Activity的onCreate、onStart都不会被系统调用。如果新Activity实例已经存在但不在栈顶,那么重新创建 Activity 并放入栈顶。

3.栈内复用-singTask:也叫单例模式,一个栈中只允许存在同样activity的一种实例,无论是否在栈顶,只要存在,就不会重新创建实例,和singtop一样,也会调用onNewIntent方法

需要注意的是:如果一个Activity被设置为singleTask模式,那么当栈内已经存在该Activity实例时,再启动该Activity,会让该Activity实例之上的Activity被出栈。举个例子:有四个Activity 分别是 A、B、C和D,A是singleTask模式,当先执行A->B->C->D时,A在栈内已存在实例,此时再调用D->A启动A时,会让A实例之上的B、C、D都出栈。一般项目的MainActivity都设置为此模式,方便放回首页和清空中间Activity。

4.单实例模式-singleInstance:这是一种加强的singleTask模式,它除了具有singleTask模式的所有特性外,还加强了一点,那就是此种模式的Activity只能单独地位于一个任务栈中,不同的应用去打开这个activity 共享公用的同一个activity。他会运行在自己单独,独立的任务栈里面,并且任务栈里面只有他一个实例存在。应用场景:呼叫来电界面。这种模式的使用情况比较罕见,在Launcher中可能使用。或者你确定你需要使Activity只有一个实例。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容