2021-04-03

activity生命周期

android中用到最多的就是activity,它也是android的四大组件之一,开发过程中也是最常用到的组件,所以我们有必要去掌握它在程序运行的生命周期是怎么回事

在了解activity的生命周期之前,先了解下它的活动状态,每个活动在生命周期中最多会有四种状态:

运行状态
当一个活动位于任务栈的栈顶时,则该活动处于运行状态。

暂停状态
当一个活动不再处于栈顶位置,但依然可见时,则该活动就进入了暂停状态。

停止状态
当一个活动不再处于栈顶位置,并且完全不可见的时候,这时该活动就进入了停止状态。

销毁状态
当一个活动从任务栈中移除后就变成了销毁状态。

在了解完活动状态后,再来看下活动的生命周期,activity类中定义了有七个回调方法,下面类介绍下这七个回调方法:

onCreate()
这个方法在activity出现的次数最多了,在活动中我们都会重写这个方法,它在活动第一次被创建的时候调用,所以在方法中完成活动的初始化操作,比如加载布局文件、初始化View、事件绑定等。

onStart()
在活动在屏幕上由不可见变为可见的时候该方法被调用。在这个时候界面是不可交互的。

onResume()
在活动准备好可以和用户进行交互的时候该方法被调用。此时的活动是处于任务栈的栈顶,并且处于运行状态。

onPause()
在活动处于可见但不可见交互时候该方法被调用。在这个时候我们可以通过在这个方法中将一些消耗CPU的资源释放掉,以及保存活动状态。

onStop()
在活动完全不可见的时候该方法被调用。也就是完全被另一个活动覆盖了。

onDestroy()
活动被销毁之前调用。这之后活动就将变为销毁状态。

onRestart()
在活动重新启动,也就是说该活动由停止状态变为运行状态时调用。

以上这个七个方法除了onRestart()方法之外,其他方法都是一一对应的,从而分为三类:

第一类:**onCreate()和onDestroy()**两个方法是对应,onCreate()方法中完各种初始化操作,在onDestroy()方法中释放内存等操作。

第二类:**onStart()**和 **onStop()**两个方法对应,在这两个方法之间活动对于用户来说总是可见的。我们也可以通过这个两个方法类合理的管理对用户可见的资源,比如在onStart()方法中对资源的加载,在onDestroy()方法中对资源的释放,保存处于停止状态的活动不会占用过多的内存。

第三类:**onResume()和onPause()**两个方法对应,在两个方法之间活动处于运行状态的并且可以和用户进行交互。

以上就是activity生命周期的理论知识,我们通过实践,看activity的七个回调方法在那种情况下会被调用,这也是我们在实际开发中所遇到的各种情况。

第一种情况:当启动AActivity执行生命周期的情况:
在这里插入图片描述

上图可以看到,当AActivity第一次启动的时候会一次执行onCreate()–>onStart()–>onResume()

第二种情况:关闭AActivity时情况:
在这里插入图片描述

上图可以看出,关闭一个活动依次执行AActivity的onPause()–>onStop()–>onDestroy()

第三种情况:在AActivity界面中按home键,然后在进入AActivity时执行生命周期情况:
在这里插入图片描述

如上图,按住home键时依次执行AActivity的onPause()–>onStop()
在返回到AActivity界面的时候依次执行了AActivity的onRestart()–>onStart()–>onResume(),在这里注意下,应该AActivity活动处于停止状态,所以执行了onRestart()方法,而onCreate()方法不会执行,是因为AActivity并没有重新创建。

第四种情况:在AActivity界面中按锁屏键,然后在进入AActivity时执行生命周期情况:
在这里插入图片描述

如上图,在按住锁屏键和home键执行的生命周期是一样的,这里可以说明两个方式执行都是让AActivity活动变成停止状态,在进入时让AActivity活动从停止状态变成运行状态。

第五种情况:从AActivity启动BActivity执行情况:

在这里插入图片描述

如上图,在AActivity启动BActivity时,先后执行了AActivity的onPause()–>然后执行BActivity的onCreate()–>onStart()–>onResume()–>最后再执行AActivity的onStop()

第六种情况:从BActivity中返回到AActivity时执行情况:
在这里插入图片描述

如上图可以看出,在BActivity返回到AActivity时先后执行了BActivity的onPause()–>然后执行AActivity的onRestart()–>onStart()–>onResume()–>再执行BActivity的onStop()–>onDestroy(), 前面也提到了,这里还是要注意,之前AActivity处于停止状态,所以onRestart()方法会被执行,但是AActivity得onCreate()方法不会执行, 因为AActivity并没有重新创建。

第七种情况:从AActivity启动一个Dialog的Activity(在这里称为DActivity),然后在返回AActivity时执行情况:
在这里插入图片描述

如上图,在AActivity启动一个Dialog的Activity (这里注意了,这个DActivity是带有Dialog的透明背景的Avtivity,如果在AActivity上直接弹出Dialog则AActivity的生命周期都不会执行,因为在直接弹出Dialog时相当于在Window添加了一个View,所以不会对AActivity的生命周期有任何影响) 先后执行AActivity的onPause()–>然后执行DActivity的onCreate()–>onStart()–>onResume(),在这里可以看出AActivity界面是可见的,所以只执行了AActivity的onPause()方法
在DActivity返回到AActivity的时候,先后执行了DActivity的onPause()–>然后执行AActivity的onResume()–>再执行DActivity的onStop()–>onDestroy()。

还有一些情况,当AActivity上带有一个Dialog时,按住home键执行的生命周期和情况三一样,按住锁屏键和情况四一样,这里就不做演示了

在这里插入图片描述
1.启动Activity:系统会先调用onCreate方法,然后调用onStart方法,最后调用onResume,Activity进入运行状态。

2.当前Activity被其他Activity覆盖其上或被锁屏:系统会调用onPause方法,暂停当前Activity的执行。

3.当前Activity由被覆盖状态回到前台或解锁屏:系统会调用onResume方法,再次进入运行状态。

4.当前Activity转到新的Activity界面或按Home键回到主屏,自身退居后台:系统会先调用onPause方法,然后调用onStop方法,进入停滞状态。

5.用户后退回到此Activity:系统会先调用onRestart方法,然后调用onStart方法,最后调用onResume方法,再次进入运行状态。

6.当前Activity处于被覆盖状态或者后台不可见状态,即第2步和第4步,系统内存不足,杀死当前Activity,而后用户退回当前Activity:再次调用onCreate方法、onStart方法、onResume方法,进入运行状态。

7.用户退出当前Activity:系统先调用onPause方法,然后调用onStop方法,最后调用onDestory方法,结束当前Activity。

Java运算符的使用

运算符基本分为六类:算数运算符、赋值运算符、比较/关系运算符、逻辑运算符、位运算符、三元/三目/条件运算符。
Java是一门强类型的语言,对每种数据类型都严格划分了数据类型。
1、算数运算符都包括:加(+)、减(-)、乘(*)、除(/)、取模(%)、自增(++)、自减(–)、字符串连接符(+)。
使用规则:

  1. byte/short在运算的时候会自动的提升为int,然后进行运算,运算结果为int。
  2. 同一个类型参与运算,结果的类型与参与运算的类型一致。
  3. 如果运算过程中有大类型参与了运算,结果一定是大类型
  4. 由于绝大部分小数在转化成二进制的时候是无限小数,所以double类型在存储小数的时候也没有办法精确存储,因此也没有办法来精确运算。
  5. 整数/0 :ArithmeticException(算数异常)。
    任意非0数字/0.0或者是任意小数/0 :Infinity(无穷大)。
    0/0.0->NaN-> Not a Number(非数字)NaN和任何值都不相等包括其本身。
    判断一个对象是否是NaN只有一个方法isNaN();
    在这里插入图片描述
    大家在生活中熟知的加减除与java中的用法一样
    %(取模运算符/取余)
    在做取余运算的时候,先按正数进行取余,然后看%左边数字的符号,如果%左边的数字是正数,那么结果就是正数。
    3.2 % 2 = 1.2 5.4%1.7=0.3 -3.5%1.7=-0.1
    ++/–(自增自减运算)
    相当于在原来的基础之上自增/自减1。
    ++ 在变量名之前,表示先自增,自增完成之后才会参与其他运算。
    ++ 在变量名之后,表示先拿变量的原来的值参与运算,然后再自增。
    +(字符串拼接符/连接符)
    “a”+”b” —>”ab” 2+3+”a”—>”5a”
    可以利用+将两个字符串进行拼接,或者也可以利用+将任何数据与字符串进行拼接。

赋值运算符

十二个运算符:=(等于) +=(加等) -=(减等) *=(乘等) /=(除等) %=(取余等) &=(与等) |=(或等) ^=(异或等) <<=(左移等) >>=(右移等) >>>=(无符号右移等)
注意:除了=以外,其余的赋值运算符要求这个变量必须有初始值。
byte/short可以参与赋值运算,运算结果仍是原类型。

关系 运算符/比较运算符

关系运算符又叫比较运算符。
七个运算符:==等于、!= 不等于、>(大于) 、<(小于)、>=(大于等于)、<=(小于等于)、instanceof(判断对象于实例的关系)。它们的结果全是boolean型
instanceof
用于判断对象是否是否对应类的实例的。
“abc” instanceof String -> true
运算完成之后结果是一个boolean类型的值。

逻辑运算符

六个运算符:&与(And)、|或(Or)、!非(Not)、^异或、&&短路与、||短路或
1.&运算规则:
true&true=true true&false=false false&true=false false&false=false
见false为false。
2.|运算规则:
true|true=true true|false=true false|true=true false|false=false
见true为true。
3.!运算规则:
!true=false !false=true
非否即是,非是即否。
4.^运算规则:
true^true=false true^false=true false^true=true false^false=false
相同则为false,不同则为true。
5.&&运算规则:
对于&&而言,如果前边的表达式的结果为false,则后边的表达式就不再运算。
6.||运算规则:
对于||而言,如果前边的表达式的结果为true,则后边的表达式就不再运算。
注意:短路特性可以提高代码的运算速度。

位运算符

7个运算符号:
&(与)、|(或)、 ^(异或)、<<(左移)、>>(右移)、>>>(无符号右移)、~(取反)
注意:位运算针对的是整数,运算的是数据的补码
可以利用&来判断是否是奇偶数。
1.原、反、补码
数据在计算机中是以补码形式来存储的。最高位是一个符号位:如果是正数,最高位为0,如果是负数,最高位为1。对于正数而言,原反补三码一致。负数的反码是在原码的基础上,最高位不变,其余位0变1,1变0,负数的补码是在反码的基础上+1。
6- 00000000 00000000 00000000 00000110—原码/反码/补码
-6 - 10000000 00000000 00000000 00000110—原码
11111111 11111111 11111111 11111001—反码
11111111 11111111 11111111 11111010—补码
11111111 11111111 11111111 11101101—补码
11111111 11111111 11111111 11101100—反码
10000000 00000000 00000000 00010011—原码— -19
奇数^偶数=奇数
a ^ b ^ b = a; b ^ b ^ a = a
注意:
Java中所有的数值类型的数据都是有符号的。
baty/short参加左移和右移和无符号右移结果为int。
一个数字右移几位就是将这个数字除以2的几次方,然后取整。
取反快捷运算:~i= - i - 1

三元运算符

三元运算符又叫三目运算符,还可叫做条件运算符。
1.格式
逻辑值 ? 表达式1 :表达式2;
int i = 4, j = 7;
int k = i > j ? i : j;
System.out.println(k);//结果为j。
2.执行顺序:
如果逻辑值为true的话,执行表达式1,;反之执行表达式2。
①三元表达式在运算完成之后必须有一个结果。
//不允许,运算完成之后,没有结果。
A > b ? System.out.println( a ) : System.out.println( b );
②表达式1和表达式2的结果必须是相同类型或相容。
double d = a > b ? a * 2 : a * 2.5;
③在三元表达式形成嵌套的时候,尽量添加()来提高代码的可读性
int max = a > b ? ( a > c ? a : c ) : ( b > c ? b : c );

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值