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 ...
随机推荐
- JAVA CAS原理深度分析-转载
参考文档: http://www.blogjava.net/xylz/archive/2010/07/04/325206.html http://blog.hesey.net/2011/09/reso ...
- 使用Code::blocks在windows下写网络程序
使用Code::blocks在windows下写网络程序 作者 He YiJun – storysnail<at>gmail.com 团队 ls 版权 转载请保留本声明! 本文档包含的原创 ...
- Visual Studio Xamarin编译Android项目出错的解决办法
安装完Xamarin后,编译Android项目时,你会发现好长时间进度都不动,当你取消编译后,会发现其实是出错了,就是因在Android项目在第一次编译时要去google网站上下一个andorid s ...
- 关于"是否需要有代码规范"的个人看法
这些规范都是官僚制度下产生的浪费大家的编程时间.影响人们开发效率, 浪费时间的东西. 我是个艺术家,手艺人,我有自己的规范和原则. 规范不能强求一律,应该允许很多例外. 我擅长制定编码规范,你们听我的 ...
- Guava - EventBus(事件总线)
Guava在guava-libraries中为我们提供了事件总线EventBus库,它是事件发布订阅模式的实现,让我们能在领域驱动设计(DDD)中以事件的弱引用本质对我们的模块和领域边界很好的解耦设计 ...
- Android setTag方法的key问题
android在设计View类时,为了能储存一些辅助信息,设计一个一个setTag/getTag的方法.这让我想起在Winform设计中每个Control同样存在一个Tag. 今天要说的是我最近学习a ...
- [.net 面向对象编程基础] (10) 类的成员(字段、属性、方法)
[.net 面向对象编程基础] (10) 类的成员(字段.属性.方法) 前面定义的Person的类,里面的成员包括:字段.属性.方法.事件等,此外,前面说的嵌套类也是类的成员. a.类的成员为分:静态 ...
- 在Mongoose中使用嵌套的populate处理数据
假设有如下mongodb的schema定义: drawApply = new Schema({ salesId: { type: Schema.ObjectId, ref: 'sales' }, mo ...
- PHP面向对象07_PDO
oop007复习 2014-9-4 9:42:28 摘要: 1.pdo的作用 2.pdo的安装 3.pdo连接属性设置 4.pdo对象和PDOStatement对象 5.pdo预处理 6.pdo事务机 ...
- fir.im Weekly - 1000 个 Android 开源项目集合
冬天到了,适宜囤点代码暖暖身.本期 fir.im Weekly 收集了最近一些不错的 GitHub 源码.开发工具和技术实践教程类文章分享给大家. codeKK - 集合近 1000 Android ...