四大组件之Activity探索

在之前的学习和开发中,对一些重点的知识只是做了些简单的记录,现在总结下要点,做个学习笔记,方便记忆,那么先从使用最频繁的Activity开始了,主要通过下面三点来展开的:

  • 生命周期
  • 启动模式
  • IntentFilter匹配规则

一.生命周期解析

1. 典型情况下Activity的生命周期

(1)onCreate:表示正在创建,做一些初始化的工作,其中此方法的参数Bundle为该Activity上次被异常销毁保存的状态信息。

(2)onStart:表示正在启动,此时Activity可见但是不在前台,无法与用户交互。

(3)onResume:表示Activity获取焦点,此时Activity可见且在前台,并开始活动。

(4)onPause: 表示正在停止,可以做些数据存储/停止动画等操作,Activity切换时,旧的Activity会先调用onPause()方法,再启动新的Activity。

(5)onStop:表示即将停止,可以做稍微重量级回收工作,比如取消网络连接,注销广播接收器等, Activity切换时,如果新的Activity是透明主题,旧的Activity不会走onStop()方法。

(6)onDestroy:表示即将销毁,做回收工作/资源释放

(7)onRestart:表示Activity重新启动,由后台切换到前台,由不可见到可见。

2. Activity生命周期的切换过程

(1)启动一个Activity
onCreate() --> onStart() --> onResume()

(2)打开一个新Activity
旧的Activity的onPause() --> 新的Activity的onCreate() --> onStart() -->onResume --> 旧的Activity的onStop()

(3)返回到旧Activity
新Activity的onPause() --> 旧Activity的onRestart() --> onStart() --> onResume() --> 新Activity的onStop() --> onDestroy()

(4)Activity1上弹出对话框Activity2
Activity1的onPause() --> Activity2的onCreate() --> onStart() --> onResume()

(5)关闭屏幕/按Home键
Activity2的onPause() --> onStop() --> Activity1的onStop()

(6)唤醒屏幕/回到前台
Activity2的onRestart() --> onStart() --> Activity1的onRestart() --> onStart() --> Activity2的onResume()

(7)关闭对话框Activity2
Activity2的onPause() --> Activity1的onResume --> Activity2的onStop() --> onDestroy()

(8)销毁Activity1
onPause() --> onStop() --> onDestroy()

3.生命周期的各个阶段

(1)完整生命周期
Activity在onCreate()和onDestroy()之间所经历的,onCreate()方法中做初始化,onDestroy()方法中做资源的释放。

(2)可见生命周期
Activity在onStart()和onStop()之间所经历的过程,处于可见但是没有获取焦点,不能与用户交互。

(3)前台生命周期
Activity在onResume()和onPause()之间所经历的过程,处于可见且可交互状态。

4. onSaveInstanceState和onRestoreInstanceState

(1)出现时机:异常情况下Activity重建

(2)onSaveInstanceState:Activity被异常销毁时,用来保存状态,在onStop()方法之前执行,和onPause()方法没有时序关系。它和onPause()方法的区别在于,它是保存临时状态,onPause()方法是对数据的持久化保存。

(3)onRestoreInstanceState:Activity在重新创建时被调用,在onStart()方法之后执行。将onSaveInstanceState方法保存的Bundle对象作为参数传递到onRestoreInstanceState和onCreate()方法中,通过Bundle来恢复数据,注意一点,在onCreate方法中取出数据时一定要先判断onSaveInstanceState是否为空。

5.Activity异常情况下的生命周期

(1)由于资源相关配置发生改变,导致Activity被销毁和重新创建

当屏幕发生旋转,横竖屏切换时,Activity会被销毁重新创建,Activity的生命周期过程:
onSaveInstanceState --> onPause(不定)–> onStop --> onDestroy --> onCreate --> onStart --> onRestoreInstanceState --> onResume
为了避免Activity被销毁重建,可以在AndroidManifest.xml中设置Activity的configChanges属性为android:configChanges=“orientation|screenSize”,当屏幕再次旋转时就只会调用onConfigurationChanged方法。

(2)由于系统资源不足,导致优先级低的Activity被回收

Activity的优先级顺序:
前台可见Activity > 前台可见不可交互Activity(前台Activity弹出Dialog) > 后台Activity(用户按下HOME键、切换到其他应用),当内存不足时,会按照优先级从低到高的顺序杀死Activity,另外当一个进程没有四大组件在执行,这个进程很容易被系统杀死。

二.Activity四种启动模式

1.设置Activity启动模式的方法

(1)配置文件

AndroidManifest.xml中设置Activity的属性android:launchMode=“standard|singleInstance|single Task|singleTop”

(2)代码方式

通过标记位设定,intent.addFlags(Intent.xxx)。
最常用的两种标记位:
①FLAG_ACTIVITY_SINGLE_TOP:对应singleTop启动模式。
②FLAG_ACTIVITY_NEW_TASK :对应singleTask模式。

2.Activity四种启动模式

(1)standard:默认模式、标准模式

含义:每次启动一个Activity都会创建一个新的实例。需要注意的是,使用ApplicationContext启动standard模式的Activity会报错,因为standard模式的Activity会默认进入到启动它所属的任务栈,但是非Activity的Context没有所谓的任务栈。

(2)singleTop:栈顶复用模式

含义:如果新Activity已经位于任务栈的栈顶,则不会被重新创建,并回调onNewIntent(intent)方法,跳转页面时为了防止重复点击,创建多个实例,可以使用该模式。

(3)singleTask:栈内复用模式

含义:如果该Activity在任务栈中存在,都不会创建新的实例,并回调onNewIntent(intent)方法,该Activity之前的实例先一一出栈,使该Activity位于栈顶。如果该Activity在任务栈中不存在,那么要先寻找是否存在该Activity需要的任务栈,如果没有需要的任务栈,那先创建任务栈,再把该Activity放入其中,如果有需要的任务栈,就直接把Activity放入任务栈中。一般此模式使用在首页。

(4)singleInstance:单实例模式

含义:使用此模式的Activity单独位于一个任务栈中,且该任务栈只有唯一一个实例。

三.IntentFilter匹配规则

1.原则

(1)一个intent只有同时匹配某个Activity的intent-filter中的action、category、data才算完全匹配,才能启动该Activity。

(2)一个Activity可以有多个intent-filter,一个intent只要匹配一组intent-filter,就可以启动该Activity。

2.action匹配规则

(1)要求intent中action存在,且必须和intent-filter中的一个action相同。

(2)区分大小写。

3.category匹配规则

(1)intent中的category可以不存在,那是因为系统给该Activity添加了默认的属性值< category android:name=“android.intent.category.DEAFAULT” />。

(2)除上述情况外,如果有其他category,要求intent中的category必须和intent-filter中所有的category相同。

4.data匹配规则

(1)如果intent-filter中定义了data,那么intent中也必须要定义data。

(2)data主要由mimeType(媒体类型)和URI组成,在匹配时通过intent.setDataAndType(Uri data, String type)方法对data进行设置。

注意:采用隐式启动Activity时,可以通过PackageManager的resolveActivity方法或者intent的resolveActivity方法判断是否有Activity匹配该隐式。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值