Activity在运行时会受到一些突然事件的影响,例如:你正使用一个Activity濡染来了一个电话,这时的应用就要具备处理这些突发事件的能力,
要处理这些突发事件,需要用到Activity的生命周期。
一个完整的生命周期中包括7个生命周期函数,放在task中,以栈形式存放,只显示最顶层的Activity,视情况需要,是否要执行finish方法,以便
跳过该Activity当第二个Activity将第一个Activity完全遮挡住,会调用被遮挡的Activity的onStop()方法,如果没有完全遮挡,则不会调用
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():释放所有系统资源
Activity的完整生命周期自第一次调用onCreate()开始,直至调用onDestroy()为止
Activity的可视生命周期自onStart()调用开始直到相应的onStop()调用(Activity不再可见)结束
Activity的前台生命周期自onResume()调用起,至相应的onPause()调用(不在前台)为止。
这两个方法并不是生命周期的方法,它们不同于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"
在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>
<?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>
<?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>
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);
}
}
}
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àonCreate、onStart和onResume方法
2、由First跳到Second时:
First—>onPause,SecondàonCreate、onStart、onResume, FirstàonStop
3、由Second跳回到First:
Second—>onPause,First-->onCreate、onStart、onResume, Second-->onStop
4、由Second按返回键回到First:
Second—>onPause,First—>onRestart、onStart、onResume, Second--> onStop,onDestory