关于Activity生命周期容易忽略的部分

按照正常的理解,从activity1中呼叫打开另一个activity2,然后关闭activity2重新回到activity1时,
activity1会经历的生命周期如下: onPause()-->onStop()-->onRestart()-->onStart()-->onResume()
在测试中偶然发现一个问题,activity1的onRestart()和onStart()没有被调用!!
于是到网上爬文,找到了如下的博文:
http://blog.csdn.net/xiazdong/article/details/7765128
原来是因为,打开activity的形式会影响activity的生命周期。
当activity2是以窗体形式打开时,(在AndroidManifest.xml中添加android:theme="@android:style/Theme.Dialog")
activity1的生命周期为:onPause()-->onResume()
当activity2是以正常全屏幕方式打开时,才是我理解中的生命周期:
onPause()-->onStop()-->onRestart()-->onStart()-->onResume()

// ===========================接下来内容为转贴上面连接博客中的内容
一、Activity生命周期介绍

我们在学Java Web时会学到Servlet的生命周期,因此对生命周期的概念已经有一定了解,简单地说就是某个事物从出生到死亡的过程。
Activity也存在声明周期,从Activity被创建到最后被销毁;Activity运行时可能会受到一些突发事件的影响,例如在使用Activity时突然来了一个电话,则Activity需要在生命周期函数中设置;
下图是Activity生命周期中最经典的图:


7个生命周期方法:

(1)onCreate(Bundle bundle);创建Activity
(2)onStart();开启Activity时调用
(3)onResume();在Activity显示时调用
(4)onPause();在某个Activity被覆盖,但是又没有被完全覆盖时调用
(5)onStop();在某个Activity被覆盖时调用
(6)onRestart();在某个Activity被覆盖后又重新显示时调用
(7)onDestroy();最后销毁时调用

如果要架构一个android的应用程式,正确的理解生命周期是必不可少的前提。页面加载时,哪些操作需要在onCreate中执行,哪些需要在onStart中执行,哪些需要在onResume中执行。
这些方法总结后能够有几个规律:

(1)onCreate()-->onStart()-->onResume()为开始显示Activity的过程
(2)onResume()-->onPause()为此Activity不在最前面,但是还是可见的过程
(3)onResume()-->onPause()-->onStop()为Activity被覆盖的过程
(4)onPause()-->onResume()为Activity从原本可见但不是最前面到重新到最前面的过程
(5)onStop()-->onRestart()-->onStart()-->onResume()为Activity从不可见到显示在最前面的过程


二、非生命周期但重要的方法
当应用遇到意外情况(如内存不足,用户直接按home键等)需要保存一些临时数据,比如你填写EditText写到一半,你按错键了,按成home键,则如果默认情况,会丢失全部的输入信息,但是这样对用户来说就会有损失,因此我们需要下面两个方法:

1.onSaveInstanceState(Bundle bundle);  意外情况下保存数据

当意外发生时保存数据调用,由运行状态进入暂停状态或停止状态调用,屏幕旋转时调用

2.onRestoreInstanceState(Bundle bundle); 恢复数据

我们要做到保留EditText输入的信息,因此代码为:

package com.xiazdong.activity.life;

import android.app.Activity;
import android.os.Bundle;
import android.widget.EditText;

public class MainActivity extends Activity {
    private EditText editText ;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        editText = (EditText)this.findViewById(R.id.editText);
    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        String name = savedInstanceState.getString("name");    //恢复EditText的数据
        editText.setText(name);
        super.onRestoreInstanceState(savedInstanceState);
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {    //保存EditText的数据
        outState.putString("name", editText.getText()+"");
        super.onSaveInstanceState(outState);
    }
    
}


三、其他一些设置

<activity android:theme="@android:style/Theme.Dialog"/>可以将Activity设置成窗口模式;

posted @ 2012-08-22 10:41  日光之下无新事  阅读(739)  评论(0编辑  收藏  举报