Android Activity生命周期

Android生命周期

Android的生命周期:onCreate() -> onStart() -> onResume() -> onPause() -> onStop() -> onDestroy() 如下图所示:

  1. 1.当activity启动时系统会先调用onCreate(),然后调用onStart(),最后调用**onResume()**方法,activity进入运行状态。
  2. 当activity被别的activity 覆盖在其上时:系统会掉用onPause(),然后当覆盖在其上的activity会调用**onCreate() -> onStart() -> onResume()后,第一个activity会调用onStop()**方法使activity暂停。
  3. 当覆盖在其上的第二个activity关闭返回此activity时,系统会先调用第二个activity的**onPause()方法然后再调用第一个activity的onRestart() -> onStart() -> onResume()方法,进入运行状态,此时第二个activity才调用onStop() -> onDestroy()**方法关闭。
  4. 用户退出当前activity:系统先调用onPause(),然后调用onSotp(),最后调用**onDestroy()**方法,结束当前activity。

如下日志打印 第一个activity MainActivity 打开 SingleTopActivity 在返回到 MainActivity

     MainActivity :onPause 方法-------------------------SingleTopActivity :onCreate 方法-------------------------SingleTopActivity :onStart 方法-------------------------SingleTopActivity :onResume 方法-------------------------MainActivity :onSaveInstanceState 方法--------------------MainActivity :onStop 方法-------------------------SingleTopActivity :onPause 方法-------------------------MainActivity :onRestart 方法-------------------------MainActivity :onStart 方法-------------------------MainActivity :onResume 方法-------------------------SingleTopActivity :onStop 方法-------------------------SingleTopActivity :onDestroy 方法-------------------------
复制代码
  • onRestart():表示activity正在重新启动,一般情况下是当前activity从不可见重新变成可见状态时,**onRestart()**就会被调用,这种情况一般是用户行为导致的,如从其他页面返回当前页面时,或者用户按home键切换到桌面在重新打开app。

  • onStart()和onStop():onStart()表示activity可见了,但是还没有获取焦点,无法进行交互。onStop()是和onStart()对应的当activity从可见转不可见是调用。

  • onResume()和onPause():onResume()表示activity已经获取焦点了,可以进行交互了,onPause()是和onResume()方法对应的表示当前activity失去了焦点,此时可以做一些存储数据和停止动画等工作,但是不能太好时,不是会影响到新的activity的显示,因为只有onPause()执行完了,新的activity才会进入 onCreate() 等方法。

  • onDestroy():onDestroy()表示activity正在销毁,一般我们是在这进行资源的释放,以避免内存的泄漏。

注意:

- 如果覆盖在其上的activity的风格是dialog风格的化,此activity是不会进入**onSotp()**方法,回到此activity时也**不会调用onRestart()和onStart()方法** 会直接调用**onResume()**方法。- 如果activity中弹出dialog对话框的时候,**activity是不会调用onPause()方法**;- 只有旧的activity onPause()方法执行完后,新的activity才启动
- 在所以情况下,系统在调用了onPause()和onStop()之后都会调用onDestroy(),只有一个例外:当你从onCreate()方法类调用了finish()时,在这种情况下,系统会立刻调用onDestroy(),而不调用任何其他生命周期方法。日志如下:
复制代码
 MainActivity :onPause 方法-------------------------DialogActivity :onCreate 方法-------------------------MainActivity :onResume 方法-------------------------DialogActivity :onDestroy 方法-------------------------
复制代码

异常情况下的生命周期:比如系统资源配置发生改变以及系统内存不足时,activity就可能被杀死。

  • 情况1:资源相关配置方式改变导致activity被杀死并重新创建。 比如当前activity处于竖屏,旋转屏幕,这时由于activity的系统配置改为了横屏状态,在默认情况下,activity就会被销毁并且重新创建,日志打印如下:
 MainActivity :onCreate 方法-------------------------MainActivity :onCreate:MainActivity  TaskId:130  hasCode:151566767MainActivity :onStart 方法-------------------------MainActivity :onResume 方法-------------------------MainActivity :onPause 方法-------------------------MainActivity :onSaveInstanceState 方法-------------------------MainActivity :onStop 方法-------------------------MainActivity :onDestroy 方法-------------------------MainActivity :onCreate 方法-------------------------MainActivity :onCreate:MainActivity  TaskId:130  hasCode:233659052MainActivity :onStart 方法-------------------------MainActivity :onRestoreInstanceState 方法-------------------------MainActivity :onResume 方法-------------------------MainActivity :onPause 方法-------------------------MainActivity :onSaveInstanceState 方法-------------------------MainActivity :onStop 方法-------------------------MainActivity :onDestroy 方法-------------------------MainActivity :onCreate 方法-------------------------MainActivity :onCreate:MainActivity  TaskId:130  hasCode:262962597MainActivity:TaskAffinity:com.hugo.reviewbasicMainActivity :onStart 方法-------------------------MainActivity :onRestoreInstanceState 方法-------------------------MainActivity :onResume 方法-------------------------
复制代码

在上面这日志中 我们进入MainActivity -> onCreate() -> onStart () -> onResume() 这个时候MainActivity已经在栈顶并获得焦点了,然后我们旋转手机屏幕,

这时调用了 onPause() -> onSaveInstanceState() -> onStop() - onDestroy() 方法把当前MainActivity 销毁了,然后紧接着又重新创建了一个MainActivity -> onCreate() -> onStart() -> onRestoreInstanceState() -> onResume()

这是MainActivity已经重新创建并且是横屏显示的,这是我们又旋转手机屏幕重新竖屏显示 ,这是调用了 onPause() -> onSaveInstanceState() -> onStop() - onDestroy() 方法把当前横屏MainActivity 销毁了,并重新创建了竖屏的MainActivity -> onCreate() -> onStart() -> onRestoreInstanceState() -> onResume()

在这上面的流程我们可以看到 在第一次进入MainActivity 时是每有调用onRestoreInstanceState() 方法的而是在重新创建时才调用了该方法,这个方法是用来做什么的呢?这个方法就是用来在activity被销毁并重新创建时用来恢复我们保存的数据用的,那我们的数据在哪保存的呢,可以看到日志里每次在销毁前都有调用 onSaveInstanceState() 方法,这个方法就是用来保存数据用的。

在onSaveInstanceState()方法中系统会传入Bundle对象用来存储数据,在重新创建时onRestoreInstanceState()方法系统会传入在onSaveInstanceState()方法是存储了数据的Bundle对象,在onRestoreInstanceState()方法里可以在传入的Bundle对象中获取存储的数据进行页面恢复。

根据日志可以看出 onSaveInstanceState() 总是在 onStop()之前调用,而onRestoreInstanceState() 总是在onStart() 之后调用,而且onRestoreInstanceState()在activity第一次创建时是不会调用的。

  • 情况2:在资源不足的情况下导致低优先级的activity被杀死。 这种情况下和前面第一种情况1的数据存储和恢复是完全一致的,activity按照优先级从高到低可以分为以下三种:

    1. 前台activity:正在和用户交互的activity,优先级最高。 2.可见但是非前台activity:就是能看见,但是没有获取到焦点不能和用户进行直接交互。 3.后台activity:已经被暂停的activity,比如执行了onStop()方法,优先级最低。

注意: 必须始终调用 onSaveInstanceState()和onRestoreInstanceState() 的超类实现因为这两个方法默认实现了保存有关activity视图层次的状态信息和恢复视图层次结构状态,列如EditText小部件的文本或ListView的滚动位置。而且所有的View都有onSaveInstanceState()和onRestoreInstanceState()这两个方法。


自行处理配置变更: 我们可以在声明Activity将自行处理配置变更,这样就可以阻止系统重启activity了。 声明时在AndroidManifest.xml文件中编辑相应的""元素,设置以包含的 android:configChanges 属性(最常用的值包括“orientation”和“keyboardHidden”,分别用于避免因屏幕方向和可用键盘改变而导致的重启)。我们可以在该属性中声明多个匹配值,方法是用“ | ”字符分隔这些配置值。 如下配置:

<activity android:name=".singletop.OtherTopActiivty" 
android:configChanges="orientation|screenSize"
android:launchMode="singleTop"/>
复制代码

现在,当其中一个配置发生改变是OtherTopActiivty不会重启,但是OtherTopActiivty的onConfigurationChanged()方法会被调用,系统会 传入Configuration对象指定新的设备配置。我们可以通过读Configuration中的字段,来确定新配置,进行相应的UI更改。 以下是在onConfigurationChanged()实现检查当前设备的方向:

override fun onConfigurationChanged(newConfig: Configuration?) {   
super.onConfigurationChanged(newConfig)  
LogUtil.i(TAG,"$ActivityName :onConfigurationChanged 方法-------------------------"if(newConfig?.orientation == Configuration.ORIENTATION_LANDSCAPE){     
LogUtil.i(TAG,"$ActivityName :onConfigurationChanged 横屏")  
Toast.makeText(this,"横屏",Toast.LENGTH_SHORT).show()  
}else if(newConfig?.orientation == Configuration.ORIENTATION_PORTRAIT){    
LogUtil.i(TAG,"$ActivityName :onConfigurationChanged 竖屏")   
Toast.makeText(this,"竖屏",Toast.LENGTH_SHORT).show() 
}
}复制代码

注意:

  • 自行处理配置变更可能导致备用资源的使用更为困难,因为系统不会自动应用这些资源。所以只有在我们必须避免activity因配置改变而重启这种情况下,才考虑采用自行处理配置变更这种方法,而且对于大多数应用并不建议使用此方法。
    复制代码
  • 在Android3.0(API 级别13)开始,设备在纵向和横向之间切换时,“屏幕尺寸”也会发生改变,因此在开发针对API级别13或更高版本的应用时,若要避免由于设备方向的改变而导致运行时重启,则除了“orientation”值外,还必须添加“screenSize“值。也就是必须声明android:configChanges="orientation|screenSize"。
    复制代码
  • 在声明有Activity处理配置变更时,我们有责任要为其提供备用资源的所有元素。如声明了activity处理方向变更,有些图像是应该横向和纵向之间切换,则必须在 onConfigurationChanged()方法中将每个资源重新分配给每个元素。
    复制代码

这个例子代码在这里

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/388833.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

date数据存入mysql_Date对象存入mysql数据库

java.sql.Date,java.sql.Time和java.sql.Timestamp三个都是java.util.Date的子类(包装类)。java.sql.Date是java.util.Date的子类&#xff0c;是一个包装了毫秒值的瘦包装器&#xff0c;允许 JDBC 将毫秒值标识为 SQL DATE 值。毫秒值表示自 1970 年 1 月 1 日 00:00:00 GMT 以…

盛严谨,严谨,再严谨。_评估员工调查的统计严谨性

盛严谨,严谨,再严谨。The human resources industry relies heavily on a wide range of assessments to support its functions. In fact, to ensure unbiased and fair hiring practices the US department of labor maintains a set of guidelines (Uniform Guidelines) to …

复权就是对股价和成交量进行权息修

* 所谓复权就是对股价和成交量进行权息修复,按照股票的实际涨跌绘制股价走势图, * 并把成交量调整为相同的股本口径。股票除权、除息之后&#xff0c;股价随之产生了变化&#xff0c; * 但实际成本并没有变化。 * 如&#xff1a;原来20元的股票&#xff0c;十送十之…

前端校验和后端校验

问&#xff1a;到底是前端校验好还是后端校验好呢&#xff1f; 答&#xff1a;后端校验比前端校验更安全&#xff0c;更可靠&#xff0c;前端校验可以增加用户体验&#xff0c;一般来说&#xff0c;在前端校验的东西在后端也必须校验&#xff08;比如登陆用户名、密码&#xff…

[MySQL] INFORMATION_SCHEMA 数据库包含所有表的字段

sql注入后可以通过该数据库获取所有表的字段信息1. COLLATIONS表 提供有关每个字符集的排序规则的信息。 COLLATIONS表包含以下列&#xff1a;COLLATION_NAME 排序规则名称。 CHARACTER_SET_NAME 与排序规则关联的字符集的名称。 ID 排序规则ID。 IS_DEFAULT 排序规则是否为其字…

开根号的笔算算法图解_一个数的开根号怎么计算

一个数的开根号怎么计算2020-11-08 15:46:47文/钟诗贺带根号的式子可以直接进行开平方的运算。一些特殊的根号运算有;√2≈1.414、1/2-√3≈0.5-1.732≈-1.232、2√5≈22.236≈4.236、√7-√6≈2.646-2.449≈0.197。开平方的笔算方法1&#xff0e;将被开方数的整数部分从个位起…

arima 预测模型_预测未来:学习使用Arima模型进行预测

arima 预测模型XTS对象 (XTS Objects) If you’re not using XTS objects to perform your forecasting in R, then you are likely missing out! The major benefits that we’ll explore throughout are that these objects are a lot easier to work with when it comes to …

net程序员的iPhone开发-MonoTouch

net程序员的iPhone开发-MonoTouch iPhone软件的Native开发除了使用Apple推荐的Objective-C Cocoa之外&#xff0c;也有其他的一些工具和SDK提供 基于WEB的形式的一些框架在下面这个文章介绍过 各种SmartPhone上的跨平台开源框架的总结 http://www.cnblogs.com/2018/archive/20…

ASP防止SQL注入

防止SQL注入http://0.0.0.0/bzhs/login.asp?logTypeedit;WAITFOR DELAY 0:0:5 --logType Replace(Replace(Replace(Replace(logType,"-",""),"",""),"&",""),";","")fcdm Replace(Rep…

protobuf java 生成_protobuf代码生成

windows :1,两个文件&#xff1a;proto.exe, protobuf-java-2.4.1.jar2,建立一个工程TestPb&#xff0c;在下面建立一个proto文件件&#xff0c;用来存放【。proto】文件3&#xff0c;将proto,exe放在工程下&#xff0c;4&#xff0c;建立一个msg.proto文件&#xff1a;option …

bigquery_在BigQuery中链接多个SQL查询

bigqueryBigquery is a fantastic tool! It lets you do really powerful analytics works all using SQL like syntax.Bigquery是一个很棒的工具&#xff01; 它使您能够使用像语法一样SQL来进行真正强大的分析工作。 But it lacks chaining the SQL queries. We cannot run …

允许指定IP访问远程桌面

允许指定IP访问远程桌面 电脑软件 2010-01-23 02:33:40 阅读595 评论0 字号&#xff1a;大 中 小 订阅 一、新建IP安全策略 WINR打开运行对话框&#xff0c;输入gpedit.msc进入组策略编辑器。 依次打开“本地计算机”策略--计算机配置--Windows设置--安全设置--IP安…

大理石在哪儿 (Where is the Marble?,UVa 10474)

题目描述&#xff1a;算法竞赛入门经典例题5-1 1 #include <iostream>2 #include <algorithm>3 using namespace std;4 int maxn 10000 ;5 int main()6 {7 int n,q,a[maxn] ,k0;8 while(scanf("%d%d",&n,&q)2 && n &&q…

Volley 源码解析之网络请求

Volley源码分析三部曲Volley 源码解析之网络请求Volley 源码解析之图片请求Volley 源码解析之缓存机制 Volley 是 Google 推出的一款网络通信框架&#xff0c;非常适合数据量小、通信频繁的网络请求&#xff0c;支持并发、缓存和容易扩展、调试等&#xff1b;不过不太适合下载大…

为什么修改了ie级别里的activex控件为启用后,还是无法下载,显示还是ie级别设置太高?

如果下载插件时下载不了&#xff0c;这样设置&#xff0c;打开IE选工具/Internet 选项/安全/自定义级别/设置中的ActiveX控件自动提示“禁用”。 对标记为可安全执行脚本ActiveX控件执行脚本“启用” 对没有标记为安全的ActiveX初始化和脚本运行“启用”&#xff08;下载插件后…

mysql 迁移到tidb_通过从MySQL迁移到TiDB来水平扩展Hive Metastore数据库

mysql 迁移到tidbIndustry: Knowledge Sharing行业&#xff1a;知识共享 Author: Mengyu Hu (Platform Engineer at Zhihu)作者&#xff1a;胡梦瑜(Zhhu的平台工程师) Zhihu which means “Do you know?” in classical Chinese, is the Quora of China: a question-and-ans…

两个日期相差月份 java_Java获取两个指定日期之间的所有月份

String y1 "2016-02";//开始时间String y2 "2019-12";//结束时间try{Date startDate new SimpleDateFormat("yyyy-MM").parse(y1);Date endDate new SimpleDateFormat("yyyy-MM").parse(y2);Calendar calendarCalendar.getInstance(…

js前端日期格式化处理

js前端日期格式化处理 1.项目中时间返回值&#xff0c;很过时候为毫秒值&#xff0c;我们需要转换成 能够看懂的时间的格式&#xff1b; 例如&#xff1a; ​ yyyy-MM-dd HH:mm:ss 2.处理方法&#xff08;处理方法有多种&#xff0c;可以传值到前端处理&#xff0c;也可以后台可…

如何用sysbench做好IO性能测试

sysbench 是一个非常经典的综合性能测试工具&#xff0c;通常都用它来做数据库的性能压测&#xff0c;但也可以用来做CPU&#xff0c;IO的性能测试。而对于IO测试&#xff0c;不是很推荐sysbench&#xff0c;倒不是说它有错误&#xff0c;工具本身没有任何问题&#xff0c;它的…

XCode、Objective-C、Cocoa 说的是几样东西

大部分有一点其他平台开发基础的初学者看到XCode&#xff0c;第一感想是磨拳擦掌&#xff0c;看到 Interface Builder之后&#xff0c;第一感想是跃跃欲试&#xff0c;而看到Objective-C的语法&#xff0c;第一感想就变成就望而却步了。好吧&#xff0c;我是在说我自己。 如果…