有助于对android的Activity生命周期的理解的例子

Activity生命周期

1、  创建LifeCycleActivity,然后操作返回键和home键解释状态转换

2、  建立SecondActivity,两个activity切换

3、  建立对话框风格的activity,演示onPause和onResume()的调用

在清单文件中设置activity如下

<activity

android:name=".DialogActivity"

android:theme="@android:style/Theme.Dialog"

/>

 

 

在layout文件夹下的三个文件代码如下:

  main.xml:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="fill_parent"

    android:layout_height="fill_parent"

    android:orientation="vertical" >

 

    <TextView

        android:layout_width="fill_parent"

        android:layout_height="wrap_content"

        android:text="@string/hello" />

 

    <Button

        android:id="@+id/goBtn"

        android:layout_width="fill_parent"

        android:layout_height="wrap_content"

        android:text="goToSecond" />

     <Button

        android:id="@+id/showMyDialog"

        android:layout_width="fill_parent"

        android:layout_height="wrap_content"

        android:text="show My sDialog" />

     <Button

        android:id="@+id/showAlertDialog"

        android:layout_width="fill_parent"

        android:layout_height="wrap_content"

        android:text="show a real Dialog" />

   

</LinearLayout>

second.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:orientation="vertical" >

 

    <Button

        android:id="@+id/backBtn"

        android:layout_width="fill_parent"

        android:layout_height="wrap_content"

        android:text="返回" />

 

</LinearLayout>

dialog_activity.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:orientation="vertical" >

 

    <TextView

        android:id="@+id/textView1"

        android:layout_width="fill_parent"

        android:layout_height="wrap_content"

        android:text="我是对话框,其实我是Activity" />

 

</LinearLayout>

 

 

 

LifeCycleActivity代码如下

package cn.class3g.activity;

 

import android.app.Activity;

import android.app.AlertDialog;

import android.app.AlertDialog.Builder;

import android.content.DialogInterface;

import android.content.Intent;

import android.os.Bundle;

import android.util.Log;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

 

public class LifeCycleActivity extends Activity {

   

       private static final String TAG = "lifeCycle";

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

       

        Log.i(TAG,"onCreate");

       

           Button goBtn = (Button) this.findViewById(R.id.goBtn);

          

           goBtn.setOnClickListener(new OnClickListener() {

                    

                     public void onClick(View v) {

                            Intent intent = new Intent(LifeCycleActivity.this, SecondActivity.class);

                            startActivity(intent);

                     }

              });

          

           Button showMyDialogBtn = (Button) findViewById(R.id.showMyDialog);

           showMyDialogBtn.setOnClickListener(new OnClickListener() {

                    

                     public void onClick(View v) {

                        Intent intent = new Intent(LifeCycleActivity.this,DialogActivity.class);     

                      startActivity(intent);

                     }

              });

          

           Button showAlertDialogBtn = (Button) findViewById(R.id.showAlertDialog);

           showAlertDialogBtn.setOnClickListener(new OnClickListener() {

                    

                     public void onClick(View v) {

                            showAlertDialog();

                     }

              });

    }

  

       public void showAlertDialog(){

              AlertDialog.Builder builder = new Builder(LifeCycleActivity.this);

              builder.setMessage("确定退出吗?");

             

              builder.setTitle("提示");

             

              builder.setPositiveButton("确定 ", new android.content.DialogInterface.OnClickListener() {

                    

                     public void onClick(DialogInterface dialog, int which) {

                            dialog.dismiss();

                            LifeCycleActivity.this.finish();

                     }

              });

              builder.setNegativeButton("取消", new android.content.DialogInterface.OnClickListener() {

                    

                     public void onClick(DialogInterface dialog, int which) {

                         dialog.dismiss();

                     }

              });

              //创建并显示

              builder.create().show();

       }

       protected void onStart() {

              super.onStart();

        Log.i(TAG,"onStart");

       }

       protected void onResume() {

              super.onResume();

                 Log.i(TAG,"onResume");

       }

       protected void onPause() {

              super.onPause();

                 Log.i(TAG,"onPause");

       }

       protected void onStop() {

              super.onStop();

                 Log.i(TAG,"onStop");

       }

       protected void onDestroy() {

              super.onDestroy();

                 Log.i(TAG,"onDestroy");

       }

       protected void onRestart() {

              super.onRestart();

                 Log.i(TAG,"onRestart");

       }

 

      

}

 

SecondActivity代码如下:

package cn.class3g.activity;

 

import android.app.Activity;

import android.content.Intent;

import android.os.Bundle;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

 

public class SecondActivity extends Activity {

    public void onCreate(Bundle savedInstanceState){

           super.onCreate(savedInstanceState);

           setContentView(R.layout.second);

          

           Button backBtn = (Button) this.findViewById(R.id.backBtn);

          

           backBtn.setOnClickListener(new OnClickListener() {

                    

                     public void onClick(View v) {

                            Intent intent = new Intent(SecondActivity.this,LifeCycleActivity.class);

                            startActivity(intent);

                     }

              });

    }

}

 

DialogActivity代码如下

 

 

package cn.class3g.activity;

 

import android.app.Activity;

import android.os.Bundle;

 

public class DialogActivity extends Activity {

 

    public void onCreate(Bundle savedInstanceState){

       super.onCreate(savedInstanceState);

       setContentView(R.layout.dialog_activity);

    }

}

 

 

1)、

1、运行activity

     onCreate -- onStart -- onReaume

2、点击返回键

      onPause -- onStop -- onDestory

 

-----------------

1、运行

2、点击Home

   onPause--onStop

3、在桌面,长按Home重新回到ActivityLifeCycle

   onRestart -- onStart -- onResume

 

---------------------

1、运行

2、切换至SecondActivity之上

     onPause -- onStop

3、切换回AcitivityLifeCycle

      onCreate -- onStart -- onResume

4、点击返回键时

       onRestart -- onStart -- onResume

 -----------------------

 创建一个对话框样式的activity:DialogActivity

 1、运行

 2、切换至DoalogActivity

  onPause

 3、按返回键返回至ActivityLifeCycle

  onResume

--------------------

创建AlertDialog对话框

显示对话框并返回,发现此时并不能触发ActivityLifeCycle

实例的状态变化,其生命周期中任何函数

 

 

onSaveInstanceState和onRestoreInstanceState触发的时机

先看Application Fundamentals上的一段话:

 

 Android calls onSaveInstanceState() before theactivity becomes vulnerable to being destroyed by the system, but does notbother calling it when the instance is actually being destroyed by a useraction (such as pressing the BACK key)

 

从这句话可以知道,当某个activity变得“容易”被系统销毁时,该activity的onSaveInstanceState就会被执行,除非该activity是被用户主动销毁的,例如当用户按BACK键的时候。

注意上面的双引号,何为“容易”?言下之意就是该activity还没有被销毁,而仅仅是一种可能性。这种可能性有哪些?通过重写一个activity的所有生命周期的onXXX方法,包括onSaveInstanceState和onRestoreInstanceState方法,我们可以清楚地知道当某个activity(假定为activity A)显示在当前task的最上层时,其onSaveInstanceState方法会在什么时候被执行,有这么几种情况:

 

1、当用户按下HOME键时。

这是显而易见的,系统不知道你按下HOME后要运行多少其他的程序,自然也不知道activity A是否会被销毁,故系统会调用onSaveInstanceState,让用户有机会保存某些非永久性的数据。以下几种情况的分析都遵循该原则

2、长按HOME键,选择运行其他的程序时。

3、按下电源按键(关闭屏幕显示)时。

4、从activity A中启动一个新的activity时。

5、屏幕方向切换时,例如从竖屏切换到横屏时。

 

在屏幕切换之前,系统会销毁activity A,在屏幕切换之后系统又会自动地创建activity A,所以onSaveInstanceState一定会被执行

   总而言之,onSaveInstanceState的调用遵循一个重要原则,即当系统“未经你许可”时销毁了你的activity,则onSaveInstanceState会被系统调用,这是系统的责任,因为它必须要提供一个机会让你保存你的数据(当然你不保存那就随便你了)。

    至于onRestoreInstanceState方法,需要注意的是,onSaveInstanceState方法和onRestoreInstanceState方法“不一定”是成对的被调用的,(本人注:我昨晚调试时就发现原来不一定成对被调用的!)

 

onRestoreInstanceState被调用的前提是,activity A“确实”被系统销毁了,而如果仅仅是停留在有这种可能性的情况下,则该方法不会被调用,例如,当正在显示activity A的时候,用户按下HOME键回到主界面,然后用户紧接着又返回到activity A,这种情况下activity A一般不会因为内存的原因被系统销毁,故activity A的onRestoreInstanceState方法不会被执行

另外,onRestoreInstanceState的bundle参数也会传递到onCreate方法中,你也可以选择在onCreate方法中做数据还原。

 

至于这两个函数的使用,给出示范代码(留意自定义代码在调用super的前或后):

@Override
public void onSaveInstanceState(BundlesavedInstanceState) {
        savedInstanceState.putBoolean("MyBoolean", true);
        savedInstanceState.putDouble("myDouble", 1.9);
        savedInstanceState.putInt("MyInt", 1);
        savedInstanceState.putString("MyString", "Welcome back to Android");
        // etc.
        super.onSaveInstanceState(savedInstanceState);
}

@Override
public void onRestoreInstanceState(BundlesavedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);

        booleanmyBoolean = savedInstanceState.getBoolean("MyBoolean");
        doublemyDouble = savedInstanceState.getDouble("myDouble");
        intmyInt = savedInstanceState.getInt("MyInt");
        String myString =savedInstanceState.getString("MyString");
}

 

-------------------------

1、运行程序

2、按Home

onSaveInstanceState —— onPause ——OnStop   

3、在桌面,长按Home重新回到ActivityLifeCyde

onRestart —— onStart —— onResume

注意:此时并没用触发onRestoreInstanceState()

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值