Android activity生命周期
这篇博客主要包含以下知识点:
activity介绍、 activity生命周期的详细过程(不同情况下的变化以及状态的改变)、finish和onDestory方法的关系、onSaveInstanceState和OnRestoreInstanceState的用法
Activity介绍:
Activity就是布满整个窗口或者悬浮于其他窗口上的交互界面。在一个应用程序中通常由多个Activity构成,都会在Manifest.xml中指定一个主的Activity,如下设置
<actionandroid:name="android.intent.action.MAIN" />
当程序第一次运行时用户就会看这个Activity,这个Activity可以通过启动其他的Activity进行相关操作。当启动其他的Activity时这个当前的这个Activity将会停止,新的Activity将会压入栈中,同时获取用户焦点,这时就可在这个Activity上操作了。都知道栈是先进后出的原则,那么当用户按Back键时,当前的这个Activity销毁,前一个Activity重新恢复。
生命周期的详细过程:
onCreate ---> onStart ---> onResume --->(切到后台,按下Home键) onPause---> onSaveInstanceState ---> onStop --->(从后台切回来)onRestart ---> onStart ---> onResume --->(横屏切换)onPause ---> onSaveInstanceState--->onStop --->onDestory--->onCreate--->onStart--->OnRestoreInstanceState--->onResume--->(back键)finsh --->onPause--->onStop--->onDestory
注: 横屏切换这种操作类似于干掉之前的activity,重新创建一个activity,所以会出现onSaveInstanceState--->onStop--->onDestory---这条线
其中onSaveInstanceState是保存当前的一些状态;OnRestoreInstanceState是恢复之前保存的状态;
ps : 图出自于云课堂老师的课件中,在此引用方便记录
下面举例说明一下finish和onDestory方法的关系:
MainActivity.java
@Overridepublic void finish() {Log.i("Activity LifeCycle", "finish...1 was called");//super.finish();Log.i("Activity LifeCycle", "finish...2 was called");}@Overrideprotected void onDestroy() {Log.i("Activity LifeCycle", "onDestroy...1 was called");super.onDestroy();Log.i("Activity LifeCycle", "onDestroy...2 was called");}
注释掉super.finish(); 启动app,然后按下back键,日志打印结果如下:
不注释super.finish(),启动app, 然后按下back键,日志打印结果如下:
经过对比发现:
finish()方法用于结束一个Activity的生命周期,在你的activity动作完成的时候,或者Activity需要关闭的时候,调用此方法。
当你调用此方法的时候,系统只是将最上面的Activity移出了栈,并没有及时的调用onDestory()方法,其占用的资源也没有被及时释放。因为移出了栈,所以当你点击手机上面的“back”按键的时候,也不会再找到这个Activity。即在finish()中的super调用了ondestory()的都函数;如果注释掉finish中的super方法,发现并不会触发onDestory方法;
而onDestory()方法则是Activity的一个生命周期方法,其作用是在一个Activity对象被销毁之前,Android系统会调用该方法,用于释放此Activity之前所占用的资源。finish会调用到onDestroy方法; 这里讲解一下onSaveInstanceState和OnRestoreInstanceState的用法:比如你想保存一个实例变量的值,而在切换横竖屏的时候导致这个变量值更改了,不是你想要的值,此时心里肯定是,什么鬼?啥情况?一堆黑人问号脸?原因则是因为横屏这种操作实际上是销毁了一个activity,重新创建了一个activity, 而两个activity不是同一个activity, 那对应的实例变量当然也就不同啦!!!比如:
我们发现横屏之后,得分栏为空,这不是我们想要的结果。
解决方法如下:在onSaveInstanceState中保存实例变量得分, 在onRestoreInstanceState中拿到实例变量的值;
@Overrideprotected void onSaveInstanceState(Bundle outState) {super.onSaveInstanceState(outState);outState.putInt("score", score);}@Overrideprotected void onRestoreInstanceState(Bundle savedInstanceState) {super.onRestoreInstanceState(savedInstanceState);score = savedInstanceState.getInt("score");TextView scoreTextView = findViewById(R.id.scoreTextView);scoreTextView.setText("得分: " + score);}
如下如结果所示没横屏之后分数栏并没有回到初始值0,而是保存了状态。
此时有小伙伴就要问了,为什么上面的单词以及选项会变呢,之前已经说过,横屏之后会重新创建一个activity, 而单词以及选项是随机产生的,所以会改变,
而且我们在这里也没有保存单词以及选项的状态,只是保存了得分的状态!有兴趣的小伙伴可以自己试着保存一下单词以及得分的状态!
转载于:https://www.cnblogs.com/leavescy/p/7845921.html
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生命周期的详细说明,现整理如下: 转载请标明姓名及出处:大飞_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 ...
- 04 Android Activity生命周期
文章目录 1 Activity 生命周期 1.1 生命周期 1.2 Android 开发的规则 2 设备配置变化,Activity被销毁 3 进出停止态 3.2 进出停止态的过程 4 进出暂停态 4. ...
最新文章
- 小记,springboot项目中自己常用的logback配置文件
- PE文件重定位概念学习
- LTP--linux稳定性测试 linux性能测试 ltp压力测试
- Android 2.2
- 不可摸数http://acm.hdu.edu.cn/showproblem.php?pid=1999
- html点击按钮执行php代码,php代码在html文件里面执行的示例
- 【IntelliJ】IntelliJ IDEA常用设置及快捷键以及自定义Live templates
- ArrayList实现
- C# 正则表达式编写及验证方法
- STL源码剖析 迭代器的概念和traits编程技法
- r3 4300u r5 u_R5刀粒
- 互联网晚报 | 3月11日 星期五 |​ ​​商汤科技在深圳成立新公司,;微信支付电子小票上线...
- 使用Axis2方式发布webService实例说明
- 倒计时 1 天!第十六届开源中国开源世界高峰论坛日程曝光,邀您共同缔造开源创新模式!...
- 春运抢票靠加速包?试试这个 Python 开源项目吧
- python爬虫十二种方法_Python爬虫的N种姿势
- 错误 -source 1.6 中不支持 diamond 运算符的解决办法(已解决)
- io流之转换流InputStreamReader、OutputStreamWriter
- 【SSM】企业差旅管理系统-李兴华-专题视频课程
- DeepFace介绍
热门文章
- FineUI利用JS取控件的值
- Leetcode: Palindrome Numbers
- 学习《Building Applications with FME Objects》 之二 使用Sessions(会话)
- jmeter压测_jmeter压测学习2linux运行jmeter环境
- 有了java为什么还需要groovy_Groovy创始人:Java面临终结 Scala将取而代之
- linux shell 脚本 查找文件,Linux Shell在目录下使用for循环结合if查找文件的巧用
- my.cnf mysqld mysql_MySQL配置文件my.cnf详解【mysqld】模块(二)
- 地铁进出站是一站怎么办_高铁坐过站?别担心,这样能免费送回
- 11.QT事件机制源码时序分析(下)
- 彩色MT9V034摄像头 Bayer转rgb FPGA实现(转载)