您的位置:首页 > 移动开发 > Android开发

Activity的生命周期方法

2016-05-24 16:21 609 查看
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()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息