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>
|
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()