文档章节

ActivityLifeCycle详解android Activity生命周期

DouDouLee
 DouDouLee
发布于 2016/02/28 22:48
字数 1296
阅读 11
收藏 0
点赞 1
评论 0

 

一个简洁的Activity生命周期说明图,类似阶梯金字塔。这张图显示了Activity的各个状态到达onResume状态的回调函数(callback)。由于Activity的复杂性,我们并不需要实现生命周期里所包含的所有的方法,重要是理解每个方法并实现它,达到用户的期望。

实现生命周期里的方法能保证(1)用户在使用你的app的时候接到一个电话或者转到其他app,你的app不会崩溃。

(2)当用户不常使用的时候不会消耗珍贵的系统资源。

(3)当用户离开app再返回时不会丢失离开时的进度。

(4)当屏幕旋转时不会丢失当时的进度。除了以下三种状态,生命周期里的其他状态都是不稳定的(不长期存在,只是到达稳定状态的过度)。(1)onResume( )这个状态下,Activity处于前台,用户可以与之交互。

(2)onPause( )这个状态下,activity被另一个activity部分遮住。即另一个处于前台半透明的或没有占满全屏的activity。处于pause状态的activity不能收到用户的输入,不会执行任何代码。

(3)onStop( )这个状态下,activity被完全隐藏,用户看不到。activity的实例和成员变量都被保留,但不能执行任何代码。activity启动时,system调用onCreate( )之后快速调用onStart( )接着到达onResume( )。

以下为几种行为下的函数调用情况:

1、创建新的实例时:

这个说明图重点说明在创建实例时系统依次调用的三个主要回调函数onCreate( )、onStart( )、onResume( )。这三个函数依次调用后就到了onResume( )状态,此时用户就可以与 activity交互。

TextView mTextView; // Member variable for text view in the layout

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Set the user interface layout for this Activity
    // The layout file is defined in the project res/layout/main_activity.xml file
    setContentView(R.layout.main_activity);
    
    // Initialize member TextView so we can manipulate it later
    mTextView = (TextView) findViewById(R.id.text_message);
    
    // Make sure we're running on Honeycomb or higher to use ActionBar APIs
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        // For the main activity, make sure the app icon in the action bar
        // does not behave as a button
        ActionBar actionBar = getActionBar();
        actionBar.setHomeButtonEnabled(false);
    }
}

2、销毁一个活动,onDestroy( )

 系统在调用onDestroy( )之前会先调用onPause( )、onStop( ),除非当你的activity作为一个暂时的决策者(decision maker)去启动(launch)另一个activity,你可能会在onCreate( )中调用finish( )来销毁你的activity。

 @Override
public void onDestroy() {
    super.onDestroy();  // Always call the superclass
    
    // Stop method tracing that the activity started during onCreate()
    android.os.Debug.stopMethodTracing();
}

3、停止和恢复一个Activity,(Pausing and Resuming an Activity)

当一个半透明状态(semi-transparent)的activity模糊了你的activity,系统调用onPause( ),activity会在上图状态1等待,当处于onPause状态是用户返回activity系统调用onResume( )。例如相机:

@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;
    }
}

当用户将activity从PauseState恢复时调用onResume( )。每当activity到前台时,或activity第一次创建时系统都会调用onResume( )。因此你需要实现onResume( )方法来初始化在onPause( )时释放掉的元素。

下面的一个例子是在onResume( )中对Pause相机释放掉的初始化:

 @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
    }
}

4、停止和重新启动一个Activity(Stoping and Restarting an Activity)

当用户离开activity,系统调用onStop( ) 1来使activity停止,当activity在停止状态,用户返回,系统调用onRestart( )2,紧接着是onStart( )、onResume( ).无论何种情况系统停止一个activity,总是在调用onStop( )之前调用onPause( )。当activity接收到onStop( )方法,activity就不可见了并且释放所有当用户不使用activity时的资源。当 activity Stop时很可能会内存泄漏,因此最好use onStop( ) to perform larger,下面一个例子是onStop( )方法的实现,在存储器中保存草稿(saves the contents of a draft  note to persistent storage)。

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

    // Save the note's current draft, because the activity is stopping
    // and we want to be sure the current note progress isn't lost.
    ContentValues values = new ContentValues();
    values.put(NotePad.Notes.COLUMN_NAME_NOTE, getCurrentNoteText());
    values.put(NotePad.Notes.COLUMN_NAME_TITLE, getCurrentNoteTitle());

    getContentResolver().update(
            mUri,    // The URI for the note to update.
            values,  // The map of column names and new values to apply to them.
            null,    // No SELECT criteria are used.
            null     // No WHERE columns are used.
            );
}

当activity is stopped,Activity 对象会在内存中保存,当activity恢复时调用,不用重新初始化元素。系统还会记录每个View的当前状态,例如关闭前在EditText中输入的内容再次打开时会显示。

5、重新创建一个Activity

当系统停止一个activity,它调用onSaveInstanceState( ).如果activity destroyed,同样的实例再次创建的时候,系统会将在1定义的状态数据传递给2onCreate( )方法和3onRestoreInstanceState( )方法。当activity开始stop的时候,系统调用onSaveInstanceState( ),因此activity以键值对的形式收集信息。

 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);
}

© 著作权归作者所有

共有 人打赏支持
DouDouLee
粉丝 6
博文 95
码字总数 45242
作品 0
西安
android同时监听所有activity生命周期状态实现

在做应用统计时我们可能需要在获取activity的生命周期状态,以前的方式是我们需要重写每一个activity的onResume() 等函数然后埋点。现在可以利用apkplug框架的activitylifecycle将所有activ...

梁大帅
2014/04/30
0
3
android Fragments详解六:处理fragement的生命周期

把条目添加到动作栏 你的fragment们可以向activity的菜单(按Manu键时出现的东西)添加项,同时也可向动作栏(界面中顶部的那个区域)添加条目,这都需通过实现方法onCreateOptionManu()来完...

jxlgzwh
2013/07/19
0
0
android Fragments详解六:处理fragement的生命周期

把条目添加到动作栏 你的fragment们可以向activity的菜单(按Manu键时出现的东西)添加项,同时也可向动作栏(界面中顶部的那个区域)添加条目,这都需通过实现方法onCreateOptionManu()来完...

晨曦之光
2012/03/12
0
0
Android必备:Activity 活动 和 Intent 意图 的学习整理

看这里:Android必备:Activity 活动 和 Intent 意图 的学习整理 在Android必备:Android UI控件的了解与学习中,对AndroidUI做了初步的了解和学习,本篇继续进行Android开发学习的整理。And...

Realfighter
2015/03/04
0
0
Android Activity的生命周期详解

Activity是由Activity栈进管理,当来到一个新的Activity后,此Activity将被加入到Activity栈顶,之前的Activity位于此Activity底部。Acitivity一般意义上有四种状态: 1.当Activity位于栈顶时...

恰同学少年
2015/07/27
0
0
Android零基础入门第86节:探究Fragment生命周期

一个Activity可以同时组合多个Fragment,一个Fragment也可被多个Activity 复用。Fragment可以响应自己的输入事件,并拥有自己的生命周期,但它们的生命周期直接被其所属的Activity的生命周期...

鑫鱻
2017/10/30
0
0
两分钟彻底让你明白Android Activity生命周期(图文)

大家好,今天给大家详解一下Android中Activity的生命周期,我在前面也曾经讲过这方面的内容,但是像网上大多数文章一样,基本都是翻译Android API,过于笼统,相信大家看了,会有一点点的帮助...

i_bobby
2013/09/26
0
0
android activity详解二:Activity的生命周期

管理Activity的生命周期 通过实现activity的生命周期回调方法来管理你的activity,是创造既稳定又灵活的activity的关键。Activity的生命周期直接受到相关的其它activity和它的任务以及所在栈...

晨曦之光
2012/03/12
0
0
android Fragments详解一:概述

Fragment是activity的界面中的一部分或一种行为。你可以把多个Fragment们组合到一个activity中来创建一个多面界面并且你可以在多个activity中重用一个Fragment。你可以把Fragment认为模块化的...

晨曦之光
2012/03/12
0
0
Fragment 的生命周期及使用方法详解

Fragment 的基础知识介绍 1.1 概述 1.1.1 特性 By hebang32624 Fragment 是 activity 的界面中的一部分或一种行为。可以把多个 Fragment 组合到一个 activity 中来创建一 个多面界面并且可以...

梁DH
2013/04/25
0
2

没有更多内容

加载失败,请刷新页面

加载更多

下一页

【面试题】盲人坐飞机

有100位乘客乘坐飞机,其中有一位是盲人,每位乘客都按自己的座位号就坐。由于盲人看不见自己的座位号,所以他可能会坐错位置,而自己的座位被占的乘客会随便找个座位就坐。问所有乘客都坐对...

garkey
49分钟前
0
0
谈谈神秘的ES6——(二)ES6的变量

谈谈神秘的ES6——(二)ES6的变量 我们在《零基础入门JavaScript》的时候就说过,在ES5里,变量是有弊端的,我们先来回顾一下。 首先,在ES5中,我们所有的变量都是通过关键字var来定义的。...

JandenMa
今天
1
0
arts-week1

Algorithm 594. Longest Harmonious Subsequence - LeetCode 274. H-Index - LeetCode 219. Contains Duplicate II - LeetCode 217. Contains Duplicate - LeetCode 438. Find All Anagrams ......

yysue
今天
0
0
NNS拍卖合约

前言 关于NNS的介绍,这里就不多做描述,相关的信息可以查看NNS的白皮书http://doc.neons.name/zh_CN/latest/nns_background.html。 首先nns中使用的竞价货币是sgas,关于sgas介绍可以戳htt...

红烧飞鱼
今天
1
0
Java IO类库之管道流PipeInputStream与PipeOutputStream

一、java管道流介绍 在java多线程通信中管道通信是一种重要的通信方式,在java中我们通过配套使用管道输出流PipedOutputStream和管道输入流PipedInputStream完成线程间通信。多线程管道通信的...

老韭菜
今天
0
0
用Python绘制红楼梦词云图,竟然发现了这个!

Python在数据分析中越来越受欢迎,已经达到了统计学家对R的喜爱程度,Python的拥护者们当然不会落后于R,开发了一个个好玩的数据分析工具,下面我们来看看如何使用Python,来读红楼梦,绘制小...

猫咪编程
今天
1
0
Java中 发出请求获取别人的数据(阿里云 查询IP归属地)

1.效果 调用阿里云的接口 去定位IP地址 2. 代码 /** * 1. Java中远程调用方法 * http://localhost:8080/mavenssm20180519/invokingUrl.action * @Title: invokingUrl * @Description: * @ret......

Lucky_Me
今天
1
0
protobuf学习笔记

相关文档 Protocol buffers(protobuf)入门简介及性能分析 Protobuf学习 - 入门

OSC_fly
昨天
0
0
Mybaties入门介绍

Mybaties和Hibernate是我们在Java开发中应用的比较多的两个ORM框架。当然,目前Mybaties正在慢慢取代Hibernate,这是因为相比较Hibernate而言Mybaties性能更好,响应更快,更加灵活。我们在开...

王子城
昨天
2
0
编程学习笔记之python深入之装饰器案例及说明文档[图]

编程学习笔记之python深入之装饰器案例及说明文档[图] 装饰器即在不对一个函数体进行任何修改,以及不改变整体的原本意思的情况下,增加函数功能的新函数,因为这个新函数对旧函数进行了装饰...

原创小博客
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部