随时随地阅读更多技术实战干货,获取项目源码、学习资料,请关注源代码社区公众号(ydmsq666)
本文中先给出一个简单程序,实现两个页面之间相互跳转,分别打印出它们生命周期过程中的状态变化,然后在后面详解Activity生命周期。
第一个Activity:
package com.lovo.activity;
import com.lovo.R;
import android.app.Activity;
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;
/**
* 测试Activity的生命周期
*
* @author guyun
*
*/
public class LifeCycleActivity extends Activity {
/**
* 第一次启动时调用,可以进行组件的初始化
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.move_main);
Log.i("LifeCycleActivity.onCreate", "进入onCreate");
Button btn = (Button) findViewById(R.id.move_main_btn_start);
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(LifeCycleActivity.this,
SecondActivity.class);
startActivity(intent);
}
});
}
/**
* 程序启动时调用
*/
@Override
protected void onStart() {
super.onStart();
Log.i("LifeCycleActivity.onStart", "进入onStart");
}
/**
* 当Activity被恢复时调用,可以进行状态的恢复
*/
@Override
protected void onResume() {
super.onResume();
Log.i("LifeCycleActivity.onResume", "进入onResume");
}
/**
* 当程序被其他程序打断时调用,可以保存相应状态
*/
@Override
protected void onPause() {
super.onPause();
Log.i("LifeCycleActivity.onPause", "进入onPause");
}
/**
* 启动另一个Activity,执行于onPause之后,并且当前Activity完全被遮住时调用
*/
@Override
protected void onStop() {
super.onStop();
Log.i("LifeCycleActivity.onStop", "进入onStop");
}
/**
* 当程序中断结束后,可以重启程序
*/
@Override
protected void onRestart() {
super.onRestart();
Log.i("LifeCycleActivity.onRestart", "进入onRestart");
}
/**
* 当Activity销毁时调用,可以进行清理操作
*/
@Override
protected void onDestroy() {
super.onDestroy();
Log.i("LifeCycleActivity.onDestroy", "进入onDestroy");
}
}
第二个Activity:
package com.lovo.activity;
import android.app.Activity;
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;
import com.lovo.R;
public class SecondActivity extends Activity {
/**
* 第一次启动时调用,可以进行组件的初始化
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.second_main);
Log.i("SecondActivity.onCreate", "进入onCreate");
Button btn = (Button) findViewById(R.id.second_main_btn_back);
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(SecondActivity.this,
LifeCycleActivity.class);
startActivity(intent);
// finish();
}
});
}
/**
* 程序启动时调用
*/
@Override
protected void onStart() {
super.onStart();
Log.i("SecondActivity.onStart", "进入onStart");
}
/**
* 当Activity被恢复时调用,可以进行状态的恢复
*/
@Override
protected void onResume() {
super.onResume();
Log.i("SecondActivity.onResume", "进入onResume");
}
/**
* 当程序被其他程序打断时调用,可以保存相应状态
*/
@Override
protected void onPause() {
super.onPause();
Log.i("SecondActivity.onPause", "进入onPause");
}
/**
* 启动另一个Activity,执行于onPause之后,并且当前Activity完全被遮住时调用
*/
@Override
protected void onStop() {
super.onStop();
Log.i("SecondActivity.onStop", "进入onStop");
}
/**
* 当程序中断结束后,可以重启程序
*/
@Override
protected void onRestart() {
super.onRestart();
Log.i("SecondActivity.onRestart", "进入onRestart");
}
/**
* 当Activity销毁时调用,可以进行清理操作
*/
@Override
protected void onDestroy() {
super.onDestroy();
Log.i("SecondActivity.onDestroy", "进入onDestroy");
}
}
两个Activity的布局界面非常简单,本文不再给出。
打印的日志:
一、都是全屏覆盖时:
启动FirstActivity时,打印
FirstActivity ---> 进入onCreate
FirstActivity --->进入onStart
FirstActivity --->进入onResume
从FirstActivity跳到SecondActivity时,打印
FirstActivity --->进入onPause
SecondActivity--->进入onCreate
SecondActivity--->进入onStart
SecondActivity--->进入onResume
FirstActivity --->进入onStop
从SecondActivity返回到FirstActivity时,打印
①若采用new Intent():
SecondActivity--->进入onPause
FirstActivity --->进入onCreate
FirstActivity --->进入onStart
FirstActivity --->进入onResume
SecondActivity--->进入onStop
②若采用finish()结束当前Activity,上一个Activity会自动出现在栈顶,打印
SecondActivity--->进入onPause
FirstActivity--->进入onRestart
FirstActivity --->进入onStart
FirstActivity --->进入onResume
SecondActivity--->进入onStop
SecondActivity--->进入onDestroy
二、现在给AndroidMainfest.xml中的SeconedActivity属性加入android:theme="@android:style/Theme.Dialog",则SeconedActivity将以对话框形式出现,不会对FirstActivity形成遮盖.
这时从FirstActivity 跳转到SecondActivity的状态变化为:
FirstActivity ---> 进入onCreate
FirstActivity --->进入onStart
FirstActivity --->进入onResume
FirstActivity--->进入onPause
SecondActivity--->进入onCreate
SecondActivity--->进入onStart
SecondActivity--->进入onResume
这时区别在于FirstActivity比完全遮盖时少调用了onStop方法.
然后从SecondActivity返回到FirstActivity 时:
①采用new Intent 方式,打印
SecondActivity--->进入onPause
FirstActivity --->进入onStop
FirstActivity ---> 进入onCreate
FirstActivity --->进入onStart
FirstActivity --->进入onResume
SecondActivity--->进入onStop
②采用finish 方式,打印
SecondActivity--->进入onPause
FirstActivity --->进入onResume
SecondActivity--->进入onStop
SecondActivity--->进入onDestroy
总结几点:
1.onPause 用于由一个Activity转到另一个Activity、设备进入休眠状态(屏幕锁住了)、或者有dialog弹出时。
2.onStop 用于不可见的Activity,即当前的Activity完全被遮住,所以,请注意:有对话框弹出时,这时底下的activity仍然可见,所以此时onStop不会被调用。
故,本文在清单文件中声明SecondActivity以对话框形式显示时,不会对第一个Activity完全覆盖,所以第一个Activity只会执行onPause,而不会执行onStop,锁屏也是一样的效果。
3.调用finish方法是kill掉当前Activity,在执行onStop后,会执行onDestroy,并且这时返回到的第一个Activity不是new出来的,所以不会再调用onCreate。
4.若当前Activity暂停时只执行了onPause,那么暂停结束后,只需执行onResume,比如下列两种情况:
①当前FirstActivity 跳转出现一个对话框形式的SecondActivity,而SecondActivity自己直接finish即摧毁时
②屏幕锁屏时,然后又打开时