文章目录

  • 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()
  1. 进入lauched状态,调用构造函数新建Activity对象
  2. 进入running状态前调用onCreate() ,进行初始化
  3. 处于running状态,Activity位于前台并获得焦点,可见交互
  4. 进入destroyed状态前调用onDestroy(),清理并释放资源
  5. 处于destroyed状态,该Activity对象已经消失


1.2 Android 开发的规则

  • 不能覆盖Activity构造函数,App无main函数
  • 只能覆盖生命周期方法,等待调用

2 设备配置变化,Activity被销毁

设备配置变化时,如屏幕旋转,需保存状态,重启时恢复
保存状态需要覆盖onSaveInstanceState()方法

  • 设备配置变化时,如屏幕旋转,需保存状态,重启时恢复保存状态需要覆盖onSaveInstanceState()方法

  • Bundle在进程第一次新建Activity时为null
    之后为onSaveInstanceState()保存的Bundle

  • onCreate()方法中,从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 进出停止态的过程

  1. 启动Activity调用onCreate() ,进行初始化
  2. 在可见前调用onStart(), onStart()返回后Activity可见
  3. 在消失前调用onStop()onStop()返回后Activity消失
  4. 如果Activity再次可见,先调用onRestart()再调用onStart()
  5. 销毁前调用onDestroy()

4 进出暂停态

  • Android7.0 (API 28)引入分屏,只有最近与用户交互过的 Activity 为活动状态该 Activity 为顶级 Activity

  • 所有其他 Activity 虽然可见,但均处于暂停状态

  • 暂停态:Activity失去焦点,停止与用户交互,但仍可见

  • 获得失去焦点间循环:onResume 和onPause()

4.2 进出停止态的过程

  1. 启动Activity 调用onCreate() 进行初始化
  2. 可见前调用onStart(),返回后Activity可见
  3. 获得焦点前调用onResume(),返回后Activity与用户交互
  4. 失去焦点前调用onPause(),返回后Activity停止与用户交互
  5. 在消失前调用onStop(),onStop()返回后Activity消失
  6. 销毁前调用onDestroy(), APP从内存中消失

5 样例一个秒表程序

需求分析:

  1. 开始、停止与重置三种功能
  2. 旋转屏幕后,继续计时
  3. 失去焦点后不再计时

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线程的特点:

  1. UI线程不能被阻塞,因此在运行时,不能在UI线程中使用sleep
  2. Android只允许UI线程更新界面,不允许后台线程更新界面
  • 因此在UI线程中使用多线程,来延时提交刷新
  1. 使用UI线程的Handler定时更新
  2. 将任务封装到Runnable的run()方法中
  3. 通过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生命周期相关推荐

  1. Android Activity 生命周期详解及监听

    前言 系列文章: Android Activity 与View 的互动思考 Android Activity 生命周期详解及监听 Android onSaveInstanceState/onResto ...

  2. Android activity 生命周期(一)

    Android activity 生命周期(一) 转载请注明出处:http://blog.csdn.net/chenlinfeng772885775/article/details/53672919 ...

  3. Android activity生命周期

    这篇博客主要包含以下知识点: activity介绍. activity生命周期的详细过程(不同情况下的变化以及状态的改变).finish和onDestory方法的关系.onSaveInstanceSt ...

  4. Android Activity生命周期举例说明(图文)

    同学电话面试提及到Activity生命周期的详细说明,现整理如下: 转载请标明姓名及出处:大飞_Rflyee - http://blog.csdn.net/rflyee/article/details ...

  5. android activity生命周期_Android岗高频面试题合一集,看你能答出几题?

    前言 面试季黄金时期来袭,想必许多朋友在这时有找工作.换工作.跳槽涨薪等想法,但你们都有一个相同的过程那就是面试.大家肯定想知道面试时都问哪些面试相关问题,所以就去网上查找题去刷题,为了省去大家找题的 ...

  6. android 生命周期管理,Android Activity生命周期和堆栈管理的详解_Android_脚本之家...

    Activity的生命周期 Activity是Android中的四大组件之一,也是最基本,最重要的组件,是android系统提供一个可视化的,能与用户交换的组件. 系统提供的组件,不需要用户实例化,用 ...

  7. Android Activity 生命周期和重要的相关函数(基础一)

    总结: 1.oncreate 2.onstart            可见但不交互 3.onrestart         从其他界面重新调转过来 4.onresume       可交互 5.on ...

  8. xamarin Android activity生命周期详解

    学Xamarin我为什么要写这样一篇关于Android 的activity生命周期的文章 已经学Xamarin android有一段时间了,现在想起当初Xamarin也走了不少的弯路.当然Xamari ...

  9. Android Activity生命周期管理

    http://blog.csdn.net/thl789/article/details/6628463 本文描述Android中Activity的状态,Activity的状态转换,从而总结了Activ ...

最新文章

  1. 手游linux服务器时间同步问题
  2. 这样也可以,insert,,
  3. echsop privilege.php?act=login,ecshop 后台登陆自动退出的一种可能情况(目录大小写问题)...
  4. zoj 3762(求三角形的最大高)
  5. SpringBoot整合Spring Security——登录管理
  6. Linux 免密码sudo
  7. java拦截器项目应用_使用拦截器分析Java EE应用程序的性能下降/提高
  8. Java开启/关闭tomcat服务器
  9. 《Java核心技术 卷Ⅱ 高级特性(原书第10版)》一3.6.2 使用StAX解析器
  10. JAVA企业级应用服务器之TOMCAT实战
  11. 拓扑排序:如何确定代码源文件的编译依赖关系
  12. 8086cpu学习笔记(1):系统结构
  13. Day46:数据库引擎、索引、pymysql
  14. 【2022最新罗技G502吃鸡宏】
  15. 如何在libfetion上使用ibus输入法
  16. AS找回被删除的文件
  17. 1G、2G、3G、4G和5G有什么区别?5G的原理是什么?
  18. VMware14安装windows7的详细过程
  19. 超五类屏蔽双绞线和计算机电缆区别,超五类单屏网线和六类单屏蔽网线的区别是什么?...
  20. 组装一台台式计算机的流程,如何组装电脑?组装电脑的操作流程!

热门文章

  1. 面试不是无情物,参数注解知多少?
  2. Cs束氢脉泽原子钟行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
  3. Android漂浮碰壁动画
  4. 【python实战】---- 30行代码提取个人值班表
  5. oppo锁频段_OPPO手机这样设置,让你的网络更加稳定!
  6. 有一头小母牛(0岁),它从第四年(3岁)开始,每年都生一头小母牛(一年只生一头),而且,所以的小母牛也都会在第四年开始生育。假设所有的母牛都不会死,请问:第n年,此牛群共有多少头母牛?
  7. 在MySQL中创建实现自增的序列(Sequence)的教程
  8. CTF练习 TU-ctf-2016 pwn woO-50
  9. GEA 3.2 C/C++ 的数据、代码及内存
  10. 爱奇艺奇遇Dream正式发布:仅售1999,国民级VR来了