Activity生命周期详解

标签: activity 生命周期 | 发表时间:2015-12-27 11:14 | 作者:crazyZHZ
出处:http://www.iteye.com

本文概述:针对一个例子详细阐述Activity的生命周期。

 

1.返回栈

Android是使用任务(Task)来管理活动的,一个任务就是一组存放在栈里的Activity的集合,这个栈也叫返回栈(Back Stack)。每次我们启动一个新的Activity,这个Activity就会入栈,并处于栈顶位置。按下返回键或者finish()方法销毁一个Activity时,处于栈顶的Activity就会出栈,另一个Activity就会处于栈顶位置,显示给用户的就会是这个Activity.



 

2.活动状态

运行状态:该Activity处于栈顶,可见

暂停状态:不处于栈顶,但仍可见

停止状态:不处于栈顶,且不可见

销毁状态:从返回栈中被移除

 

3.Activity的生命周期

onCreate()方法:完成Activity的初始化,如加载布局,绑定事件。

onStart()方法:Activity由不可见变为可见

onResume():这个方法在Activity准备和用户交互的时候调用

onPause()方法:准备去启动一个新的Activity的时候调用

onStop()方法:这个方法在Activity完全不可见的时候调用

onDestroy()方法:这个方法在Activity销毁之前调用,之后Activity的状态将变为销毁

onRestart()方法:这个方法在停止状态变为运行状态之前调用

 

4.Activity的生存期

完整生存期:onCreate()-->onStart()-->onResume()-->onPause()-->onStop-->onDestroy()

可见生存期:onStart-->onResume()-->onPause()-->onStop()

前台生存期:onResume()-->onPause(),该状态下Activity处于运行状态

 

5.体验Activity的生命周期

在这里有三个Activity,MainActivity、NormalActivity和DialogActivity,其中DialogActivity是一个弹出框样式的Activity,就是为了演示MainActivity在可见但是不处于栈顶的情况。

MainActivity的布局文件,很简单只有两个跳转按钮

 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity" >

    <Button 
        android:id="@+id/btn_normal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="normal_activity"/>

    <Button
        android:id="@+id/btn_dialog"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="dialog_activity"/>
</LinearLayout>

 NormalActivity的布局文件,也很简单

 

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="这是一个normal_activity" />

</RelativeLayout>

 DialogActivity的布局文件,注意在清单文件中注册这个Activity的时候要声明它的主题是弹出框主题,否则难以看到实验效果

<activity 
            android:name="com.example.activitylifecycle.NormalActivity">
        </activity>
        
        <activity 
            android:name="com.example.activitylifecycle.DialogActivity"
            android:theme="@android:style/Theme.Dialog">
        </activity>

 

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="这是一个dialog_activity" />

</RelativeLayout>

 MainActivity的代码如下,给按钮添加了两个跳转操作

 

package com.example.activitylifecycle;

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;

public class MainActivity extends Activity {
	public static final String TAG="MainActivity";
	Button btn_normal,btn_dialog;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		Log.d(TAG,"onCreate");
		
		btn_normal=(Button) findViewById(R.id.btn_normal);
		btn_dialog=(Button) findViewById(R.id.btn_dialog);
		
		btn_normal.setOnClickListener(new MyListener());
		btn_dialog.setOnClickListener(new MyListener());
	}
	
	@Override
	protected void onStart() {
		// TODO Auto-generated method stub
		super.onStart();
		Log.d(TAG,"onStart");
	}
	
	@Override
	protected void onResume() {
		// TODO Auto-generated method stub
		super.onResume();
		Log.d(TAG,"onResume");
	}
	
	@Override
	protected void onPause() {
		// TODO Auto-generated method stub
		super.onPause();
		Log.d(TAG,"onPause");
	}
	
	@Override
	protected void onStop() {
		// TODO Auto-generated method stub
		super.onStop();
		Log.d(TAG,"onStop");
	}
	
	@Override
	protected void onDestroy() {
		// TODO Auto-generated method stub
		super.onDestroy();
		Log.d(TAG,"onDestroy");
	}
	
	@Override
	protected void onRestart() {
		// TODO Auto-generated method stub
		super.onRestart();
		Log.d(TAG,"onRestart");
	}
	
	
	class MyListener implements OnClickListener{

		@Override
		public void onClick(View v) {
			switch (v.getId()) {
			case R.id.btn_normal:
				Intent intent=new Intent();
				intent.setClass(MainActivity.this, NormalActivity.class);
				startActivity(intent);
				break;
			case R.id.btn_dialog:
				Intent intent2=new Intent();
				intent2.setClass(MainActivity.this, DialogActivity.class);
				startActivity(intent2);
				break;
			}
		}
     }
	
	
}

 NormalActivity

 

package com.example.activitylifecycle;

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

public class NormalActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.normal_activity);
		
	}
	
}

 DialogActivity

 

package com.example.activitylifecycle;

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

public class DialogActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.dialog_activity);
		
	}
	
	
	
	
}

 下面开始演示程序:

首先部署应用到模拟器,呈现在我们面前的是MainActivity,调用了三个方法:onCreate()、onStart()、onResume()



 

点击按钮跳转到NormalActivity,调用了onPause()、onStop()



 

 

点击返回,MainActivity从新变为可见,调用了onRestart()、onStart()、onPause()



 

点击按钮跳转到DialogActivity,调用了onPause方法,可以看到和上面的区别,并没有调用onStop方法,因为此时MainActivity仍然可见



 

点击返回,调用的是onResume()



 

点击返回,退出程序,调用onPause()、onStop()、ondestroy()

 

 总结:如下是Activity生命周期的完整示意图,和上面的实验结果完全一致

 

 

 

 

 





已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [activity 生命周期] 推荐:

Activity生命周期详解

- - 编程语言 - ITeye博客
本文概述:针对一个例子详细阐述Activity的生命周期. Android是使用任务(Task)来管理活动的,一个任务就是一组存放在栈里的Activity的集合,这个栈也叫返回栈(Back Stack). 每次我们启动一个新的Activity,这个Activity就会入栈,并处于栈顶位置. 按下返回键或者finish()方法销毁一个Activity时,处于栈顶的Activity就会出栈,另一个Activity就会处于栈顶位置,显示给用户的就会是这个Activity..

Activity的生命周期方法

- - 移动开发 - ITeye博客
一:Activity的生命周期方法.  Android提供了很多Activity的生命周期方法,比如我们常用的onCreate、onPause、onResume等. 这里主要介绍粗粒度的周期方法,诸如onPostCreate、onPostResume等. 这些细粒度的周期方法可以参考Android的API文档,在你需要更细层次的控制的时候可以使用这些细粒度的方法.

Activity生命周期异常分析

- - 移动开发 - ITeye博客
Activity 生命周期异常分析 . 我们知道正常情况下Activity创建的时候会执行 onCreate onStart onResume 方法;当锁屏情况下Activity会执行 onPause onStop方法;当屏幕再次显示的时候会执行onReStart onStart onResume方法.

Android开发教程 --- 葵花宝典第二层 Activity生命周期

- fastzhong - 博客园-首页原创精华区
   今天我准备花一节课来讲讲Activity的生命周期,这个概念还是比较重要的,相信大家看书或者资料都会提及它,可想而知. 希望大家能看了我的博客后能搞明白生命周期的概念以及在以后的代码编写中,代码往哪里去写.  有的女人就是Windows虽然很优秀,但是安全隐患太大.  有的女人就是MFC她条件很好,然而不是谁都能玩的起.

Spring bean生命周期

- - 开源软件 - ITeye博客
Spring bean生命周期.       在传统的Java应用中,Bean的生命周期非常简单.  Java的关键词new用来实例化Bean(或许他是非序列化的).  相反,Bean的生命周期在Spring容器中更加细致.  理解Spring Bean的生命周期非常重要,因为你或许要利用Spring提供的机会来订制Bean的创建过程.

敏捷应用生命周期管理

- - 博客 - 伯乐在线
Agile ALM使用敏捷的价值观和策略来充实了ALM,ALM的敏捷做法提升了产品的质量,缩短了上市时间,且有利于开发者以一种更加愉悦的心情来工作. 我对Agile ALM的定义可归结为,一些灵活的、对改变持开发态度的、高质量的过程和工具链. 敏捷应用生命周期管理(Agile Application Lifecycle Management,Agile ALM)正得到越来越大的推动,记得我在撰写“Agile ALM”一书的书稿时,几乎没有人会想到使用敏捷来丰富ALM的做法,或是找出一种有实效的ALM做法,越来越多的工具厂商发现,他们的工具在贴上敏捷工具甚至是敏捷ALM工具的标签之后好卖多了.

spring中Bean的生命周期总结

- - CSDN博客推荐文章
spring中在ApplicationContext或在BeanFactory中Bean的生命周期总结.  Spring中Bean的生命周期,在学习spring的过程中bean的生命周期理解对学习spring有很大的帮助,下面我就分别介绍在ApplicationContext和BeanFactory中Bean的生命周期.

Android Activity与Service通信

- - CSDN博客移动开发推荐文章
一、当Acitivity和Service处于同一个Application和进程时,通过继承Binder类来实现.      当一个Activity绑定到一个Service上时,它负责维护Service实例的引用,允许你对正在运行的Service进行一些方法调用. 比如你后台有一个播放背景音乐的Service,这时就可以用这种方式来进行通信.

使用intent来启动activity

- - CSDN博客推荐文章
Intent最常见的用途是绑定应用程序组件,并在应用程序之间通信.Intent用来启动Activity,允许创建不同屏幕的一个工作流. 要创建并显示一个Activity,可以调用startActivity,并传递给它一个Intent,如:. 可以构造Intent来显示地指定要打开的Activity类,或者包含一个目标Activity必须执行的动作.

从网页启动Activity

- - 移动开发 - ITeye博客
正好Android SDK 给我们提供了解决方案,在网页中点击某个链接时,会匹配到Activity所配置的隐式Intent(配置在Manifest文件中). 第一步:在Manifest文件中给TestActivity配置一个隐式Intent. 第二步:这时,当在网页中点击链接Start TestActivity就会启动TestActivity了.