【Android】Activity 生命周期具体解释
与其它编程模式不同,android中的Activity没有main()函数。我们无法决定Activity的创建和销毁过程,Activiy的创建和销毁(即生命周期)由系统完毕,系统会在Activity的生命周期的各个阶段回调Activity对应的成员函数。
假设你想在Activity的某个生命周期阶段完毕一些事情,你要做的就是重写(Override)对应的生命周期回调函数,并在该函数中完毕对应的任务。Activity的生命周期函数有onCreate()、onStarted()、onResumed()、onPaused()、onStop()、onDestroy()、onRestart()。
以下是Activiy的生命周期金字塔。当我们第一次启动App时。在AndroidManifest.xml中指定为android.intent.action.MAIN的Acivity实例被创建。该Activity实例的onCreate()、onStart()、onResume()生命周期方法被依次调用。Activity进入Resumed状态。在Resumed状态下Activity出如今屏幕上成为当前活跃的Activity。当按下手机的HOME键。Activity的onPause()和onStopped()生命周期函数被依次调用。Activity进入Stopped状态,此时假设再次打开APP,Activity的onRestart()和onStart()生命周期函数被依次调用,假设在Stoppped状态下,App被主动关闭或系统因为资源不足而导致关闭,Activity的onDestroy()生命周期函数会被调用。
 
图 1 Activity生命周期金字塔
以下结合代码来看看上面的过程:
package com.example.TestActiviyLifecycle;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
public class MyActivity extends Activity {
    private static final String TAG = "com.example.TestActiviyLifecycle";
    /**
     * Called when the activity is first created.
     */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Log.d(TAG, "onCreate() called");
    }
    @Override
    protected void onStart() {
        super.onStart();
        Log.d(TAG, "onStart() called");
    }
    @Override
    protected void onRestart() {
        super.onRestart();
        Log.d(TAG, "onRestart() called");
    }
    @Override
    protected void onResume() {
        super.onResume();
        Log.d(TAG, "onResume() called");
    }
    @Override
    protected void onPause() {
        super.onPause();
        Log.d(TAG, "onPause() called");
    }
    @Override
    protected void onStop() {
        super.onStop();
        Log.d(TAG, "onStop() called");
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "onDestroy() called");
    }
}启动APP
Logcat输出日志: 
按HOME键后再打开APP
按HOME键后。Logcat输出日志: 
接着再次进入APP。Logcat输出日志: 
横屏、竖屏切换
竖屏模式下打开APP后(此时Activity处于Resumed状态),开启横屏竖屏切换,将手机切换至横屏模式,Logcat输出日志: 
 
可见进行横屏和竖屏切换时,Activity被销毁并重建。
数据保存与恢复
Activity实例从Resumed状态进入Destroyed状态时,其成员函数onSaveInstanceState(Bundle)会被调用,在该函数中你能够将须要保存的数据存储在Bundle对象中。当该Activity随后被重建时,该Bundle对象会被传递给回调函数onCreate(Bundle)和onRestoreInstanceState(Bundle)函数,你能够从Bundle对象中取出数据重建Activity。 
 
图 2 Activity中数据保存与恢复
在上面的Activiy中加入一个EditText,例如以下:
<?xml version="1.0" encoding="utf-8"?
>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="match_parent"
              android:layout_height="match_parent" >
    <EditText
            android:id="@+id/edittext_text"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>
</LinearLayout>打包执行APP。在EditText中输入文字后,然后旋转屏幕。EditText中内容丢失了。
为解决上面问题,须要对EditText中的数据进行保存。并在Activity重建时恢复数据,在上面Activity中加入以下代码:
    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        TextView textView = (TextView)findViewById(R.id.edittext_text);
        outState.putString(EXTRA_TEXT, textView.getText().toString());
    }
    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        String text = savedInstanceState.getString(EXTRA_TEXT);
        TextView textView = (TextView)findViewById(R.id.edittext_text);
        textView.setText(text);
    }Activity的成员函数onSaveInstanceState()会在Activity进入Stopped状态之前被调用,因此在该函数中获取并保存文本输入框中的数据到Bundle中(用于保存Key-Value的数据结构)。
onRestoreInstanceState()会在Activity重建时被调用。而且将该Activity上一次保存在Bundle中的数据传给该函数。能够从输入參数中获取上一次保存的数据并恢复。
如今在竖屏模式下输入内容后。旋转屏幕EditText中的内容依旧存在。
參考: 
[1]Google Android 官方文档
【Android】Activity 生命周期具体解释的更多相关文章
- android --Activity生命周期具体解释
		一. 再探Activity生命周期 为了研究activity的生命周期,简单測试代码例如以下. package com.example.testactivity; import android.app ... 
- 深入剖析Android四大组件(一)——Activity生命周期具体解释
		1.管理Activity的生命周期 不管是正在执行的Activity还是没有执行的Activity,它们都接受Android的框架管理,这使得Activity处于不同的生命周期. ①Activity的 ... 
- [转]: 两分钟彻底让你明白Android Activity生命周期(图文)!
		转自:http://blog.csdn.net/android_tutor/article/details/5772285 大家好,今天给大家详解一下Android中Activity的生命周期,我在前 ... 
- Android Activity生命周期详讲
		管理 Activity 生命周期 通过实现回调方法管理 Activity 的生命周期对开发强大而又灵活的应用至关重要. Activity 的生命周期会直接受到 Activity 与其他 Activit ... 
- Android Activity生命周期
		从android api文档摘抄出来的activity生命周期图如下: Activity有如下四种状态 a.活动状态 activity处于屏幕前台,获取到了焦点可以和用户进行交互,同一时刻只有一个a ... 
- android Activity生命周期(设备旋转、数据恢复等)与启动模式
		1.Activity生命周期 接下来将介绍 Android Activity(四大组件之一) 的生命周期, 包含运行.暂停和停止三种状态,onCreate.onStart.onResume.o ... 
- Android Activity生命周期以及Fragment生命周期的区别与分析
		Android Fragment生命周期图: Activity生命周期图: 对照图: Fragment生命周期分析: 1. 当一个fragment被创建的时候,它会经历以下状态. onAttach() ... 
- Android Activity 生命周期详解
		学习android开发这么久对于activity的生命周期还没有仔细思考过,所以,我大致的把这些东西整理一下,希望通过这使自己理解的更透彻点吧! 首先看一下Activity生命周期图和它的的四个阶段 ... 
- xamarin Android activity生命周期详解
		学Xamarin我为什么要写这样一篇关于Android 的activity生命周期的文章 已经学Xamarin android有一段时间了,现在想起当初Xamarin也走了不少的弯路.当然Xamari ... 
随机推荐
- python 学习笔记 - Queue & Pipes,进程间通讯
			上面写了Python如何创建多个进程,但是前面文章中创建的进程都是哑巴和聋子,自己顾自己执行,不会相互交流.那么如何让进程间相互说说话呢?Python为我们提供了一个函数multiprocessing ... 
- 「Codechef April Lunchtime 2015」Palindromeness
			「Codechef April Lunchtime 2015」Palindromeness 解题思路 : 考虑对于回文子串 \(s\) 贡献的定义: \[ value_s = [\ s[1,\lflo ... 
- CodeForces - 1017C  The Phone Number
			题面在这里! 一开始有一种构造猜想,可以把答案降到 sqrt(N) 级别. 考虑把 {1,2,...,n} 分成 sqrt(N) 段,每一段是连续的sqrt(N)个数.然后我们倒着把每一段数放上. 比 ... 
- Java乐观锁实现之CAS操作
			介绍CAS操作前,我们先简单看一下乐观锁 与 悲观锁这两个常见的锁概念. 悲观锁: 从Java多线程角度,存在着“可见性.原子性.有序性”三个问题,悲观锁就是假设在实际情况中存在着多线程对同一共享的竞 ... 
- 【9.7校内测试】【二分+spfa】【最长上升子序列】【状压DP+贪心(?)】
			刘汝佳蓝书上的题,标程做法是从终点倒着$spfa$,我是二分答案正着$spfa$判断可不可行.效果是一样的. [注意]多组数据建边一定要清零啊QAQ!!! #include<iostream&g ... 
- 某DP题目5
			题意 一个游戏里有k种装备,一开始等级为1,每打败一个怪兽,会随机掉落一件一种类型的装备,它的等级为[1,t+1]中的随机一个数,t为当前佩戴的类型的装备的等级,若掉落t+1等级的装备,就会佩戴该装备 ... 
- bzoj1634护花
			试题描述: 约翰留下他的N(N<=100000)只奶牛上山采木.他离开的时候,她们像往常一样悠闲地在草场里吃草.可是,当他回来的时候,他看到了一幕惨剧:牛们正躲在他的花园里,啃食着他心爱的美丽花 ... 
- 内功心法 -- java.util.LinkedList<E> (1)
			写在前面的话:读书破万卷,编码如有神--------------------------------------------------------------------下文主要对java.util ... 
- ACM -- 算法小结(九)DP之Humble numbers
			DP -- Humble numbers //一开始理解错题意了,题意是是说一些只有唯一一个质因数(质因数只包括2,3,5,7)组成的数组,请找出第n个数是多少 //无疑,先打表,否则果断 ... 
- TRF7970A IC Communication Interface
			General Introduction The communication interface to the reader can be configured in two ways: with a ... 
