以前没有写博客记录自己学习经历的习惯,希望从今天开始养成这个好习惯,把自己每天的经历记录下来。
最近一段时间在做移动端开发,做一个地下管网数据采集的app,这是第一次接触移动端的项目,以前做过c++的项目,但是对移动端一点都不了解,因为项目很急,没什么时间学习,配完环境直接上网找功能,然后复制到自己的项目里,只是为了完成任务,但是粘着粘着感觉自己的代码太屎了,对安卓整体的框架不了解,内部运行机制不了解,代码经验不足等种种原因,导致整体的设计出现了很大的问题,代码重用性太差,程序很多bug,但是现在我负责的大部分功能都完成了,所以有时间坐下来认真学习安卓整体框架、内部运行机制。
今天简单的看了一下我认为安卓中最重要也是最基础的Activity,简单了解了Activity的生命周期和启动模式。
一.Activity生命周期
onCreate、onStart、onResume、onPause、onStop、onDestroy
我会分三个阶段去记Activity的生命周期
第一个阶段就是创建显示Activity,一个Activity创建显示会依次调用onCreate、onStart、onResume
第二个阶段就是暂停和隐藏Actiivty,调用onPause、onStop
第三个阶段就是销毁Activity,调用onDestroy
Activity跳转(调用startActivity)
FirstActivity SecondActivity
onCreate
onStart
onResume
onPasue
onCreate
onStart
onResume
onStop
从一个Activity跳转到另一个Activity首先要调用onPause方法暂停当前Activity,然后调用onCreate、onStart、onResume这三个方法显示新的Activity,最后调用前一个Activity的onStop方法隐藏上一Activity
点击返回键
SecondActivity FirstActivity
onPasue
onRestart
onStart
onResume
onStop
onDestory
横屏切换
horizontalScreen verticalScreen
onCreate
onStart
onResume
onPasue
onSaveInstanceState
//将Activity当前状态(可以保存参数)保存到系统中,重新创建Activity的时候可以从系统中获取保存的参数。
onStop
onDestory
onCreate
onStart
onResume
横屏切换实际上是将竖屏的Activity finish掉,重新创建了一个横屏的Activity,在实际开发中很多系统不会支持横屏操作,因为横屏操作需要重新创建一套布局还有代码,这大大降低了开发效率。
二、Activity启动模式
启动模式分为四种:standard(the default model)、singleTop、singleTask、singleInstance
1.standard(the default model)
这是默认的启动模式调用startActivity时不管要启动的Activity在栈中是否存在,都重新onCreate一个Activity,这种方法比较蠢,不断的去创建Activity,不管他存不存在。
我在测试两个Acticvity互相调用的时候一直不明白,当我在第一个Activity成功启动创建第二个Activity'后,第一个Activity明明是暂停隐藏了,而我在第二个Activity中调用第一个Activity的时候系统还是调用了onCreate方法,而不是onReStart方法,看到这个启动模式我才明白。
2.singleTop
如果启动的Activity在当前Activity所在栈中的栈顶位置,那就不会调用onCreate方法创建一个新的Activity,就会调用自己的onNewIntent方法,如果要调用的Activitty不在栈顶的位置,无论这个Activity存不存在都会调用onCreate方法重新创建一个Activity。
我感觉我应该不会经常用到这种模式,因为我不会经常去启动自己。
3.singleTask(任务栈中一个Activity只有一个,不会出现重复的Activity)(启动Activity是单实例的)
如果栈中有要打开的Activity,他就会清空栈中在要启动的Activity之上的所有Activity,然后显示目标Activity。
这种方法太残忍了,只要档住他显示的Activity全给干掉。
4.singleInstance
启动Activity是单实例的,启动的Activity会创建一个新的任务栈,在新的任务栈中创建这个Activity,一旦这个Activity创建成功,如果以后想调用,就不会调用onCreate函数重新创建这个Activity,而是调用onNewIntent重新打开Activity。
做这个项目的时候,我想做一个功能,就是两个Activity之间切换,但是不会销毁,也不会重新onCreate,一开始不知道有启动模式存在的时候一直使用的是默认的Standard,但是使用这种启动方式的时候,在一个Activity中启动另一个Activity后,在当前Activity回调前一个Activity的时候,不管要回调的Activity是否存在,都调用onCreate重启创建这个Activity,但是实际上回调的Activity在之前已经创建过了,我不想让他重新创建,我只是想打开它,我想让这两个Activity互相切换,我尝试了之后发现Standard模式是不能实现我想要的功能,返回键当然也不可以,因为点击返回键的时候,当前Activity会被销毁,直到我了解了singleInstance启动模式的时候,我发现singleInstance启动模式可以实现我想要的功能。
所以我进行了尝试我把这两个Activity的launchMode都设置成singleInstance模式,也就是说这个Activity分别存在于两个不同的任务栈中,只要他们存在就不会调用onCreate重新创建Activity,而是调用onNewIntent打开目标Activity。但是实际上第一个Activity创建成功后,在调用第二个Activity的时候程序直接crush掉了,logCat中打印出:Activity is launching as a new task, so cancelling activity result.后来我查了资料才发现,singleTask和singleInstance模式不能用startActivityForResult。
startActivityForResult的文档中有下面关键一句:
For example, if the activity you
* are launching uses the singleTask launch mode, it will not run in your
* task and thus you will immediately receive a cancel result.
因此,对于singInstance或singleTask的Activity只能采用其他的方式来传递数据,也就是使用startActivity来启动Activity。