android 一张图概括Activity生命周期的调用

1.标准情况下的生命周期:
lADPDgtYuEUN9AXNBQDNA8A 960 1280
2.代码说明:
package com.stackdump.myapplication;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.content.res.Configuration;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    //需要判断Bundle是否为Null
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.d("info","lsm onCreate");
        if (savedInstanceState != null) {
            String test = savedInstanceState.getString("extra_test");
            Log.d("info", "[onCreate]restore extra_test:" + test);
        }
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        Log.d("info"," onRestart");

    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.d("info"," onStart");

    }

    //1.该方法的调用和activity的启动模式有关
    //2.调用该方法,onCreate和onStart不会被调用
    //3.若启动模式是singleTask,该activity重复调用启动该activity,生命周期:onPause->onNewIntent->onResume
    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
    }

    //1.调用时机在onStart之后
    //2.一旦被调用,Bundle不为空,不用判断是否为Null
    //3.官方建议该方法恢复数据,而不是onCreate
    @Override
    protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        Log.d("info"," onRestoreInstanceState");
        String test = savedInstanceState.getString("extra_test");
        Log.d("info", "[onRestoreInstanceState]restore extra_test:" + test);
    }

    //1.xml中指定configChanges="orientation|screenSize",不会调用onSaveInstanceState方法而是调用该方法,且不调用生命周期
    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        Log.d("info"," onConfigurationChanged");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.d("info"," onResume");

    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.d("info"," onPause");

    }

    //1.调用时间在onStop之前,与onPause没有既定顺序
    //2.Activity异常退出会被调用,比如:
    // 1)资源相关的系统配置发生改变导致Activity被杀死并重新创建(屏幕切换)
    // 2)资源内存不足导致低优先级的Activity被杀死
    //3.即将被销毁并且有机会重新显示的情况下才会被调用;正常销毁系统不会调用
    //4.举例:
    // 1)屏幕切换:onPause->onSaveInstanceState->onStop->onDestroy
    // 2)来电:onPause->onSaveInstanceState->onStop,挂电:onRestart->onStart->onResume
    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        Log.d("info"," onSaveInstanceState");
        outState.putString("extra_test", "test");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.d("info"," onStop");

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d("info"," onDestroy");

    }
}

总结:

1.onStart和onStop是从Activity是否可见的角度来回调,onResume和onPause是从Activity是否位于前台这个角度来回调,实际使用中无其他明显区别。

2.当栈中无任何Activity时,系统会回收这个任务栈。

3.standard模式的activity运行在启动它的那个Activity所在的栈中。如果是ApplicationContext去启动standard模式的activity,需要指定FLAG_ACTIVITY_NEW_TASK标记位,此时,实际上Activity是以singleTask模式启动的。

0

留下评论