Activity详解

一、定义

ActivityAndroid的四大组件之一,在Android App 中只要能看见的几乎都要依托于Activity,所以Activity是在开发中使用最频繁的一种组件,其通过setContentView()来完成界面的显示。

二、生命周期

1.Activity生命周期函数的调用流程

 

2.activity被意外销毁时额外调用的函数

除上图生命周期函数调用时序,还有2个函数虽不属于Activity的生命周期方法,但我们还是需要了解一下,这2个方法是:onSaveInstanceState()  onRestoreInstanceState()

1onSaveInstanceState
它不属于Activity的生命周期方法,不一定会被触发,但是当应用遇到意外情况,比如:内存紧张,用户点击了Home键或按下电源键关闭屏幕等这些情况,系统可能会去销毁Activity,这时该方法就会被调用。这里强调的是系统去回收Activity,而不是我们去手动的销毁Activity。这个方法提供了一个Bundle对象,我们可以通过它来保存一些临时性的状态或者数据。通常这个方法只适合保存临时数据,如果需要数据的持久化保存,还是要在onPause方法里执行才好。当 Activity再次被创建时,Activity会通过onCreate(Bundle)或者onRestoreInstanceState(Bundle)执行的时候,会将提供一个的Bundle对象来恢复这些数据。

2onRestoreInstanceState 
这个方法调用的前提是Activity必须是被系统销毁了,在Activity被再次创建时它会在onStart()方法之后被调用。

3.Activity生命周期总结

1)正常情况下Activity的生命周期
onCreate->onStart->onResume->onPause->onStop->onDestroy

对于一个正常的Activity,第一次启动,会依次回调以下方法: 
onCreate->onStart->onResume

当我们打开一个新的Activity或者点击Home键回到桌面后,会依次回调以下方法: 
onPause->onStop

但是如果新的Activity是透明的(采用的透明主题),当前的Activity不会回调onStop.

当我们再次回到原Activity,会依次回调以下方法: onRestart->onStart->onResume.

当我们点击返回键后,会依次回调以下方法: onPause->onStop->onDestroy.

Activity被系统回收后,再次被打开,会跟第一次启动的时回调生命周期方法一样(不包含 onSaveInstanceState onRestoreInstanceState)。

其中onCreate onDestroy 是相对的。一个创建一个销毁。并且其只可能被调用一次。按照这种配对方式,我们也可以看出 onStartonStop 是配对的,这两个方法可以被多次调用。onResume onPause 也是配对的,它们一个获取焦点和用户交互,一个正好相反。

onStartonResume,onPauseonStop,这两对方法在功描述差不多,那为什么还要重复存在呢?
这两对方法分别代表不同的意义,onStartonStop Activity是否可见的标志,而onResumeonPause是从Activity是否位于前台的标志,它们针对的角度不同。

onPause里不能做耗时操作,因为如果要启动一个新的Activity,新的Activity必须要在前一个ActivityonPause 方法执行完毕之后才会启动的新的Activity

2)异常情况下Activity的生命周期

在系统内存不够时会根据优先级杀死Activity。怎么判断Activity的优先级呢?

最高的优先级:在前台显示并且跟用户交互的Activity,优先级最高,

暂停状态的Activity优先级次之:如果Activity没有在前台,但是可见,不可与用户交互,比如弹出一个对话框等。

处于后台Activity优先级最低:执行了onStop方法的Activity优先级最低。它不可见,并且无法跟用户交互。

当系统内存不足,就会按照优先级去销毁Activity,在销毁Activity时会额外的在onPauseonStop之间调用onSaveInstanceState;当要重新创建这个Activity 时,会在onStart方法之后调用onRestoreInstanceState方法。

三、启动方式

1. startActivityIntent

2. startActivityForResultIntent

需要重写onActivityResultint requastCodeint resultCodeIntent data)方法,并在该方法中处理返回的数据;并且在被启动activity中需要调用setResultint resultCodeIntent intent)方法来设置结果。

四、启动模式

1、standard 
standard模式是默认的启动模式,原理如下:

 

每次跳转系统都会在task中生成一个新的activity实例,并且放于栈结构的顶部,按back键时,才能看到原来的activity实例。 这就是standard启动模式,不管有没有已存在的实例,都生成新的实例。

2singleTop

指定属性android:launchMode=”singleTop”,原理如下:

  

跳转时发现存在有activity实例就复用,有实例但不位于栈顶,则新生成一个实例。假设你在当前的Activity中又要启动同类型的Activity,此时建议将此类型Activity的启动模式指定为SingleTop,能够降低Activity的创建,节省内存!

3、singleTask 
设置MainActivity的属性android:launchMode=”singleTask”,原理如下:

 

若须要创建的Activity在栈顶则复用,在栈中则不会创建新的Activity,而是将存在栈中的Activity上面的其他Activity所有销毁,使它成为栈顶。

最常见的应用场景就是保持应用开启后仅有一个Activity实例。最典型的样例是应用中展示的主页(Home页)。假设用户在主页跳转到其他页面,运行多次操作后想返回到主页,假设不使用SingleTask模式,在点击返回的过程中会多次看到主页,这明显就是设计不合理了。

4singleInstance 
  SingleInstance比较特殊,是全局单例模式,是一种加强的SingleTask模式。它除了具有SingleTask所有特性外,还加强了一点:具有此模式的Activity仅仅能单独位于一个任务栈中。

这个经常使用于系统中的应用,比如Launcher、锁屏键的应用等等,整个系统中仅仅有一个,在应用中一般不会用到。

五、ActivityFlags

FLAG_ACTIVITY_NEW_TASK

Activity指定”SingleTask”启动模式。跟在Mainfest指定效果同

FLAG_ACTIVITY_SINGLE_TOP

Activity指定”SingleTop”启动模式,跟在Mainfest指定效果同

FLAG_ACTIVITY_CLEAN_TOP

启动时会将与该Activity在同一任务栈的其他Activity出栈。一般与SingleTask启动模式一起出现,完成SingleTask的作用

FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS

Activity不会出现在历史Activity的列表中

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值