Android 开发四大组件之 Activity

Android 开发四大组件之 Activity

Android小彩虹2021-07-24 20:50:04260A+A-

1. 什么是 Activity

Activity 作为 Android 四大组件之一,它有着举足轻重的地位,每一个 Activity 都会获得一个用于绘制其用户界面的窗口,Activity 是一个 View 对象的容器,通过 Window 类的 setContentView() 方法添加到 Activity 上,最终提供与用户交互的界面。

2. Activity 生命周期

生命周期:onCreate() -> onStart() - > onResume() -> onPause() -> onStop() -> onDestroy()

在这里插入图片描述
(1) onCreate

Activity 生命周期的第一个方法,表示 Activity 正在被创建,在该方法中通过setContentView 方法加载xml编写的布局文件,然后通过 findByViewId 方法获取控件; onCreate() 方法在 Activity 整个生命周期中只会调用一次,所以该方法中就可以做一些大致只需要做一次的工作,如:一些变量的初始化,资源的加载,初始化控件以及事件的绑定等; 由于此时 View 还没有加载出来,因此该方法中不能开启动画的; 注:onCreate() 的官方文档注释,建议 setContentView()、findViewById() 在 onCreate() 中调用,但在onStart()中调用 setContentView()、findViewById() 功能也是正常的,只是不建议,并且很少会这样做;

(2) onStart

Activity 正在启动,此时 Activity 已经看见,但是没有展现在前台,没有获取到焦点,当然也就不能与用户交互; 因为该方法是 Activity 重新回到前台时第一个回调的方法,因此在该方法里我们可以去检查某些必须的系统特性是否可用,比如网络是否在连接, GPS 是否打开等类似的功能; 该方法中我们通常初始化一些变量,当然这些变量必须是在 Activity 处于前台的时候才能够被响应;

(3) onResume

Activity 可见可交互; 如果 Activity 是重新打开,此时就需要在该方法中重新实例化在 onPause() 中释放的资源; 初始化在前台显示时需要的资源,如:动画、播放视频,此外建议在 onResume() 中打开独占设备,比如相机,之所以在该方法中打开是因为当打开新的 Activity 时,首先会 onPause 掉旧 Activity,然后再 onCreate, onStart, onResume 新 Activity,如果之前旧 Activity 已经打开了独占设备(相机), 那此时onPause 旧 Activity 时就可以释放掉独占设备(相机),那么打开的新 Activity 就能够使用独占设备(相机)了;

(4) onPause

Activity 已经暂停,可见但不在前台,因此也不可交互; 该方法中需要持久化用户数据、停止动画,暂停正在播放的视频等不太耗时的操作; 释放部分占用的系统资源(尤其是独占设备),如:相机, GPS 等,设置有时会让该Activity 断开网络连接,因为这些工作会大幅度占用系统资源,增加电耗或者流量消耗; 因为打开新的 Activity 前回去回调旧 Activity 的 onPause方法,因此 onPause 方法中不能做太耗时的操作(如,数据库读写,IO 操作),否则调新的 Activity 在切换时可能会出现卡顿现象,这是用户不想看到的; 耗时的清理工作应该放在 onStop 方法中;

(5) onStop

Activity 即将停止,此时当然不可见; 耗时的清理工作应该放在 onStop 方法中; Activity 在此状态时仍然存在于内存中,如果在系统内存不够时,系统接下来很快会销毁掉该 Activity,在极端情况下,直接 kill Activity 且不执行onDestroy()函数。所以务必在 onStop() 函数中就清理掉可能引起内存泄露的资源,当然更极端的时系统内存已严重不足,导致系统无法保留该进程的情况下,onStop() 可能都不会被执行;

(6) onDestory

Activity 即将被销毁, 很多情况下 Activity 是不需要定义这个函数,因为在 onPause() 和 onStop() 中,大多数的清理工作都已经完成了。但是,如果在 onCreate() 中定义了后台线程,或者可能引起内存泄露的代码,那就需要在 onDestroy() 中清理,如,静态对象持有其他 Activity 的引用,广播注销等操作;

(7) onRestart

Activity 正在被重新启动 在原 Activity 没有销毁时重新要回到该 Activity 时会回调该方法,紧接着会回调onStart 方法,一般在该方法中恢复用户数据;

注意点

a.单个 Activity 启动回调流程

  • onCreate
  • onStart
  • onResume

b. 当用户按下 home 键时

  • onPause
  • onStop

c. 当用户按back键时

  • onPause
  • onStop
  • onDestory

d. 当用户再次回到原 Activity 时

  • onRestart
  • onStart
  • onResume

e.在A Activity 的基础上,打开新的 B Activity,此时需要注意的问题是 B Activity的大小和透明度 1). B Activity 完全覆盖 A Activity,并且 B Activity是不透明的:

  • A Activity: onPause
  • B Activity: onCreate --> on Start --> onResume
  • A Activity : onStop

2). B Activity 因为尺寸小没有完全覆盖 A Activity,或者 B Activity是透明的, 此时 A Activity 的 onStop 方法是不会被执行的

  • A Activity: onPause
  • B Activity: onCreate --> on Start --> onResume

f. 横竖屏切换时 Activity 的生命周期 此时的生命周期跟清单文件里的配置有关系。 1.不设置 Activity 的 android:configChanges 时,切屏会重新调用各个生命周期默认首先销毁当前 Activity,然后重新加载。

2.设置 Activity android:configChanges=”orientation|keyboardHidden|screenSize”时,切屏不会重新调用各个生命周期,只会执行 onConfigurationChanged 方法。

3. 如何在 APP 退出的时候结束所有的 Activity

  1. 发送特定广播 在需要结束应用时,发送一个特定的广播,每个 Activity 收到广播后,关闭;

  2. 递归退出 在打开新的 Activity 时使用 startActivityForResult,然后自己加标志,在 onActivityResult 中处理,递归关闭。

  3. 其实也可以通过 intent 的 flag 来实现 intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) 激活一个新的 Activity。此时如果该任务栈中已经有该 Activity,那么系统会把这个 Activity 上面的所有 Activity 干掉。其实相当于给 Activity 配置的启动模式为 SingleTop。

4.Activity 的启动模式

  • standard 模式:标准模式 在不指定启动模式的前提下,系统默认使用该模式启动 Activity,每次启动一个 Activity 都会重写创建一个新的实例,不管这个实例存不存在,这种模式下,谁启动了该模式的 Activity,该 Activity 就属于启动它的 Activity 的任务栈中。

  • singleTop 模式:栈顶复用模式 如果新的activity已经位于栈顶,那么这个Activity不会被重写创建,同时它的onNewIntent方法会被调用,通过此方法的参数我们可以去除当前请求的信息。如果栈顶不存在该Activity的实例,则情况与standard模式相同。需要注意的是这个Activity它的onCreate(),onStart()方法不会被调用,因为它并没有发生改变。

  • singleTask 模式:栈内复用模式 在这个模式下,如果栈中存在这个 Activity 的实例就会复用这个 Activity,不管它是否位于栈顶,复用时,会将它上面的 Activity 全部出栈,并且会回调该实例的onNewIntent 方法。其实这个过程还存在一个任务栈的匹配,因为这个模式启动时,会在自己需要的任务栈中寻找实例,这个任务栈就是通过 taskAffinity 属性指定。如果这个任务栈不存在,则会创建这个任务栈。

  • singleInstance 模式:全局唯一模式 该模式具备 singleTask 模式的所有特性外,与它的区别就是,这种模式下的Activity 会单独占用一个 Task 栈,具有全局唯一性,即整个系统中就这么一个实例,由于栈内复用的特性,后续的请求均不会创建新的 Activity 实例,除非这个特殊的任务栈被销毁了。以 singleInstance 模式启动的 Activity 在整个系统中是单例的,如果在启动这样的 Activiyt 时,已经存在了一个实例,那么会把它所在的任务调度到前台,重用这个实例。

点击这里复制本文地址 以上内容由权冠洲的博客整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!

支持Ctrl+Enter提交

联系我们| 本站介绍| 留言建议 | 交换友链 | 域名展示
本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除

权冠洲的博客 © All Rights Reserved.  Copyright quanguanzhou.top All Rights Reserved
苏公网安备 32030302000848号   苏ICP备20033101号-1
本网站由 提供CDN/云存储服务

联系我们