Android之Activity的生命周期
PS:写一发关于Activity的生命周期,也算是面试的重点内容.
学习内容:
1.Activity的生命周期
2.面对多种情况的时候Activity的生命周期
3.onSaveInstanceState()方法的调用
1.Activity的生命周期
Activity的生命周期是Android中需要掌握的重点部分..也就此简单的介绍一下..顺便自己也捋一捋概念上的东西..
返回栈的概念和流程图:
Android中Activity的管理是由一个栈区进行管理的.在默认情况下,我们每次启动一个新的Activity的时候.他都会在返回栈中入栈.并且处于栈顶的位置.而我们每次在退出一个Activity的时候,或者是使用finish函数的时候.当前的Activity会进行出栈操作.那么栈顶位置就成为了前一个Activity系统总是会将栈顶位置的Activity显示给用户.
这个流程图就是Activity的管理方式..
Activity的相关状态
i.运行状态
运行状态的Activity.运行状态的Activity一般都是直接与用户进行交互的Acticity.也是处于栈顶位置的Activity.系统一般情况下是不会回收这个Activity的.
ii.暂停状态
暂停状态的Activity不再处于栈顶位置,但是仍然处于可见状态的时候,这个Activity也就进入了暂停状态.这种的Activity还是挺常见的.一般我们在操作一个Activity的时候.比如说系统弹出了一个新的对话框.这个对话框属于一个新的Activity.但是这个新的Activity并没有完全的覆盖住了屏幕.那么原来的那个Activity这个时候就处于了暂停状态.暂停状态的Activity系统一版状态下也是不会主动去回收的.(虽然活动暂停,但是仍然处于可见状态.如果进行了回收,会使得用户的体验性差).但是并不代表任何情况下都不会被回收.
iii.停止状态
停止状态的Activity.停止状态的Activity也不再处于栈顶位置.并且已经完全不再可见了.虽然系统仍然保存着相应的状态和变量.但是一旦其他应用也需要使用内存的时候,那么处于停止状态下的Activity也就会被系统自动进行回收了.
iv.销毁状态
一般情况下Activity在栈区中被移除的时候,Activity也就进入了销毁状态.等待系统的回收,释放资源和内存.
Activity的生存周期
i.onCreate()方法.
这个方法在Activity在第一次被创建的时候进行调用.一些相关的初始化操作都在这个方法内部完成.
ii.OnDestory()
这个方法是与onCreate()方法是相互对应的.这个方法用于销毁Activity.释放资源.
这两个方法之间的Activity是一个完整的生存周期
iii.onStart()
这个方法使得Activity由不可见状态成为可见状态.
iv.onStop()
与onStart()方法形成对应关系.当活动完全不可见的时候进行调用.
这两个个方法之间的Activity是一个可见的生命周期
v.onResume()
这个方法表示当前的Activity已经可以与用户进行交互了.活动处于栈顶状态.
vi.onPause()
与onResume()方法形成对应关系.这个方法在系统准备去启动或者恢复另一个活动的时候调用。我们通常会在这个方法中将一些消耗CPU 的资源释放掉,以及保存一些关键数据,但这个方法的执行速度一定要快,不然会影响到新的栈顶活动的使用。(注:onPause()方法调用之后不一定会去调用onStop()方法.取决于新Activity的显示方式,在下面会做出解释).
这两个方法之间的Activity是一个前台生存周期,也就是说当前的Activity可以与用户进行交互.
vii.onRestart()
这个方法的调用是当Activity从停止状态到运行状态时需要调用的方法.
上一张流程图..
以上就是关于Activity的生命周期的一个简单的介绍..下面来看一看相关的实例.
2.面对多种情况下Activity的生命周期流程
当MainActivity被创建的时候方法的调用过程:
MainActivity的创建会调用的方法:
onCreate();
onStart();
onResume();
当我们点击第一个按钮的时候,开启一个新的Activity(我们称为Activity1).当Activity1被创建的时候方法的调用过程是这样的.
首先Activity1调用的方法如下:
Activity1的回调方法如下:
onCreate();
onStart();
onResume();
MainActivity的回调方法:
MainActivity被Activity1覆盖之后回调方法的调用
onPause();
onStop();
这时MainActivity已经执行了上面的一些方法..
当我们退出Activity1的时候.MainActivity的执行方法如下:
当我们退出Activity1.回到MainActivity的时候方法的调用
onRestart();
onStart();
onResume();
这里我们可以看到onCreate()方法就不会被执行了.这种情况的前提是我们手机的内存空间是充足的.
我们在来看另外一种情况,比如说我们开启了一个应用,然后进入了一个Activity界面中,然后我们这时点击了home键进行了退出操作,并且没有清理手机的内存.这个时候我们去玩手机游戏,并且这个手机游戏会占用相当多的内存空间.然后我们玩完之后,如果我们再次返回前一个我们开启的那个应用的时候,他仍然会显示那个Activity的页面.那么这个时候这个Activity又执行了哪些方法呢?
我们知道手游是相当耗费内存的.按照上面的那个流程图来看..如果其他有优先级的应用需要使用内存空间的时候,并且系统空间并不是很足的时候.就需要杀掉进程.释放那些已经不再显示的Activity.也就是处于onStop()状态的时候.因此当我们如果再次回到那个应用的Activity的界面的时候.就需要重新调用onCreate()方法对Activity进行重新创建.然后再去执行onStart().onResume()。
我们接着看上面的另外一种情况,就是我们去点击第二个按钮的时候,弹出的对话框Activity(这里称为Activity2).我们来看看这种情况.当我们点击第二个按钮的时候Activity2的回调方法过程.
Activity2的回调方法:
onCreate();
onStart();
onResume();
Activity2的创建仍然没有什么太大的区别..还是这三个方法的调用.那么我们来看看MainActivity的回到方法:
MainActivity的回调方法:
onPause();
这里我们可以看到MainActivity只是调用了一个方法.onPause()方法.并没有去调用onStop()方法了.因为MainActivity仍然处于一个可见的状态.虽然我们启动了一个新的Activity,但是Activity2并没有完全的覆盖MainActivity,因此MainActivity只需要去调用onPause()方法.当我们点击回退的时候,MainActivity只会去调用onResume()方法了.
3.onSaveInstanceState()方法
前面我们已经说过,当一个活动进入到了停止状态,是有可能被系统回收的。那么如果应用中有一个活动A,用户在活动A的基础上启动了活动B,活动A就进入了停止状态,这个时候由于系统内存不足,将活动A 回收掉了,然后用户按下Back 键返回活动A,会出现什么情况呢?其实还是会正常显示活动A的,只不过这时并不会执行onRestart()方法,而是会执行活动A的onCreate()方法,因为活动A 在这种情况下会被重新创建一次。
但是这样会导致的情况就是,这个新创建的Activity是无法保存用户上次输入的相关信息的.比如说,用户在一个文本框中输入了相关内容然后走了上面的情况.被回收之后,只能重新进行创建,那么原来用户在文本框中输入的相关内容也就不复存在了.这样就会使得用户的体验性较差.那么我们如何去记录用户上一次的操作的相关信息呢?那么就是使用onSaveInstanceState()方法了.
我们知道Activity创建的时候会调用onCreate()方法.onCreate()方法中存在一个Bundle对象.默认情况下,这个对象的数据是空的.但是如果我们需要保存上一次用户的相关操作,一些数据信息,那么就需要使用这个对象了.
我们只需要这样..
@Override
protected void onSaveInstanceState(Bundle State) {
super.onSaveInstanceState(outState);
String data = "需要保存的数据";
State.putString("data_key", data);
}
通过这个方法将数据信息进行保存,那么恢复的时候就可以这样..
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
if (savedInstanceState != null) {
String data = savedInstanceState.getString("data_key");
}
//取出数据之后,在这里进行恢复.
}
这样就可以通过使用这个方法保存上次用户输入的一些数据信息,如果在面对Activity需要重新创建的时候,将数据进行取出,然后重新赋给Activity这样就可以使得用户上次输入的数据会得以保存.使得Activity对用户的体验更加的良好,,
Android之Activity的生命周期的更多相关文章
- 浅谈Android中Activity的生命周期
引言 我想对于Android开发人员来说,Activity是再熟悉不过了,今天我们就来探讨下Activity的生命周期.熟悉的掌握Activity对于开发健壮的Android应用程序来说至关重要.下面 ...
- 每天一点Android干货-Activity的生命周期
Activity Activity是这样一个程序组件,它为用户提供一个用于任务交互的画面. 一个应用程序通常由多个activity组成,它们彼此保持弱的绑定状态.典型的,当一个activity在一个应 ...
- Android中Activity的生命周期
简介: 这个基本是必问的问题了,说一下你对Activity生命周期的理解,呵呵… onCreate, onStart, onResume, onPause, onStop, onDestroy, on ...
- 无废话Android之activity的生命周期、activity的启动模式、activity横竖屏切换的生命周期、开启新的activity获取他的返回值、利用广播实现ip拨号、短信接收广播、短信监听器(6)
1.activity的生命周期 这七个方法定义了Activity的完整生命周期.实现这些方法可以帮助我们监视其中的三个嵌套生命周期循环: (1)Activity的完整生命周期 自第一次调用onCrea ...
- android学习——activity的生命周期
Android中主要组件之Activity的生命周期,基本都是翻译Android API和个人的理解. 首先看一下Android api中所提供的Activity生命周期图: Activity其实是继 ...
- Android的activity的生命周期
activity的生命周期有四个重要的状态:活动,暂停,停止,销毁 基本的方法有:onCreate.onStart.onResume.onPause.onStop.onDestory 最经常使用的方法 ...
- Android课程---Activity 的生命周期
activity类处于android.app包中,继承体系如下: 1.java.lang.Object 2.android.content.Context 3.android.app.Applicat ...
- 【android】android中activity的生命周期
activity生命周期: 实例代码: public class DemoActivity extends Activity { //1.activity第一次被创建的时候,执行 @Override ...
- Android Studio [Activity的生命周期]
package com.xdw.a122; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; imp ...
随机推荐
- NativeScript 也能开发桌面应用 (nativescript-dotnet-runtime)
自从看了NativeScript就甚是喜欢,心想要是也能开发桌面应用该多好.求人不如求己,开源组件很强大,差不多组装一下就行了,说干就干. Javascript 引擎用 Jint , 纯C#实现,集成 ...
- ListView 加载更多列表 Load More mono forandroid 项目笔记
今天项目经理找我说Listview加载更多的时候会出现一些问题,主要表现在会顿一下.让我我就去找Java的方法看看.自己写出了mono 的加载更多功能.和大家分享一下 先看效果 首先是模型类ListI ...
- 免费的HTML5版uploadify送上
相信有不少同学用过uploadify这一款文件上传插件,它支持多文件选择.能显示进度条.可配置性高,总体来说是比较好用的.官网有两个版本供下载,分别是flash版和HTML5版.不过令人惋惜的是,HT ...
- PowerShell笔记
教程: http://www.pstips.net/powershell-online-tutorials/ http://www.3fwork.com/a113/ 1. 查看成员 $MyInvoca ...
- 【译】用Fragment解决屏幕旋转(状态发生变化)状态不能保持的问题
这篇文章解决了在StackOverflow上一个经常被提到的问题. 在配置发生变化(Configuration changs)时,什么是最好的保存活动对象方法,比如运行中的线程,Sockets,Asy ...
- mysqlnd cannot connect to MySQL 4.1+
phpMyAdmin - error #2000 - mysqlnd cannot connect to MySQL 4.1+ using the old insecure authenticatio ...
- Android 综合揭秘 —— 全面剖释 Service 服务
引言 Service 服务是 Android 系统最常用的四大部件之一,Android 支持 Service 服务的原因主要目的有两个,一是简化后台任务的实现,二是实现在同一台设备当中跨进程的远程信息 ...
- 破解 失控神域 dat文件格式。
CrackHelper.loadByteArray('../unit_data.dat', function(b:ByteArray):void{ b.uncompress(); var s:Stri ...
- 基于Task的异步模式--全面介绍
今天是国庆长假第一天,也是今天十月的开始.每到这个时候都是看海的季节-一个看"人海"的季节.反正我是不想在这样一个尴尬期出去放松自己,于是不如在家写写博客,长点本领呢.今天就来给大 ...
- NodeJS实例系列~环境搭建,Hello world归来!
回到目录 1 安装Node.js服务端程序 https://github.com/Microsoft/nodejstools/wiki/Install-Node.js-and-get-started- ...