marsAndroid--Activity的生命周期

来源:互联网 发布:学网络渗透 编辑:程序博客网 时间:2024/05/29 17:38

一、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"    /><Buttonandroid: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"    ><Buttonandroid: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());    }@Overrideprotected void onDestroy() {// TODO Auto-generated method stub    System.out.println("FirstAcvity --->onDestory");super.onDestroy();}@Overrideprotected void onPause() {// TODO Auto-generated method stub    System.out.println("FirstAcvity --->onPause");super.onPause();}@Overrideprotected void onRestart() {// TODO Auto-generated method stub    System.out.println("FirstAcvity --->onRestart");super.onRestart();}@Overrideprotected void onResume() {// TODO Auto-generated method stub    System.out.println("FirstAcvity --->onResume");super.onResume();}@Overrideprotected void onStart() {// TODO Auto-generated method stub    System.out.println("FirstAcvity --->onStart");super.onStart();}@Overrideprotected void onStop() {// TODO Auto-generated method stub    System.out.println("FirstAcvity --->onStop");super.onStop();}class ButtonOnClickListener implements OnClickListener{//@Overridepublic 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;@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubSystem.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());}@Overrideprotected void onDestroy() {// TODO Auto-generated method stubSystem.out.println("SecondActivity--->onDestory");super.onDestroy();}@Overrideprotected void onPause() {// TODO Auto-generated method stubSystem.out.println("SecondActivity--->onPause");super.onPause();}@Overrideprotected void onRestart() {// TODO Auto-generated method stubSystem.out.println("SecondActivity--->onRestart");super.onRestart();}@Overrideprotected void onResume() {// TODO Auto-generated method stubSystem.out.println("SecondActivity--->onResume");super.onResume();}@Overrideprotected void onStart() {// TODO Auto-generated method stubSystem.out.println("SecondActivity--->onStart");super.onStart();}@Overrideprotected void onStop() {// TODO Auto-generated method stubSystem.out.println("SecondActivity--->onStop");super.onStop();}class ButtonOnClickListener implements OnClickListener{//@Overridepublic 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