AndroidActivity生命周期研究

Posted 星辰大海001

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AndroidActivity生命周期研究相关的知识,希望对你有一定的参考价值。

1. 为什么研究Activity什么周期

  • Activity是android四大组件之一,是Android人必须要深刻理解的基础内容之一。
  • 可以提高我们对相关问题的解决能力。
  • 对一个问题如果不能深入理解,总觉得不踏实。

2. Activity生命周期详解

2.1 Activity生命周期图解

下图是Android开发官网的原图,清晰表达了Activity生命周期中每个方法所处位置及调用流程。

activity_lifecycle

上图对Activity的执行流程表达很到位,但是对每个方法在执行时,我们的设备处于一种什么状态,其中注释表达的不是很细致,有待进一步深入研究。

2.2 Activity生命周期核心方法详解

下表是Android官网对Activity生命周期中各个方法的详解。

image

注:通过上面表格中的信息描述我们不难发现一下几点:

  • 当Activity调用完onResume()方法后Activity就将处于可见状态,可以与用户交互了。
  • onStop()方法是在Activity完全不可见时才调用的。
  • 当调用完onPause()方法后Activity是可以被杀掉的,这也就意味着可能不会调用 onStop()和 onDestroy()。因此,您应该在调用 onPause()向存储设备写入至关重要的持久性数据(例如用户编辑)。
  • 应该对 onPause()调用期间必须保留的信息有所选择,因为该方法中的任何阻止过程都会妨碍向下一个 Activity 的转变并拖慢用户体验。

3. 通过一个生命周期实例来加深一下印象

3.1 实例代码

有两个Activity,MainActivity和TwoActivity,其代码如下,后面将执行几个常见的操作,看看其生命周期流程究竟如何运行。

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        findViewById(R.id.btn_onClick).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(MainActivity.this, TwoActivity.class));
            }
        });
        Log.i("info", "MainActivity --> onCreate()");
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.i("info", "MainActivity --> onStart()");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.i("info", "MainActivity --> onResume()");
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        Log.i("info", "MainActivity --> onRestart()");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.i("info", "MainActivity --> onPause()");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.i("info", "MainActivity --> onStop()");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.i("info", "MainActivity --> onDestroy()");
    }
}
public class TwoActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_two_layout);
        Log.i("info", "TwoActivity --> onCreate()");
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.i("info", "TwoActivity --> onStart()");
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        Log.i("info", "TwoActivity --> onRestart()");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.i("info", "TwoActivity --> onResume()");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.i("info", "TwoActivity --> onPause()");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.i("info", "TwoActivity --> onStop()");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.i("info", "TwoActivity --> onDestroy()");
    }
}

3.2 启动MainActivity

结果预测:

MainActivity --> onCreate()

MainActivity --> onStart()

MainActivity --> onResume()

真实结果:

image

果然一致。

3.3 MainActivity到TwoActivity

结果预测:

MainActivity –> onPause()

TwoActivity –> onCreate()

TwoActivity –> onStart()

TwoActivity –> onResume()

MainActivity –> onStop()

真实结果:

image

和预测顺序一致。

3.4 从TwoActivity返回到MainActivity

结果预测:

TwoAcitvity –> onPause()

MainActivity –> onRestart()

MainActivity –> onStrat()

MainActivity –> onResume()

TwoActivity –> onStop()

TwoActivity –> onDestroy()

真实结果:

image

顺序一致,证明理论是正确的。

3.5 从MainActivity返回桌面

结果预测:

MainActivity –> onPause()

MainActivity –> onStop()

MainActivity –> onDestroy()

真实结果:

image

以上是关于AndroidActivity生命周期研究的主要内容,如果未能解决你的问题,请参考以下文章

React Native 中的 Android Activity 生命周期 - ViewPager

关于片段生命周期

调用 replace() 时片段的生命周期是啥?

Android片段生命周期:onResume调用了两次

在不存在的片段上调用片段生命周期和 onCreate 的问题

导航上的片段生命周期重叠