Activity使用相关总结

本文详细解析了Android中Activity的生命周期,包括onCreate、onRestart、onStart、onResume、onPause、onStop、onDestroy等关键阶段的作用及调用时机。探讨了Activity的自动重启机制,如何防止屏幕旋转导致的重启,以及onSaveInstanceState和onRestoreInstanceState在状态保存和恢复中的作用。同时,介绍了Activity的四种启动模式及其区别,并讲解了Activity的启动方式,包括显式启动和隐式启动,以及如何避免隐式意图跳转时的空指针异常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Activity的生命周期图:

image

onCreate :正在创建Activity,会进行一些初始化操作,会调用setContentView去加载布局视图文件

onRestart : 当用户操作Home键,或打开新的activity又回退回来时,会调用

onStart : Activity正在被启动,但当前Activity还没有被加载到前台,不能与用户进行交互.

onResume : Activity启动完成,被加载到了前台,可与用户进行交互,可以理解成获取到了焦点.

onPause : Activity正在停止,也可以理解为Activiy失去焦点

onStop : Activity即将停止

onDestory : Activity即将被销毁


onStart和onStop,onResume和onPause的关系 :

onStart和onStop,是从当前界面可见不可见的角度来分析的;而onResume和onPause是从是否加载到前台,是否能与用户进行交互来分析的.


Activity的自动重启:
1. 资源相关的系统配置发生改变导致Activity被杀死并重新创建.

2. 系统内存不足导致优先级低的Activity被杀死.

onSaveInstanceSate和onRestoreInstanceSate:

Activity正常情况下的关闭,是不会调用onSaveInstanceSate和onRestoreInstanceSate的;

在Activity异常情况下被杀死,例如屏幕旋转,会调用onSaveInstanceSate进行当前Activity状态的保存,其调用和onPause没时间顺序关系,但是在onStop之前;在Activity重启被重新创建的时候会调用onRestoreInstanceState进行数据的恢复,并且还会将在onSaveInstanceSate保存的Bundle对象传递给onCreate和onRestoreInstanceState.

在状态保存中,例如 文本框内被输入的文字,RecycleView滑动的位置等等都会被保存;

其保存的流程为:Activity被杀死前,首先会调用onSaveInstanceState委托其保存数据,而onSaveInstanceState会委托Window保存数据,而Window会委托视图顶级容器去保存数据,视图顶级容器会逐一遍历其子元素,通知他们去进行数据的保存.


防止屏幕旋转:

在请单文件的activity中配置如下属性:

android:configChanges="orientation"

configChanges的其他属性:

这里写图片描述


Activity的优先级:

  1. 处于前台的Activity,正在与用户进行交互的Activity,优先级最高
  2. 可见但非前台的Activity,例如当前正在交互的是一个弹窗,其后面是一个Activity
  3. 处于后台的Activity优先级最低,在系统运行内存不足时,往往是被杀死的对象.

Activity的四种启动模式:

standard ,singleTop,singleTask,singleInstance

standard :
standard是activity的默认启动模式,每次创建的Activity都会被加入到activity任务栈中.

singleTop:
设定singleTop启动模式的activity如果在栈顶,则不会去重新创建,会使用当前对象,并调用其onNewIntent()函数,如果不在栈顶会重新创建出一个新的activity

singleTask: 至始至终只会存在一个实例对象,在创建之前,首先会看需要的任务栈是否存在如果不存在,就先创建任务栈,再创建activity;如果任务栈存在,那么就查看activity实例对象是否存在,如果不存在就是创建,并放于任务栈栈顶,如果存在且在于任务栈栈顶,则不创建,且调用其onNewIntent()函数,如果存在且不存在于栈顶,则在其上的activity将全部出栈,该activity移至栈顶位置,并且调用onNewIntent()函数,

singleInstance: 具备singleTask所有特性,与之不同的一个在于singleInstance是存在于单独的一个任务栈


Activity的启动方式:
1. 显式启动,就直接指定跳转的activity
2. 隐式启动,通过订单文件中配置的IntentFilter


避免隐示意图跳转空指针:

public abstract List<ResolveInfo>gueryIntentActivities(Intent intent, int flags);
public abstract Resolvelnfo resolveActivity(Intent intent, int flags);

调用PackageManager下的queryIntentActivities或者Intent的resolve,当返回值不为空,跳转则一定成功,其还有一个前置条件,就是第二个参数flag,需要设定为:MATCH_DEFAULT_ONLY,这样只会返回包含有

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

的Activity,否则还会返回不含有该category的Activity,在规则中,隐示意图必须含有该category


IntentFilter的匹配规则

IntentFilter包含三类别:action,category,data

一个activity中可以包含有多组IntentFilter,而在activity中只需要匹配成功一组就能够成功跳转

action : 定义一段字符串,且区分大小写,在隐式意图跳转中,Intent必须含有一个action,并且完全匹配定义中的任意一个action

category : 定义一段字符串,在隐式意图跳转中,可以不含有,因为在startActivity或者startActivityForResult,会默认为Intent添加android.intent.category.DEFAULT;如果为了能够支持隐式跳转必须定义一条:

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

data:

data由两部分组成,mimeType和URL,mimeType指定媒体类型
在隐式意图跳转中,必须含有一个data

在隐式意图跳转中,必须要使用setDataAndType,如果使用setData或者setType会覆盖掉对方的值

<data android:mimeType="video/*" //指定媒体类型
      android:scheme="String"    //指定URI的模式,例如http,file,content等等
      android:host="String"      //指定URI的主机名,例如 http://www.baidu.com
      android:port="String"      //指定URI的端口号
      android:path="String"      //指定URI的路径信息
      android:pathPattern="String"//指定URI的路径信息
      android:prefix="String"/>   //指定URI的路径信息

scheme:如果不指定,整个URI都没有意义,但都含有默认的scheme(file,content),但仅只局限于file,content

host:在data中必须指定,如果不指定,整个URI都没有意义

port : 必须是在scheme,host指定后才有意义


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值