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的生命周期的更多相关文章

  1. 浅谈Android中Activity的生命周期

    引言 我想对于Android开发人员来说,Activity是再熟悉不过了,今天我们就来探讨下Activity的生命周期.熟悉的掌握Activity对于开发健壮的Android应用程序来说至关重要.下面 ...

  2. 每天一点Android干货-Activity的生命周期

    Activity Activity是这样一个程序组件,它为用户提供一个用于任务交互的画面. 一个应用程序通常由多个activity组成,它们彼此保持弱的绑定状态.典型的,当一个activity在一个应 ...

  3. Android中Activity的生命周期

    简介: 这个基本是必问的问题了,说一下你对Activity生命周期的理解,呵呵… onCreate, onStart, onResume, onPause, onStop, onDestroy, on ...

  4. 无废话Android之activity的生命周期、activity的启动模式、activity横竖屏切换的生命周期、开启新的activity获取他的返回值、利用广播实现ip拨号、短信接收广播、短信监听器(6)

    1.activity的生命周期 这七个方法定义了Activity的完整生命周期.实现这些方法可以帮助我们监视其中的三个嵌套生命周期循环: (1)Activity的完整生命周期 自第一次调用onCrea ...

  5. android学习——activity的生命周期

    Android中主要组件之Activity的生命周期,基本都是翻译Android API和个人的理解. 首先看一下Android api中所提供的Activity生命周期图: Activity其实是继 ...

  6. Android的activity的生命周期

    activity的生命周期有四个重要的状态:活动,暂停,停止,销毁 基本的方法有:onCreate.onStart.onResume.onPause.onStop.onDestory 最经常使用的方法 ...

  7. Android课程---Activity 的生命周期

    activity类处于android.app包中,继承体系如下: 1.java.lang.Object 2.android.content.Context 3.android.app.Applicat ...

  8. 【android】android中activity的生命周期

    activity生命周期: 实例代码: public class DemoActivity extends Activity { //1.activity第一次被创建的时候,执行 @Override ...

  9. Android Studio [Activity的生命周期]

    package com.xdw.a122; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; imp ...

随机推荐

  1. C#打开关闭数据库连接

    一.忘记sqlserver密码时,运行语句,可修改密码,记得查看账户是否被禁用 EXECUTE sp_password NULL,'输入新密码','sa': 二.代码:data source一定要加上 ...

  2. Linux下搭建PHP环境

    转载于: http://www.uxtribe.com/php/405.html 该站下有系列PHP文章. 在Linux下搭建PHP环境比Windows下要复杂得多.除了安装Apache,PHP等软件 ...

  3. 软件工程day4

    使用ps制作了一个icon,将在下个版本中添加,用作程序图标. 参与组例会,得知新功能“吐槽墙”将以聊天室类似的社区形式实现. 提出对现有UI的建议: 对目前的登录窗口的UI不做改动,将标题的“用户登 ...

  4. Quartz.net 定时调度时间配置格式说明与实例

    格式: [秒] [分] [小时] [日] [月] [周] [年] 序号 说明 是否必填 允许填写的值 允许的通配符 1 秒 是 0-59 , - * / 2 分 是 0-59 , - * / 3 小时 ...

  5. RCP:给GEF编辑器添加拖拽辅助线

    当图形边缘碰触时,会产生一条帮助拖拽的辅助线 这里需要三个类: 1.SnapToGeomotry 2.SnapToGuide(非必须) 3.SnapFeedbackPolicy

  6. [翻译]docker生态圈Mindmap

    Docker是一个开源的Linux容器,其被业界所接受,很快成为了一个产业标准.Docker可以减少应用程序启动 时候的大量资源的筹备.docker很快的成为了新兴的应用程序容器标准.现在有很多项目正 ...

  7. 【开源】开发者新闻聚合APP 2.0.3发布(第二个稳定版本)

    聚合了博客园新闻.infoq新闻.36kr新闻.oschina新闻.51cto新闻.csdn新闻: 争取做到随时刷随时有开发者的新闻! 目前还只支持安卓APP 但用的人多了,我会发布苹果版的APP 最 ...

  8. 页面动态加入<script>标签并执行代码

    在页面中动态追加html片段的时候,有时候动态添加的代码会含有<script>标签,比如用了一些模板引擎,或者你的代码有些复杂的时候.然而我们用DOM提供的innerHTML方式来添加代码 ...

  9. 为什么一定要杀掉病毒?---帮一位老师解决MyDocument.exe优盘文件夹图标病毒问题

    最近一位大学老师给我抱怨了一个她遇到的烦恼,一直在纠结,生活都被打乱了,事情大概是这样的: 她的优盘里辛辛苦苦弄好备课文件,放在了优盘里,可是每次上课时,就是找不到文件.有时好多文件都被修改了,非常烦 ...

  10. FastUI快速界面原型制作工具

    FastUI是一款快速制作应用程序界面原型的小工具,它之所以快,是因为它体积小巧.功能简洁实用. 在真正的应用程序(包括winform.手机app.网站等)开始编码之前,一般要先设计出原型,以便确认需 ...