marsAndroid--Activity的生命周期

一、Activity生命周期

Activity在运行时会受到一些突然事件的影响,例如:你正使用一个Activity濡染来了一个电话,这时的应用就要具备处理这些突发事件的能力,

要处理这些突发事件,需要用到Activity的生命周期。


一个完整的生命周期中包括7个生命周期函数,放在task中,以栈形式存放,只显示最顶层的Activity,视情况需要,是否要执行finish方法,以便

跳过该Activity当第二个Activity将第一个Activity完全遮挡住,会调用被遮挡的Activity的onStop()方法,如果没有完全遮挡,则不会调用

生命周期流程图



二、Activity的四种状态:

1.激活、运行状态

处于屏幕前台,则该activity位于当前任务栈的顶部,处于激活或者运行的状态,它就是响应用户的activity

2.暂停状态

当一个activity失去了焦点,但是仍然可见,(一个新的activity并没有完全覆盖屏幕,或者透明的activity集中在顶部)则处于暂停状态,处于暂停状态的activity是完全处于存活状态的(它保留着所有的状态和成员信息并保持和窗口管理器的连接),如果系统处于内存不足时会杀死这个Activity

3.停止状态:

当一个activity完全被另外一个activity所覆盖,它就处于停止状态,但是它仍然保留着所有的状态和成员信息,然而,由于它是不可见的,所以当其他地方需要内存的时候,经常会被系统杀死

4.暂停或者停止状态

当一个activity处于暂停或停止,该系统可以把活动从内存中移除或者要求它完成,或直接杀死它的进程。当它再次显示给用户,它必须完全重新启动和恢复到以前的状态。

 

三、生命周期方法的调用时期

onCreate():当Activity第一次被创建的时候调用,在这里进行一些初始化动作。

onRestart():当Activity被停止后再次调用的时候

onStart():当Activity可见的时候

onResume():当Activity能够和用户交互的时候被调用(在前台时),这时该Activity位于Activity栈的顶部

onPause():当前Activity被暂停时调用,这里可以做一些数据保存的工作,当它变成不可见时调用onStop方法

onStop():当一个Activity不再可见或者一个新的Activity开启的时候或者被销毁的时候调用。

onDestroy():释放所有系统资源

 

四、生命周期的划分:

完整的生命周期:由onCreate到onDestroy

Activity的完整生命周期自第一次调用onCreate()开始,直至调用onDestroy()为止

 

可视生命周期:由onStart到onStop

Activity的可视生命周期自onStart()调用开始直到相应的onStop()调用(Activity不再可见)结束

 

前台生命周期:由onResume到onPause

Activity的前台生命周期自onResume()调用起,至相应的onPause()调用(不在前台)为止。

 

五、Activity的onSaveInstanceState()和onRestoreInstanceState()


这两个方法并不是生命周期的方法,它们不同于onCreate、onPause等生命周期方法,它们不一定会被触发。当应用遇到意外情况(如:内存不足。用户直接按Home键)由系统销毁一个Activity时,onSaveInstanceState()会被调用。另外Activity由运行状态进入暂停状态或停止状态也会调用该方法。但是当用户主动去销毁一个Activity时,例如在应用中按返回键,onSaveInstanceState()就不会被调用,因为在这种情况下,用户的行为军定了不需要保存Activity的状态。通常onSaveInstanceState()只适合用于保存一些临时性的状态,而onPause是和用于数据的持久化保存。


另外,当屏幕的方向发生了改变,Activity会被摧毁并被重新创建,如果你想在Activity被摧毁前缓存一些数据,并且在Activity被重新创建后恢复缓存的数据,可以重写Activity的onSaveInstanceState()和onRestoreInstanceState()方法


六、横竖屏幕切换

默认情况下,当“屏幕方向”或“键盘显示隐藏”变化时都会销毁当前Activity,创建新的Activity,如果不希望重新创建Activity,可以按如下配置Activity:

<activity android:name = ".MainActivity" android:configChanges="keyboardHidden|orientation">

上面的android.configChanges属性指定了要捕获”屏幕方向“和”键盘显示隐藏”变化,当捕获到这些变化后会调用Activity的onConfigurationChanged()方法。


默认情况下(没有配置android.configChanges属性

 竖屏切横屏,销毁当前Activity之后,创建一个新的Activity实例。

 横屏切竖屏,销毁当前Activity之后,创建一个新的Activity实例,新的Activity实例很快就被销毁,接着又会创建一个新的Activity,如果只希望创建一个实例,

 可以配置android:configChanges="orientation"


六、应用的相应性(Responsive)


在Android中,应用的相应性被活动管理器(Activity Manager)和窗口管理器(Widow Manager)这两个系统服务所监视。

当用户触发了输入时间(如键盘输入,点击按钮等),如果应用5秒内没有响应用户的输入事件,那么,Android会认为该应用无响应,

便弹出ANR(Application No Response)对话框。


在正常情况下,Android程序会在一个单线程里运行,如果Activity要处理一件比较耗时的工作,应该交给子线程完成,否则会因为主线程被阻塞,后面的用户输入

时间因没有能在5秒内响应,导致应用出现ANR对话框。


七、示例


Androidmainfest.xml

<activity android:name=".SecondActivity" android:label="@string/secondActivityLabel"></activity>


main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView  
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="@string/hello"
    />
<Button
	android:id="@+id/myButton"
	android:layout_width="fill_parent"
	android:layout_height="wrap_content"
	android:text=""/>
</LinearLayout>


second.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<Button
	android:id="@+id/secondButton"
	android:layout_width="fill_parent"
	android:layout_height="wrap_content"
	android:text=""/>
</LinearLayout>

FirstActivity.java

package cn.example.activity04;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class FirstActivity extends Activity {
    /** Called when the activity is first created. */
	private Button myButton;
    @Override
    public void onCreate(Bundle savedInstanceState) {
    	System.out.println("FirstAcvity ---> onCreate");
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        myButton = (Button)findViewById(R.id.myButton);
        myButton.setText("启动第二个Activity");
        myButton.setOnClickListener(new ButtonOnClickListener());
    }

	@Override
	protected void onDestroy() {
		// TODO Auto-generated method stub
    	System.out.println("FirstAcvity --->onDestory");
		super.onDestroy();
	}

	@Override
	protected void onPause() {
		// TODO Auto-generated method stub
    	System.out.println("FirstAcvity --->onPause");
		super.onPause();
	}

	@Override
	protected void onRestart() {
		// TODO Auto-generated method stub
    	System.out.println("FirstAcvity --->onRestart");
		super.onRestart();
	}

	@Override
	protected void onResume() {
		// TODO Auto-generated method stub
    	System.out.println("FirstAcvity --->onResume");
		super.onResume();
	}

	@Override
	protected void onStart() {
		// TODO Auto-generated method stub
    	System.out.println("FirstAcvity --->onStart");
		super.onStart();
	}

	@Override
	protected void onStop() {
		// TODO Auto-generated method stub
    	System.out.println("FirstAcvity --->onStop");
		super.onStop();
	}
	
	class ButtonOnClickListener implements OnClickListener{

		//@Override
		public void onClick(View v) {
			Intent intent = new Intent();
			intent.setClass(FirstActivity.this,SecondActivity.class);
			FirstActivity.this.startActivity(intent);
		}
		
	}
	
}


SecondActivity.java
package cn.example.activity04;

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;
import android.widget.Gallery;

public class SecondActivity extends Activity {

	private Button secondButton;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		
		// TODO Auto-generated method stub
		System.out.println("SecondActivity--->onCreate");
		super.onCreate(savedInstanceState);
		setContentView(R.layout.second);
		secondButton = (Button)findViewById(R.id.secondButton);
		//Gallery g = (Gallery)findViewById(R.id.secondButton);
		secondButton.setOnClickListener(new ButtonOnClickListener());
		
	}

	@Override
	protected void onDestroy() {
		// TODO Auto-generated method stub
		System.out.println("SecondActivity--->onDestory");
		super.onDestroy();
	}

	@Override
	protected void onPause() {
		// TODO Auto-generated method stub
		System.out.println("SecondActivity--->onPause");
		super.onPause();
	}

	@Override
	protected void onRestart() {
		// TODO Auto-generated method stub
		System.out.println("SecondActivity--->onRestart");
		super.onRestart();
	}

	@Override
	protected void onResume() {
		// TODO Auto-generated method stub
		System.out.println("SecondActivity--->onResume");
		super.onResume();
	}

	@Override
	protected void onStart() {
		// TODO Auto-generated method stub
		System.out.println("SecondActivity--->onStart");
		super.onStart();
	}

	@Override
	protected void onStop() {
		// TODO Auto-generated method stub
		System.out.println("SecondActivity--->onStop");
		super.onStop();
	}
	class ButtonOnClickListener implements OnClickListener{

		//@Override
		public void onClick(View v) {
			Intent intent = new Intent();
			intent.setClass(SecondActivity.this,FirstActivity.class);
			SecondActivity.this.startActivity(intent);
		}
		
	}
}

程序执行结果


1、程序启动的时:

FirstàonCreateonStartonResume方法

2、由First跳到Second时:

First—>onPauseSecondàonCreateonStartonResume, FirstàonStop

3、由Second跳回到First

Second—>onPauseFirst-->onCreate、onStart、onResume, Second-->onStop

4、由Second按返回键回到First

Second—>onPauseFirst—>onRestart、onStart、onResume, Second--> onStop,onDestory


转载于:https://www.cnblogs.com/xushuai123/archive/2012/11/05/2978056.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值