Android笔记:Activity生命周期以及启动模式

1、什么是Activity?

Activity(活动)是Android四大组件之一,是一种展示型的组件,用于向用户直接地展示一个界面,并且可以接受用户信息从而进行交互。四大组件中,只有Activity用户可以感知到,其他三个组件,对用户来说都是不可感知的。

2、Activity生命周期

2.1 生命周期函数

正常情况下的生命周期函数:
onCreate( ):表示Activity正在创建,可以在这个方法中进行一些初始化的操作,比如setContentView()去加载布局资源。

onRestart( ):表示Activity正在重新启动,一般情况下,是当前Activity从不可见重新变为可见状态时,onRestart方法就会被调用。

onStart( ):表示Activity正在启动,这时它处于后台可见,但是前台不可见,用户还看不见该Activity,无法进行交互。

onResume( ):表示Activity正在运行,这时Activtiy在前台也可见了,用户可以进行交互。

onPause( ):表示Activity正在暂停,注意,这里不可以进行耗时的操作,因为启动一个新的Activity时,必须要先执行完onPause方法,新Activity的onResume方法,才会执行。

onStop( ):表示Activity正在停止,这时Activity就不可见了,注意,这里也不可以进行重量级的耗时操作。一般情况下,onPause执行后就会执行onStop,但如果类似打开弹窗之类的操作,执行完onPause就不会执行onStop,因为当前Acitvity仍然可见。

onDestroy( ):表示Activity正在销毁,这是生命周期最后一个回调,这里可以进行释放资源的操作。

这里贴上生命周期图(出处:<<Android开发艺术探索>>--------任玉刚著):

在这里插入图片描述

2.2 生命周期执行流程

假设,这里有两个页面 A 和 B 。

第一次启动 A_Activity:

在这里插入图片描述

返回桌面时:
在这里插入图片描述

从桌面回到A_Activty:

在这里插入图片描述

A页面跳转到B页面:(注意,这里如果B_Activity是透明主题时,那么A_Activity 不会执行onStop)
在这里插入图片描述

再从B页面回到A页面:

在这里插入图片描述

上面都是说的正常的生命周期流程,那当然就还有异常的生命周期。

一种情况是系统配置发生改变时产生的异常,导致Activity被杀死并重新创建,它会导致数据丢失。比如旋转屏幕,进行横竖状态的切换。

另一种是内存资源不足导致低优先级的Acticity被杀死。
在这里插入图片描述

解决方式:

1、在清单文件AndroidManifest.xml中的相关Acticity标签中增加 android:configChanges = “orientation | screenSize” 。如果需要其他属性相关配置可以查阅官方文档。

2、重写onSaveInstanceState()和 onRestoreInstanceState()。进行保存数据和恢复数据,它会在onStop之前去保存数据。

3、启动模式

3.1 四大启动模式

比如,任务栈S1 有ABC三个Activity实例。A处于栈底,C处于栈顶。

standard:标准模式,也是系统默认的模式。每次启动一个Activity都会创建一个新的实例,不管这个实例是否存在。一个任务栈中可以有多个实例,每个实例也可以属于不同的任务栈。此时再启动C,那么应该是ABCC。

singTop:栈顶复用模式,这个模式下,如果需要启动的新Activity已经处于任务栈S1的栈顶了,那它就不会重新创建。此时再启动C,那么还是ABC。

singleTask:栈内复用模式,该模式下,如果需要启动的新Activity在任务栈S1中存在,那么也不会创建新的实例。此时启动B,那应该是AB。

singleInstance:单实例模式,这是一种加强型的singleTask模式,每个Activity实例只能独自位于一个任务栈中。

指定启动模式的方式:

1、AndroidManifest.xml中的相关Acticity标签增加android:launchMode = “standard|singleTask|singTop|singleInstance” 四大启动模式任选其一。

2、在Intent中设置标志位来指定启动模式。intent.addFlags( flag )

其中常用 flag 有:

FLAG_ACTIVITY_NEW_TASK:指定"singleTask"启动模式

FLAG_ACTIVITY_SINGLE_TOP:指定"singleTop"启动模式

FLAG_ACTIVITY_CLEAR_TOP:一般和FLAG_ACTIVITY_SINGLE_TOP配合使用,它是把同一个任务栈中,位于它之上的实例都出栈掉。

FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS: 具有这个标记的Activty不会出现在历史Activity列表中。等同于xml中指定Activity属性android:excludeFromRecents=“true”

4、IntentFilter的匹配规则

Activity的启动由Intent触发,其中Intent可以分为显示Intent和隐式Intent,也就是显示启动和隐式启动。显示Intent可以明确的指向一个Activity组件,隐式Intent则指向一个或多个目标Activity,当然也有可能没有相匹配的Activity。隐式启动需要能够匹配目标组件的IntentFilter中所设置的过滤信息,不匹配将无法启动目标。IntentFilter中可以包含多个action、category、data,一个Activity可以有多个IntentFilter,一个Intent只要能匹配任意一组IntentFilter,就可以启动对应的Activity。

4.1 action的匹配规则

action是一个字符串,系统预定义了一些action,同时我们也可以自定义。action匹配要求Intent中的action存在且必须和过滤规则(IntentFilter)其中的一个action相同,注意它区分大小写。

4.2 category的匹配规则

category是一个字符串,系统预定义了一些category,同时我们也可以自定义。 category的匹配规则和action的匹配规则不同, Intent中可以不设置category,默认是

<category android:name="android.intent.category.DEFAULT" />

但如果一旦设置了category,那不管有几个category,需要每个都能和过滤规则(IntentFilter)的category相同。

4.3 data的匹配规则

data的匹配规则和action类似,如果过滤规则(IntentFilter)中定义了data,那么Intent也必须要定义一个可匹配的data。

data的结构:data由两部分组成,mimeType 和 URI。mimeType 指媒体类型,图片、文本、视频等格式。
URI的结构如下:

<scheme>://<host>:<port>/[<path>|<pathPrefix>|<pathPattern>]
例如:
http://www.baidu.com:80/search/info

scheme:URI的模式,比如http、filpe、content。

host:URI的主机名。

port:URI的端口号。

path、pathPrefix、pathPattern:这三个参数表示路径信息。path表示是完整路径,pathPattern也表示完整路径,不过里面可以包含通配符 " * " , pathPrefix表示路径前缀信息。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值