Android中Activity生命周期详解

随时随地阅读更多技术实战干货,获取项目源码、学习资料,请关注源代码社区公众号(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即摧毁时

②屏幕锁屏时,然后又打开时

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

u010142437

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值