Activity的生命周期方法

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()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值