• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Android > Android Activity的生命周期简单总结

Android Activity的生命周期简单总结

作者:网友 字体:[增加 减小] 来源:互联网 时间:2017-05-26

网友通过本文主要向大家介绍了android activity,android activity跳转,android activity传值,android activity透明,android activity栈等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

Android Activity的生命周期简单总结


Android Activity的生命周期简单总结

这里的内容参考官方的文档,这篇文章的目的不是去总结Activity是如何启动,如何创造,以及暂停和销毁的,而是从实际开发中分析在Activity各个生命周期,我们应该处理的内容。

Activity 各个生命周期

谷歌官方图片

由图可以看出 ,在一个activity的生命周期中,系统会像金字塔模型一样去调用一系列的生命周期回调函数。在最上端是当前Activity的运行状态,也就是说用户彻底看到这个Activity时,Activity正处于onResume()状态。而且有图可以看出来存在很长时间的状态只有三个,Resume,Paused和Stoped其他几个状态存在的时间比较短暂,很快就会进入其他状态。而Create方法作为创建Activity时调用的方法,也是极为重要的回调方法。下面我们重点考虑这个四个方法的回调时机,并考虑在其中应该填入的功能。

onCreate

启动一个Activity,Android一般有2种方式,即通过点击主界面的应用图标启动Activity和在其他Activty中用startActivity之类的方法启动新的Activity.但不管哪种方式,创建新的Activity时都会调用onCreate()方法。我们必须来实现程序启动所需要的各种基本逻辑。比如声明UI元素,定义成员变量,配置UI等等。
注意在onCreate里面尽量少做事情,避免程序启动太久看不到界面。因为onCreate执行完事之后,用户并不能看到界面,直到经历了onStart之后调用onResume进入Resume状态,这时才是用户看到的界面,所以如何onCreate中做的事情太多,则程序会启动的比较久。一般新建一个Activity会自动生成onCreate,其代码如下:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main_activity);
}

这里我们可以看到onCreate回调方法中传入的参数是Bundle类型的savedInstanceState。这是参数是用来保存Activity和恢复Activity的。当Activity是因为用户点击Back按钮或者是activity通过调用finish()结束自己时,系统就丢失了对Activity实例的引用,因为这一行为意味着不再需要这个activity了。然而,如果因为系统资源紧张而导致Activity的Destory, 系统会在用户回到这个Activity时有这个Activity存在过的记录,系统会使用那些保存的记录数据(描述了当Activity被Destory时的状态)来重新创建一个新的Activity实例。那些被系统用来恢复之前状态而保存的数据被叫做"instance state",它是一些存放在Bundle对象中的key-value pairs。这是官方对instance state的解释。一般,我们可以不用管它,因为他会自动保存每个View视图的信息,然后当恢复的时候,会自动恢复到之前的状态。但我们有时候也会让他保存一些我们希望他保存的东西,比如记录用户状态的成员变量信息,这时我们需要用到onSavaInstacneState()方法,当用户离开Activity时,系统会调用它。当系统调用这个函数时,系统会在Activity被异常Destory时传递 Bundle 对象,这样我们就可以增加额外的信息到Bundle中并保存到系统中。若系统在Activity被Destory之后想重新创建这个Activity实例时,之前的Bundle对象会(系统)被传递到你我们activity的onRestoreInstanceState()方法与 onCreate() 方法中。
\

为了给Activity保存额外的状态信息,你必须实现onSaveInstanceState() 并增加key-value pairs到 Bundle 对象中,例如:

static final String STATE_SCORE = "playerScore";
static final String STATE_LEVEL = "playerLevel";
...

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    // Save the user's current game state
    savedInstanceState.putInt(STATE_SCORE, mCurrentScore);
    savedInstanceState.putInt(STATE_LEVEL, mCurrentLevel);

    // Always call the superclass so it can save the view hierarchy state
    super.onSaveInstanceState(savedInstanceState);
}

然后恢复Activity的时候,我们先判断一下时候是第一次创建还是恢复之前被Destory的Activity,可以参见下面的例子,在onCreate方法里恢复数据

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState); // Always call the superclass first

    // Check whether we're recreating a previously destroyed instance
    if (savedInstanceState != null) {
        // Restore value of members from saved state
        mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
        mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
    } else {
        // Probably initialize members with default values for a new instance
    }
    ...
}

我们也可以选择实现onRestoreInstanceState(),而不是在onCreate方法里面恢复数据。onRestoreInstanceState()方法会在onStart()方法之后执行. 系统仅仅会在存在需要恢复的状态信息时才会调用onRestoreInstanceState(),因此不需要检查 Bundle 是否为null。

public void onRestoreInstanceState(Bundle savedInstanceState) {
    // Always call the superclass so it can restore the view hierarchy
    super.onRestoreInstanceState(savedInstanceState);

    // Restore state members from saved instance
    mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
    mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
}

onPause

Paused状态是一个长期保持的静态状态,Activity有时候会被其他可见的组件阻塞,从而导致当前的activity进入Pause状态。例如当打开一个对话框的时候,之前的 Activity会被暂停,但只要之前的Activity仍然被部分可见,这个activity就会会一直处于Paused状态。然而,一旦之前的activity被完全阻塞并不可见时,则其会进入Stop状态.activity一旦进入paused状态,系统就会调用activity中的onPause()方法, 该方法中可以停止不应该在暂停过程中执行的操作,如暂停视频播放;或者保存那些有可能需要长期保存的信息。如果用户从暂停状态回到当前activity,系统应该恢复那些数据并执行onResume()方法。
通常在onPause()回调方法中做以下事情

停止动画或者是其他正在运行的操作,那些都会导致CPU的浪费.
提交在用户离开时期待保存的内容(例如邮件草稿).
释放系统资源,例如broadcast receivers, sensors (比如GPS), 或者是其他任何会影响到电量的资源。

例如, 如果程序使用Camera,onPause()会是一个比较好的地方去做那些释放资源的操作。

@Override
public void onPause() {
    super.onPause();  // Always call the superclass method first

    // Release the Camera because we don't need it when paused
    // and other activities might need to use it.
    if (mCamera != null) {
        mCamera.release()
        mCamera = null;
    }
}

不应该使用onPause()来执行CPU-intensive 的工作,例如写数据到DB,因为它会导致切换到下一个activity变得缓慢。

onResume

当用户从Paused状态恢复activity时,系统会调用onResume()方法。请注意,系统每次调用这个方法时,activity都处于前台,包括第一次创建的时候。所以,应该实现onResume()来初始化那些在onPause方法里面释放掉的组件,并执行那些activity每次进入Resumed state都需要的初始化动作 (例如开始动画与初始化那些只有在获取用户焦点时才需要的组件)
下面的onResume()的例子是与上面的onPause()例子相对应的。

@Override
public void onResume() {
    super.onResume();  // Always call the superclass method first

    // Get the Camera instance as the activity achieves full user focus
    if (mCamera == null) {
        initializeCamera(); // Local method to handle camera init
    }
}

onStop

在下面一些关键的场景中会涉及到停止与重启:

用户打开最近使用app的菜单并从我们的app切换到另外一个app,这个时候我们的app是被停止的。如果用户通过手机主界面的启动程序图标或者最近使用程序的窗口回到我们的app,那么我们的activity

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 滑动关闭activity,滑动activity
  • 切换横竖屏的时候Activity的生命周期变化情况,activity生命周期
  • Android—Service与Activity的交互,androidactivity
  • Android中Activity运行时屏幕方向与显示方式详解,androidactivity
  • Android生命周期,activity生命周期
  • Android 面试题--Activity,android--activity
  • Android 四大组件之Activity(续2),androidactivity
  • Android动态加载Activity原理
  • [Android] Activity间切换,传递数据,androidactivity
  • Android Activity的生命周期简单总结

相关文章

  • 2017-05-26Android的Message Pool是什么——源码角度分析,androidpool
  • 2017-05-26精品干货丨APP常用导航框架,干货丨app导航
  • 2017-05-222.3.9 RatingBar(星级评分条)
  • 2017-05-26pull解析器: 反序列化与序列化,pull序列化
  • 2017-05-26网站访问量和服务器带宽的选择
  • 2017-05-26HBase Thrift2 CPU过高问题分析
  • 2017-05-26关于安卓的一些初步认识,安卓认识
  • 2017-05-26Android pm命令详解
  • 2017-05-26android:webview实现简单的浏览器
  • 2017-05-26FragmentStatePagerAdapter和FragmentPagerAdapter区别,fragmentpageradapter

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • Android开源项目分类汇总(六)工具库
    • android基于口令加密快速搞懂(一),android搞懂
    • 连点处理,禁止按钮在短时间内被多次点击,按钮短时间内
    • Android刷机教程之LG Nexus 5X线刷官方Nexus系列教程,androidnexus
    • Android应用:横竖屏切换总结,android切换总结
    • Android之ViewPager 第二课,androidviewpager
    • 踩坑实录 Android studio中关于 No cached version of **** available for of处理办法,androidcached
    • Android 自定义控件之第三讲:obtainStyledAttributes 系列函数详解
    • onTouch和onTouchEvent,ontouch
    • [android] 手机卫士手势滑动切换屏幕,android手势

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有