深入剖析Android四大组件(一)——Activity生命周期详解(一)

简介: 深入剖析Android四大组件(一)——Activity生命周期详解(一)

1.管理Activity的生命周期


无论是正在运行的Activity还是没有运行的Activity,它们都接受Android的框架管理,这使得Activity处于不同的生命周期。


①Activity的3种状态


通过回调方法来管理Activity的生命周期对于开发一个健壮并且灵活的应用程序是非常关键的。Activity的生命周期直接影响到它与其他Activity,任务以及栈的关系。


Activity存在3种状态,分别是resumed,paused和stopped。


resumed:指Activity在屏幕前台并且拥有用户焦点的状态,这个状态有时也称为“正在运行”


paused:指另一个Activity在屏幕前台并且拥有用户焦点的状态,但这个Activity仍然可见,即另一个Activity在前一个Activity之上,而前一个Activity又是可见的并且部分透明或者没有覆盖整个屏幕。一个处于paused状态的Activity是完全存活的(Activity对象村中被保留,它维护所有状态和成员信息,并依然依附窗口管理器),但是在内存极低时将被系统杀掉。


stopped:指前一个Activity被另一个Activity完全遮蔽(前一个Activity当前在后台中)。一个处于stopped状态的Activity仍然是存活的(这个Activity对象在内存中被保留,它维护所有状态和成员信息,但没有依附窗口管理器)。然而,它却不再显示给用户,并且在内存极低时会被系统杀掉。


如果一个Activity处于paused或stopped状态,那么系统会从内存中丢掉它,这可以通过调用它的finish()方法来实现,或者简单一点,通过杀掉它的进程来实现。当Activity重新打开(在它结束或者被杀掉之后)时,它就必须被重新创建。


②实现Activity的生命周期回调


当Activity发生状态转变时,它会通过回调方法来得到通知,我们可以重写所有这些回调方法完成适当的工作。当Activity状态发生改变时,Activity的框架包含每一个基本的生命周期方法,如下列代码所示:


@Override
public void onCreate(Bundle savedInstanceState){
//指示这个Activity正在被创建
super.onCreate(saveInstanceState);
//完成一些任务
}
@Override
protected void onStart(){
//这个Activity正在变为可见
super.onStart();
//完成一些任务
}
@Override
protected vodi onResume(){
//这个Activity已经变为可见
//现在是resumed状态
super.onResume();
//完成一些任务
}
@Override
oritected void onPause(){
//另一个Activity获得焦点而且当前的Activity失去焦点
//也就是当前Activity被另一个Activity部分或者全部覆盖
//当前Activity失去焦点的时候调用
//这个Activity现在处于paused状态
super.onPause();
//完成一些任务
}
@Override
protected void onStop(){
//这个Activity不再可见的时候调用
//当前Activity处于stopped状态
super.onStop();
//完成一些任务
}
@Override
protected void onDestory(){
//这个Activity已经被销毁
super.onDestory();
//完成一些任务
}


建议:通常,在实现这些生命周期方法时,必须先调用超类的实现(比如调用super.XXX)。综上所述,以上这些方法定义了Activity的整个生命周期。通过实现这些方法,我们就能监视Activity生命周期中的3个嵌套循环,具体如下所示。


Activity的整个生命周期发生在调用onCreate()和调用onDestory()之间。在onCreate()中,Activity应该设置“全局”状态(比如定义布局),并且在onDestory()中释放其余资源。例如,如果Activity有一个后台运行的线程从网络上下载数据,那么它应该在onCreate()中创建这个线程,并且在onDestory()停止该线程。


Activity的可见生命周期发生在调用onStart()和调用onStop()之间。在这个过程中,用户可以看到这个Activityd在屏幕中并且可以与之交互。例如,当一个新Activity启动并且前一个Activity不再可见的时候,onStop()就被调用了。在这两个方法之间,可以维护需要显示给用户的Activity资源。例如,可以在onStart()方法中注册一个广播接收器去监视影响UI的变化,当用户看不到显示的东西时,则在onStop()注销它。在Activity的整个生命周期中,当Activity在可见和隐藏之间切换时,系统就会多次调用onStart()和onStop()方法。


Activity的前台生命周期发生在调用onResume和调用onPause()之间。需要说明的是,在这期间,Activity在屏幕中所有其他Activity的前面并且拥有用户焦点。一般情况下,Activity可以被频繁转换。例如,当设备休眠或者显示一个对话框时,onPause()就会被调用。


对于以上知识,为了方便读者理解并理顺它们之间的内在关系,我们用一张图来直观地描述,如下图:


70.png


上图为Activity生命周期的演化过程


顺便也列出一张表,描述了在Activity的整个生命周期里定位的每一个回调方法以及其细节,以及回调方法完成后系统是否可以停止这个Activity等。


方法

描述

调用后是否可以被杀掉

下一步操作

onCreate()  

当Activity第一次被创建时调用。此处可以做所有的一般静态设置,比如创建视图,绑定列表数据等。

如果状态被捕捉,并且此状态存在的话,这个方法传递一个包含这个Activity的前状态的Bundle对象。

onStart()

onRestart()

Activity被停止后,再次启动之前调用。

onStart()

onStart()

在Activity对用户可见之前被调用。

如果这个Activity来到前台,那么下一步操作是调用OnResume()。

如果被隐藏,则下一步操作是调用onStop()。

onResume()或者onStop()

onResume() 

在Activity开始与用户交互之前被调用。在这里,该Activity位于Activity栈顶,开始与用户交互。

需要注意的是,此时当前Activity处于resumed状态,这个状态下Activity是可见的。

onPause()

onPause()

当系统正在恢复另一个Activity的时候被调用。这个方法通常用于提交未保存的数据,停止动画以及可能 消耗CPU的事情等。这些应该高效地完成,因为下一个Activity在这个方法没有返回之前不会被运行。如果Activity回到前台,则下一步操作为调用onResume()。如果Activity变得不可见,则调用onStop().

onResume()或者onStop()

onStop()

当Activity对用户不再可见的时候调用。这会发生,是因为它正在被销毁或者另一个Activity(可以是已经存在的或者新的)被运行并且覆盖了它。

如果Activity恢复与用户交互,则下一步操作是调用onRestart(),如果这个Activity消失,则调用onDestory()。

onRestart()或者onDestory()

onDestory()

该Activity被销毁之前调用。这个Activity收到的最终调用。它可以是因为Activity正在结束(调用finish()),或者是因为心痛为保护空间而面临销毁这个Activity的实例而调用。可以通过isFinishing()方法区分这两种情况。


相关文章
|
3月前
|
搜索推荐 Android开发 开发者
探索安卓开发中的自定义视图:打造个性化UI组件
【10月更文挑战第39天】在安卓开发的世界中,自定义视图是实现独特界面设计的关键。本文将引导你理解自定义视图的概念、创建流程,以及如何通过它们增强应用的用户体验。我们将从基础出发,逐步深入,最终让你能够自信地设计和实现专属的UI组件。
|
4月前
|
存储 Android开发 开发者
深入理解安卓应用开发的核心组件
【10月更文挑战第8天】探索Android应用开发的精髓,本文带你了解安卓核心组件的奥秘,包括Activity、Service、BroadcastReceiver和ContentProvider。我们将通过代码示例,揭示这些组件如何协同工作,构建出功能强大且响应迅速的应用程序。无论你是初学者还是资深开发者,这篇文章都将为你提供新的视角和深度知识。
|
4月前
|
数据可视化 Android开发 开发者
安卓应用开发中的自定义View组件
【10月更文挑战第5天】在安卓应用开发中,自定义View组件是提升用户交互体验的利器。本篇将深入探讨如何从零开始创建自定义View,包括设计理念、实现步骤以及性能优化技巧,帮助开发者打造流畅且富有创意的用户界面。
158 0
|
2月前
|
XML 搜索推荐 前端开发
安卓开发中的自定义视图:打造个性化UI组件
在安卓应用开发中,自定义视图是一种强大的工具,它允许开发者创造独一无二的用户界面元素,从而提升应用的外观和用户体验。本文将通过一个简单的自定义视图示例,引导你了解如何在安卓项目中实现自定义组件,并探讨其背后的技术原理。我们将从基础的View类讲起,逐步深入到绘图、事件处理以及性能优化等方面。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的见解和技巧。
|
4月前
|
Android开发
Android面试之Activity启动流程简述
Android面试之Activity启动流程简述
119 6
|
4月前
|
消息中间件 Android开发 索引
Android面试高频知识点(4) 详解Activity的启动流程
Android面试高频知识点(4) 详解Activity的启动流程
43 3
|
4月前
|
缓存 前端开发 Android开发
Android实战之如何截取Activity或者Fragment的内容?
本文首发于公众号“AntDream”,介绍了如何在Android中截取Activity或Fragment的屏幕内容并保存为图片。包括截取整个Activity、特定控件或区域的方法,以及处理包含RecyclerView的复杂情况。
43 3
|
4月前
|
Android开发
Android面试之Activity启动流程简述
Android面试之Activity启动流程简述
37 0
|
JavaScript Android开发
《Android应用开发攻略》——1.6 理解Android生命周期
本节书摘来自华章计算机《Android应用开发攻略》一书中的第1章,第1.6节,作者:(美)达尔文(Darwin, I. F.)著, 更多章节内容可以访问云栖社区“华章计算机”公众号查看。
907 0
|
13天前
|
JavaScript 搜索推荐 Android开发
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
40 8
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡

热门文章

最新文章

  • 1
    【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
  • 2
    Android历史版本与APK文件结构
  • 3
    【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
  • 4
    当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
  • 5
    APP-国内主流安卓商店-应用市场-鸿蒙商店上架之必备前提·全国公安安全信息评估报告如何申请-需要安全评估报告的资料是哪些-优雅草卓伊凡全程操作
  • 6
    【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
  • 7
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
  • 8
    【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
  • 9
    【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
  • 10
    Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
  • 1
    Android实战经验之Kotlin中快速实现MVI架构
    19
  • 2
    即时通讯安全篇(一):正确地理解和使用Android端加密算法
    22
  • 3
    escrcpy:【技术党必看】Android开发,Escrcpy 让你无线投屏新体验!图形界面掌控 Android,30-120fps 超流畅!🔥
    39
  • 4
    【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
    115
  • 5
    Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
    40
  • 6
    【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    55
  • 7
    Android历史版本与APK文件结构
    147
  • 8
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    46
  • 9
    【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
    40
  • 10
    APP-国内主流安卓商店-应用市场-鸿蒙商店上架之必备前提·全国公安安全信息评估报告如何申请-需要安全评估报告的资料是哪些-优雅草卓伊凡全程操作
    66