04 Android Activity生命周期
文章目录
- 1 Activity 生命周期
- 1.1 生命周期
- 1.2 Android 开发的规则
- 2 设备配置变化,Activity被销毁
- 3 进出停止态
- 3.2 进出停止态的过程
- 4 进出暂停态
- 4.2 进出停止态的过程
- 5 样例一个秒表程序
- 5.1 View层
- 5.2 Controller层
- 5.2.1 使用匿名内部类
- 5.2.2 在Handler方法中使用对象
- 5.3 控制层代码
1 Activity 生命周期
Activity有三种状态:launched,running,destroyed
其中,Running为主要状态,Activity位于前台(可见)+获得
焦点(交互)
1.1 生命周期
- 状态过渡时会调用生命周期方法:onCreate()和onDestroy()
- 进入lauched状态,调用构造函数新建Activity对象
- 进入running状态前调用onCreate() ,进行初始化
- 处于running状态,Activity位于前台并获得焦点,可见交互
- 进入destroyed状态前调用onDestroy(),清理并释放资源
- 处于destroyed状态,该Activity对象已经消失
1.2 Android 开发的规则
- 不能覆盖Activity构造函数,App无main函数
- 只能覆盖生命周期方法,等待调用
2 设备配置变化,Activity被销毁
设备配置变化时,如屏幕旋转,需保存状态,重启时恢复
保存状态需要覆盖onSaveInstanceState()方法
设备配置变化时,如屏幕旋转,需保存状态,重启时恢复保存状态需要覆盖onSaveInstanceState()方法
Bundle在进程第一次新建Activity时为null
之后为onSaveInstanceState()保存的BundleonCreate()方法中,从Bundle存储的值恢复销毁前的状态
private int seconds = 0;private boolean running = false;private boolean wasRunning = false;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);Log.d("life cycle", "onCreate");setContentView(R.layout.activity_main);// 恢复保存的状态if (savedInstanceState != null) {seconds = savedInstanceState.getInt("seconds");running = savedInstanceState.getBoolean("running");wasRunning = savedInstanceState.getBoolean("wasRunning");}runTimer();}@Overridepublic void onSaveInstanceState(Bundle savedInstanceState) {super.onSaveInstanceState(savedInstanceState);// 保存当前的状态savedInstanceState.putInt("seconds", seconds);savedInstanceState.putBoolean("running", running);savedInstanceState.putBoolean("wasRunning", wasRunning);}
3 进出停止态
- App进入后台(HOME键),消失后处于停止态
3.2 进出停止态的过程
- 启动Activity调用onCreate() ,进行初始化
- 在可见前调用onStart(), onStart()返回后Activity可见
- 在消失前调用onStop(),onStop()返回后Activity消失
- 如果Activity再次可见,先调用onRestart(),再调用onStart()
- 销毁前调用onDestroy()
4 进出暂停态
Android7.0 (API 28)引入分屏,只有最近与用户交互过的 Activity 为活动状态该 Activity 为顶级 Activity
所有其他 Activity 虽然可见,但均处于暂停状态
暂停态:Activity失去焦点,停止与用户交互,但仍可见
获得失去焦点间循环:onResume 和onPause()
4.2 进出停止态的过程
- 启动Activity 调用onCreate() 进行初始化
- 可见前调用onStart(),返回后Activity可见
- 获得焦点前调用onResume(),返回后Activity与用户交互
- 失去焦点前调用onPause(),返回后Activity停止与用户交互
- 在消失前调用onStop(),onStop()返回后Activity消失
- 销毁前调用onDestroy(), APP从内存中消失
5 样例一个秒表程序
需求分析:
- 开始、停止与重置三种功能
- 旋转屏幕后,继续计时
- 失去焦点后不再计时
5.1 View层
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:layout_editor_absoluteX="48dp"tools:layout_editor_absoluteY="-62dp"><TextViewandroid:id="@+id/time_view"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="100sp"android:gravity="center_horizontal"android:text="00:00:00"android:textSize="60sp" /><Buttonandroid:id="@+id/button_start"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_horizontal"android:layout_marginTop="20sp"android:onClick="onClickStart"android:text="@string/button_start" /><Buttonandroid:id="@+id/button_stop"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_horizontal"android:layout_marginTop="20sp"android:onClick="onClickStop"android:text="@string/button_stop" /><Buttonandroid:id="@+id/button_reset"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_horizontal"android:layout_marginTop="20sp"android:onClick="onClickReset"android:text="@string/button_reset" /></LinearLayout></androidx.constraintlayout.widget.ConstraintLayout>
5.2 Controller层
如何完成秒表的刷新功能:
UI线程的特点:
- UI线程不能被阻塞,因此在运行时,不能在UI线程中使用sleep
- Android只允许UI线程更新界面,不允许后台线程更新界面
- 因此在UI线程中使用多线程,来延时提交刷新
- 使用UI线程的Handler定时更新
- 将任务封装到Runnable的run()方法中,
- 通过handler的post()或postDelay()方法提交给UI线程
5.2.1 使用匿名内部类
private void runTimer() {// 计时器更新方法final TextView timeView = this.findViewById(R.id.time_view);// 使用句柄Handler进行提交final Handler handler = new Handler();handler.post(new Runnable() {@Overridepublic void run() {// 秒数的时间算法int hours = seconds / 3600;int minutes = (seconds % 3600) / 60;int secs = seconds % 60;// 格式化字符String time = String.format("%d:%02d:%02d", hours, minutes, secs);// 显示时间timeView.setText(time);if (running) {seconds++;// 提交进行延迟}handler.postDelayed(this, 1000);}});}
5.2.2 在Handler方法中使用对象
5.3 控制层代码
public class MainActivity extends AppCompatActivity {// 常量的设置,设置秒数 以及 运行状态private int seconds = 0;private boolean running = false;private boolean wasRunning = false;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);Log.d("life cycle", "onCreate");setContentView(R.layout.activity_main);// 恢复保存的状态if (savedInstanceState != null) {seconds = savedInstanceState.getInt("seconds");running = savedInstanceState.getBoolean("running");wasRunning = savedInstanceState.getBoolean("wasRunning");}runTimer();}@Overridepublic void onSaveInstanceState(Bundle savedInstanceState) {super.onSaveInstanceState(savedInstanceState);// 保存当前的状态savedInstanceState.putInt("seconds", seconds);savedInstanceState.putBoolean("running", running);savedInstanceState.putBoolean("wasRunning", wasRunning);}@Overrideprotected void onDestroy() {super.onDestroy();Log.d("life cycle", "onDestroyed");}// 生命周期 onStart onStop 方法@Overrideprotected void onStart() {super.onStart();// 修改running的状态, 如果上一次处于运行状态,则恢复运行状态
// if (wasRunning) {// running = true;
// }}@Overrideprotected void onStop() {super.onStop();
// wasRunning = running; // 保存运行的状态
// running = false; // 程序进入后台, 秒表停止计时}@Overrideprotected void onResume() {super.onResume();if (wasRunning) {running = true;}}@Overrideprotected void onPause() {super.onPause();wasRunning = running;running = false;}// 进行页面的刷新/** 页面刷新的限制* 1. UI线程不能被阻塞,因此在运行时,不能在UI线程中使用sleep* 2. Android只允许UI线程更新界面,不允许后台线程更新界面** */private void runTimer() {// 计时器更新方法final TextView timeView = this.findViewById(R.id.time_view);// 使用句柄Handler进行提交final Handler handler = new Handler();handler.post(new Runnable() {@Overridepublic void run() {// 秒数的时间算法int hours = seconds / 3600;int minutes = (seconds % 3600) / 60;int secs = seconds % 60;// 格式化字符String time = String.format("%d:%02d:%02d", hours, minutes, secs);// 显示时间timeView.setText(time);if (running) {seconds++;// 提交进行延迟}handler.postDelayed(this, 1000);}});}// 分别对常量进行设置public void onClickStart(View view) {running = true;}public void onClickStop(View view) {running = false;}public void onClickReset(View view) {running = false;seconds = 0;}}
04 Android Activity生命周期相关推荐
- Android Activity 生命周期详解及监听
前言 系列文章: Android Activity 与View 的互动思考 Android Activity 生命周期详解及监听 Android onSaveInstanceState/onResto ...
- Android activity 生命周期(一)
Android activity 生命周期(一) 转载请注明出处:http://blog.csdn.net/chenlinfeng772885775/article/details/53672919 ...
- Android activity生命周期
这篇博客主要包含以下知识点: activity介绍. activity生命周期的详细过程(不同情况下的变化以及状态的改变).finish和onDestory方法的关系.onSaveInstanceSt ...
- Android Activity生命周期举例说明(图文)
同学电话面试提及到Activity生命周期的详细说明,现整理如下: 转载请标明姓名及出处:大飞_Rflyee - http://blog.csdn.net/rflyee/article/details ...
- android activity生命周期_Android岗高频面试题合一集,看你能答出几题?
前言 面试季黄金时期来袭,想必许多朋友在这时有找工作.换工作.跳槽涨薪等想法,但你们都有一个相同的过程那就是面试.大家肯定想知道面试时都问哪些面试相关问题,所以就去网上查找题去刷题,为了省去大家找题的 ...
- android 生命周期管理,Android Activity生命周期和堆栈管理的详解_Android_脚本之家...
Activity的生命周期 Activity是Android中的四大组件之一,也是最基本,最重要的组件,是android系统提供一个可视化的,能与用户交换的组件. 系统提供的组件,不需要用户实例化,用 ...
- Android Activity 生命周期和重要的相关函数(基础一)
总结: 1.oncreate 2.onstart 可见但不交互 3.onrestart 从其他界面重新调转过来 4.onresume 可交互 5.on ...
- xamarin Android activity生命周期详解
学Xamarin我为什么要写这样一篇关于Android 的activity生命周期的文章 已经学Xamarin android有一段时间了,现在想起当初Xamarin也走了不少的弯路.当然Xamari ...
- Android Activity生命周期管理
http://blog.csdn.net/thl789/article/details/6628463 本文描述Android中Activity的状态,Activity的状态转换,从而总结了Activ ...
最新文章
- 手游linux服务器时间同步问题
- 这样也可以,insert,,
- echsop privilege.php?act=login,ecshop 后台登陆自动退出的一种可能情况(目录大小写问题)...
- zoj 3762(求三角形的最大高)
- SpringBoot整合Spring Security——登录管理
- Linux 免密码sudo
- java拦截器项目应用_使用拦截器分析Java EE应用程序的性能下降/提高
- Java开启/关闭tomcat服务器
- 《Java核心技术 卷Ⅱ 高级特性(原书第10版)》一3.6.2 使用StAX解析器
- JAVA企业级应用服务器之TOMCAT实战
- 拓扑排序:如何确定代码源文件的编译依赖关系
- 8086cpu学习笔记(1):系统结构
- Day46:数据库引擎、索引、pymysql
- 【2022最新罗技G502吃鸡宏】
- 如何在libfetion上使用ibus输入法
- AS找回被删除的文件
- 1G、2G、3G、4G和5G有什么区别?5G的原理是什么?
- VMware14安装windows7的详细过程
- 超五类屏蔽双绞线和计算机电缆区别,超五类单屏网线和六类单屏蔽网线的区别是什么?...
- 组装一台台式计算机的流程,如何组装电脑?组装电脑的操作流程!
热门文章
- 面试不是无情物,参数注解知多少?
- Cs束氢脉泽原子钟行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
- Android漂浮碰壁动画
- 【python实战】---- 30行代码提取个人值班表
- oppo锁频段_OPPO手机这样设置,让你的网络更加稳定!
- 有一头小母牛(0岁),它从第四年(3岁)开始,每年都生一头小母牛(一年只生一头),而且,所以的小母牛也都会在第四年开始生育。假设所有的母牛都不会死,请问:第n年,此牛群共有多少头母牛?
- 在MySQL中创建实现自增的序列(Sequence)的教程
- CTF练习 TU-ctf-2016 pwn woO-50
- GEA 3.2 C/C++ 的数据、代码及内存
- 爱奇艺奇遇Dream正式发布:仅售1999,国民级VR来了