android基础篇(一)Activity的生命周期

一,概述

Activity作为android四大组件中应用最多的组件,通常情况下一个简单的android应用只需要使用activity就够了,但当你的应用要完成相对复杂点的功能的时候,这个时候得用到其他组件了。熟悉掌握activity的生命周期非常有必要,这样你对activity的工作更加深刻的理解,同时在真正应用的时候你可能要完成某些需求,这些需求可能需要在特定的时刻执行,这个时候你需要考虑在activity的哪一个生命周期完成了。

二,Activity有7个生命周期,但总的来说,activity会经过4中状态

  • 活动状态:在这个状态里,activity位于前台,用户可见,可以获得焦点
  • 暂停状态:当前activity被其他activity覆盖,当前activity依然可见,当时不能获得焦点
  • 停止状态:当前activity不可见,不能获取焦点
  • 销毁状态:当前activity结束,或者当前activity所在的进程被杀死(可能是由于系统内存紧张,优先杀死该进程),或者用户按下了回退键,使得当前activity被finish掉了

Activity的生命周期

  • onCreate
    当activity被创建的时候调用,在这个生命周期里面可以做一些程序的配置,创建视图,绑定数据等等,该方法只会调用一次
  • onStart
    activity的时候调用,当前Activity变为可见
  • onReStart
    当activity重新启动的时候会调用,之前启动过,只是被杀死了,现在重新启动会调用该方法,该方法总是在onStart之后调用
  • onResume
    恢复activity的时候被回调,onStart()方法后一定会回调该方法
  • onPause
    Activity暂停的时候被回调
  • onStop
    activity停止的时候回调
  • onDestroy
    当activity被销毁的时候调用,该方法只会调用一次

只是知道上面的理论还不够,这种东西你看一遍是记不住的,而且对activity的生命周期必须非常熟悉,包括之后的fragment的生命周期,下面让我们验证一下上面的叙述是否是正确的吧

下面看一张图对Activity生命周期的描述,这张也许大家都看过,它是谷歌android文档对activity生命周期的描述:

android基础篇(一)Activity的生命周期_第1张图片

下面写个简单的代码看看activity的生命周期是如何回调的

package com.example.activitylifetest;

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 MainActivity extends Activity implements View.OnClickListener {

    private static final String TAG = "MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button btn_finish = (Button) findViewById(R.id.btn_finish);
        Button btn_startother = (Button) findViewById(R.id.btn_startother);
        Log.e(TAG, "=====onCreate=====");
        btn_finish.setOnClickListener(this);
        btn_startother.setOnClickListener(this);
    }

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

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

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

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

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

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

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.btn_finish:
            finish();
            break;
        case R.id.btn_startother:
            Intent intent = new Intent(this,OtherActivity.class);
            startActivity(intent);
            break;
        }
    }
}
当我们运行这个程序的时候,当前activity是程序的入口

看一下它的配置

<activity  android:name="com.example.activitylifetest.MainActivity" android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

对上面的配置做个说明

android.intent.action.MAIN
决定应用程序最先启动的Activity,这个指定了当前activity作为该应用程序的入口,优先级最高
android.intent.category.LAUNCHER
决定应用程序是否显示在程序列表里

运行上面的程序,看一下logcat的输出

android基础篇(一)Activity的生命周期_第2张图片

单击startActivity按钮,当前MainActivity失去焦点,但依然可见,此时该Activity进入暂停状态

android基础篇(一)Activity的生命周期_第3张图片

按下模拟器的back键,这个时候系统调用了onRestart,接着onStart,然后onResume,MainActivity进入运行状态

android基础篇(一)Activity的生命周期_第4张图片

这个时候我们按下模拟器的home键,这个时候,系统调用onPause,接着onStop,MainActivity进入停止状态,MainActivity失去焦点,且不可见

android基础篇(一)Activity的生命周期_第5张图片

上面我们给MainActivity加入了程序列表了,我们打开模拟器的程序列表,找到MainActivity并启动它

android基础篇(一)Activity的生命周期_第6张图片

这个时候我们按下返回键,或者按下我们写的finish按钮

通过上面的logcat输出对比一下谷歌画的生命周期的图片

下面我们看一些特殊的情况

  • 按下电源键,然后解锁

android基础篇(一)Activity的生命周期_第7张图片

  • 当前Activity正在运行,我们按下home键后移除,系统仅调用了onPause和onStop,并没有走onDestroy

  • 当我们在OnCreate方法中调用finish()方法,看一下日志的输出

android基础篇(一)Activity的生命周期_第8张图片
,我们可以看到,系统走了onCreate后离家走了onDestroy,并没有走生命周期中的其他方法

  • 当我们改变手机或者模拟器的屏幕方向的时候

总结一下,关于Activity的生命周期,自己最好做一个测试,并对比着activity生命周期描述的图片,activity的应用很简单,我们知道了Activity生命周期后可以在activity特定的生命周期里面完成我们要做的事情。

你可能感兴趣的:(android,Activity)