安卓Activity

以前没有写博客记录自己学习经历的习惯,希望从今天开始养成这个好习惯,把自己每天的经历记录下来。

最近一段时间在做移动端开发,做一个地下管网数据采集的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。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值