Activity负责UI元素的加载与页面之间的跳转,代表了一个页面单元,每个Activity都有声明周期,在不同的阶段会调用不同的的生命周期方法。Activity的生命周期有如下几个:
上图是一个Activity声明周期方法执行的流程图
- OnCreate() : 我们在创建继承自Activity的类时都会默认生成这个函数,它会在Activity第一次被创建的时候调用,通常会在这个函数中完成Activity的初始化操作,如设置布局,初始化视图,绑定事件等。
- OnStart():这个函数在Activity的OnCreate()之后被调用,此时得Activity还处在不可见状态,他的下一个状态就是Activity变得可见的时候,也就是这个函数在Activity可见之前被调用。
- OnResume():这个函数在Activity变为可见时被调用,执行完OnResume()之后,Activity就会请求AMS渲染他所管理的视图,此时的Activity一定位于栈的顶端,并且处于运行状态。
- OnPause():这个函数在系统准备去启动或者回复另外一个Activity时调用,也就是在Activity即将从可见状态变为不可见时。我们通常会在这个函数中将一些消耗CPU的资源释放掉,以及保存一些相关的数据。
- OnStop():这个函数在Activity完全不可见时调用,他和OnPause()函数的主要区别在于,如果新启动的Activity是一个对话框式的Activity,那么OnPause()函数会得到执行,而OnStop()函数并不会执行
- OnDestroy():这个函数在Activity被销毁之前调用,之后Activity的状态将变为销毁状态。
OnRestart():这个函数在Activity由停止状态重新变为运行状态时调用,也就是Activity被重新启动了。
下面我们来看一下具体的 示例
假设我们有2个Activity
代码如下:
MainActivity.java
package com.simple.myapplication;
import android.content.Intent;
import android.content.res.Configuration;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(MainActivity.this,SecondActivity.class));
}
});
Log.i(TAG, "onCreate: ");
}
@Override
protected void onStart() {
super.onStart();
Log.i(TAG, "onStart: ");
}
@Override
protected void onRestart() {
super.onRestart();
Log.i(TAG, "onRestart: ");
}
@Override
protected void onResume() {
super.onResume();
Log.i(TAG, "onResume: ");
}
@Override
protected void onStop() {
super.onStop();
Log.i(TAG, "onStop: ");
}
@Override
protected void onPause() {
super.onPause();
Log.i(TAG, "onPause: ");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.i(TAG, "onDestroy: ");
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
Log.i(TAG, "onRestoreInstanceState: ");
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
Log.i(TAG, "onSaveInstanceState: ");
}
}
SecondActivity.java
package com.simple.myapplication;
import android.os.Bundle;
import android.os.PersistableBundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
/**
* Created by blueberry on 2016/5/24.
*/
public class SecondActivity extends AppCompatActivity{
private static final String TAG = "SecondActivity";
@Override
public void onCreate(Bundle savedInstanceState, PersistableBundle persistentState) {
super.onCreate(savedInstanceState, persistentState);
Log.i(TAG, "onCreate: ");
}
@Override
protected void onStart() {
super.onStart();
Log.i(TAG, "onStart: ");
}
@Override
protected void onRestart() {
super.onRestart();
Log.i(TAG, "onRestart: ");
}
@Override
protected void onResume() {
super.onResume();
Log.i(TAG, "onResume: ");
}
@Override
protected void onPause() {
super.onPause();
Log.i(TAG, "onPause: ");
}
@Override
protected void onStop() {
super.onStop();
Log.i(TAG, "onStop: ");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.i(TAG, "onDestroy: ");
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
Log.i(TAG, "onSaveInstanceState: ");
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
Log.i(TAG, "onRestoreInstanceState: ");
}
}
其中MainActiviy中有一个按钮点击会跳转到SecondActivity
我们先看一个最为普通的操作流程:我们启动MainActivity然后按back键
结果为:
/com.simple.myapplication I/MainActivity: onCreate:
/com.simple.myapplication I/MainActivity: onStart:
/com.simple.myapplication I/MainActivity: onResume:
按下back键;
/com.simple.myapplication I/MainActivity: onPause:
/com.simple.myapplication I/MainActivity: onStop:
/com.simple.myapplication I/MainActivity: onDestroy:
再来看一个操作流程:我们启动MainActivity然后按Home键结果为:
com.simple.myapplication I/MainActivity: onCreate:
com.simple.myapplication I/MainActivity: onStart:
com.simple.myapplication I/MainActivity: onResume:
按下home键之后:
com.simple.myapplication I/MainActivity: onPause:
com.simple.myapplication I/MainActivity: onSaveInstanceState:
com.simple.myapplication I/MainActivity: onStop:
这里可以看到它执行了onSaveInstanceState,用来保存数据
我们来看一下,怎么在onSaveInstanceState利用bundle保存数据
@Override
protected void onSaveInstanceState(Bundle outState) {
outState.putInt("key",1);
super.onSaveInstanceState(outState);
Log.i(TAG, "onSaveInstanceState: ");
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
int i = savedInstanceState.getInt("key");
super.onRestoreInstanceState(savedInstanceState);
Log.i(TAG, "onRestoreInstanceState: ");
}
这里需要说明onSaveInstanceState的执行时机为:当activivity可能会引系统内存不足销毁时执行。
有一下几种时机:
1、用户按下home键
2、锁屏
3、从Activity A 跳转Activity B
4、屏幕切换
onRestoreInstanceState的调用时机则为:OnSaveInstanceSate被调用的前提下,Activity确实销毁了,之后重新创建会执行。
另外,onRestoreInstanceState的bundle参数也会传递到onCreate方法中,你也可以选择在onCreate方法中做数据还原。
我们再来看一个流程:正常情况下从MainActivity跳转到SecondActivity执行顺序为:
com.simple.myapplication I/MainActivity: onCreate:
com.simple.myapplication I/MainActivity: onStart:
com.simple.myapplication I/MainActivity: onResume:
点击按钮后
com.simple.myapplication I/MainActivity: onPause:
com.simple.myapplication I/SecondActivity: onStart:
com.simple.myapplication I/SecondActivity: onResume:
com.simple.myapplication I/MainActivity: onSaveInstanceState:
com.simple.myapplication I/MainActivity: onStop:
可以看到会先执行 MainActivity的onPause() 然后执行 SecondActivity的 onStart
、OnResume ,最后执行ManActivity的 onSaveInstanceState、onStop
这时就完全启动了 SecondActivity。
然后我们接着 点击返回按钮 返回到MainActiviy来看看:
com.simple.myapplication I/SecondActivity: onPause:
com.simple.myapplication I/MainActivity: onRestart:
com.simple.myapplication I/MainActivity: onStart:
com.simple.myapplication I/MainActivity: onResume:
com.simple.myapplication I/SecondActivity: onStop:
com.simple.myapplication I/SecondActivity: onDestroy:
这时我们看到,SecondActivity先执行 onPause()、然后MainAcitiviy从执行onRestart、onStart、onResume、回到栈顶。之后 SecondActivity执行OnStop、onDestroy销毁。
最后我们来看一种情况:当SecondActiviy是窗口Activity时,我们在Manifest中给SecondActivity添加属性
<activity android:name=".SecondActivity"
android:theme="@style/Theme.AppCompat.DayNight.Dialog" >
</activity>
然后我们来重新启动app,点击按钮进行跳转
结果如下:
com.simple.myapplication I/MainActivity: onCreate:
com.simple.myapplication I/MainActivity: onStart:
com.simple.myapplication I/MainActivity: onResume:
点击按钮;
com.simple.myapplication I/MainActivity: onPause:
com.simple.myapplication I/SecondActivity: onStart:
com.simple.myapplication I/SecondActivity: onResume:
com.simple.myapplication I/MainActivity: onSaveInstanceState:
可以看到正如文章开头所述:如果SecondActivity是窗口Activity,那么MainActivity不会执行onStop.接着我们按返回键,返回MainActiviy
com.simple.myapplication I/SecondActivity: onPause:
com.simple.myapplication I/MainActivity: onResume:
com.simple.myapplication I/SecondActivity: onStop:
com.simple.myapplication I/SecondActivity: onDestroy:
可以看到MainActiviy直接执行了OnResume。并没有执行onRestart()和onStart()