2.5 Activity生命周期

Posted

tags:

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

先说一下我们上面运行的程序,当用户在手机上看到显示的内容(如:2.2 音乐播放示例),其中内容部分在android开发中都需要一个应用组件来实现,这个组件叫做Activity。大家可以这样子去理解Activity,它就是完成手机屏幕内容的显示。 在学习Android开发时,理解并掌握Activity的生命周期很重要。例如:当手机屏幕内容从一个界面切换到另一个界面,这就需要从一个Activity切换到另一个Activity,其中他们是如何运行的,这就需要理解Activity的生命周期。

先给一个Google官方的图解图

技术分享

测试Activity生命周期,见下面的程序代码

package com.android;

import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.util.Log;
import android.view.View;
import android.widget.Button;

public class LifeCycleActivity extends Activity {
    private static final String TAG = "LifeCycleActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Log.v(TAG, "onCreate Called");
        
        Button btn1 = (Button) findViewById(R.id.btn1);
        btn1.setOnClickListener(new View.OnClickListener() {
            
            @Override
            public void onClick(View v) {
                /* Intent实现Activity与Activity之间的切换 */
                Intent intent = new Intent(LifeCycleActivity.this, TargetActivity.class);
                startActivity(intent);
            }
        });
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.v(TAG, "onDestroy Called");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.v(TAG, "onPause Called");
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        Log.v(TAG, "onRestart Called");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.v(TAG, "onResume Called");
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.v(TAG, "onStart Called");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.v(TAG, "onStop Called");
    }
    
}
package com.android;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

public class TargetActivity extends Activity {
    private static final String TAG = "TargetActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.target);
        
        Button btn2 = (Button) findViewById(R.id.btn2);
        btn2.setOnClickListener(new View.OnClickListener() {
            
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(TargetActivity.this, LifeCycleActivity.class);
                startActivity(intent);
            }
        });
    }
    
    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.v(TAG, "onDestroy Called");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.v(TAG, "onPause Called");
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        Log.v(TAG, "onRestart Called");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.v(TAG, "onResume Called");
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.v(TAG, "onStart Called");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.v(TAG, "onStop Called");
    }

}

上面两个Activity,其中LifeCycleActivity为APP的主运行程序,而TargetActivity需要LifeCycleActivity来调用才能运行。当然上面的两段代码有几个关注点需要解释一下

  • Log.v(TAG,"onCreate Called"):这个是Android程序中特有的日志输出程序,对调试Android程序比较有用,输出的结果可以在eclipse中LogCat中查阅
  • Intent intent = new Intent(TargetActivity.this, LifeCycleActivity.class); 这段代码是Android的中两个Activity相互传递信息的类(即:一个Activity想调用另一个Activity,需要使用Intent)
  • startActivity(intent); 启动Intent,来调用TargetActivity

注意:查看Activity生命周期需要重写Activity中的方法。重写方法请参照上面的图片

有了上面Activity生命周期的流程图,我们先给大家总结一下Activity生命周期的几个过程

  • 启动Activity:系统会先调用onCreate方法,然后调用onStart方法,最后调用onResume,Activity进入运行状态。
  • 当Activity被其他Activity覆盖其上或被锁屏:系统会调用onPause方法,暂停当前Activity的执行。 当前Activity由被覆盖状态回到前台或解锁屏:系统会调用onResume方法,再次进入运行状态。
  • 当Activity转到新的Activity界面或按Home键回到主屏,自身退居后台:系统会先调用onPause方法,然后调用onStop方法,进入停滞状态。
  • 用户后退回到此Activity:系统会先调用onRestart方法,然后调用onStart方法,最后调用onResume方法,再次进入运行状态。
  • 当Activity处于被覆盖状态或者后台不可见状态,即第2步和第4步,系统内存不足,杀死当前Activity,而后用户退回当前Activity:再次调用onCreate方法、onStart方法、onResume方法,进入运行状态。
  • 用户退出当前Activity:系统先调用onPause方法,然后调用onStop方法,最后调用onDestory方法,结束当前Activity。

文章内容来自:国信安刘阳

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

关于片段生命周期

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

使用 Fragment 和 Activity 执行生命周期流程的问题

自动挂钩到 Activity 生命周期方法的异步任务库

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

我可以管理生命周期所有者,用 Koin 注入 viewModel 吗?