Activity : 生命周期

Activity的生命周期主要分为7个阶段,每个阶段都有一个对应的回调方法:

1、onCreate()

当Activity第一次被创建时调用,在这个方法中要做Activity的初始化操作,比如 加载布局、绑定事件等。

onCreate()执行后当前Activity的状态为:不可见,不可交互。

2、onStart()

当Activiy要由不可见变为可见时调用。

onStart()执行后当前Activity的状态为:可见,不可交互。

3、onResume()

当Activiy准备好和用户交互时调用,调用后该Activity一定位于返回栈的栈顶。

onResume()执行后当前Activity的状态为:可见,可交互。

4、onPause()

这个方法在系统准备去启动或者恢复另一个Activity的时候调用。通常会在这个方法中将一些消耗 CPU的资源释放掉,也可以保存一些当前Activity的关键数据,以便以后需要恢复当前Activity时使用。需要注意的是,这个函数执行完以后,新的Activity才会创建,所以在这个方法中不建议执行太耗时的代码。

onPause()执行后当前Activity的状态为:可见,不可交互。

5、onStop()

这个方法在Activity完全不可见的时候调用。它和 onPause()方法的主要区别在于,如 果启动的新Activity是一个对话框式的Activity,那么 onPause()方法会得到执行,而 onStop() 方法并不会执行。 原因是对话框式的Activity一般是非全屏的,用户仍然可以看到对话框下面的Activity的部分界面,如果这时执行Activity的onStop() 方法的话,用户会发现对话框下面的Activity界面消失了,会影响用户体验。

onStop()执行后当前Activity的状态为:不可见,不可交互。

6、onDestroy()

这个方法在活动被销毁之前调用,调用之后之后活动的状态将变为销毁状态。 

7、onRestart()

这个方法在活动由停止状态变为运行状态之前调用,也就是活动被重新启动了。


7种状态的转换关系可以参照下图:



另外还有一个金字塔型的流程图:



【举个栗子】

1、AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.activitydemo" >

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme" >
        <activity android:name=".Activity1" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".Activity2" >
        </activity>
        <activity android:name=".Activity3" android:theme="@style/Theme.AppCompat.Dialog" >
        </activity>
    </application>
    
</manifest>

2、Activity1.java

package com.activitydemo;

import android.content.DialogInterface;
import android.content.Intent;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

public class Activity1 extends AppCompatActivity implements View.OnClickListener, DialogInterface.OnClickListener {
    private Button buttonOpenActivity2, buttonOpenActivity3, buttonOpenAlertDialog;
    private AlertDialog.Builder builder;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.layout_activity1);
        Log.i("INFO", "Activity1: onCreate");

        buttonOpenActivity2 = (Button) findViewById(R.id.btn_act1_1);
        buttonOpenActivity2.setOnClickListener(this);
        buttonOpenActivity3 = (Button) findViewById(R.id.btn_act1_2);
        buttonOpenActivity3.setOnClickListener(this);
        buttonOpenAlertDialog = (Button) findViewById(R.id.btn_act1_3);
        buttonOpenAlertDialog.setOnClickListener(this);

        builder = new AlertDialog.Builder(this);
        builder.setTitle("标题栏");
        builder.setMessage("这是一个Alert对话框");
        builder.setPositiveButton("确定", this);
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.i("INFO", "Activity1: onStart");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.i("INFO", "Activity1: onResume");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.i("INFO", "Activity1: onPause");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.i("INFO", "Activity1: onStop");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.i("INFO", "Activity1: onDestroy");
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        Log.i("INFO", "Activity1: onRestart");
    }

    @Override
    public void onClick(View v) {
        Intent intent;
        switch(v.getId()) {
            case R.id.btn_act1_1:
                intent=new Intent(this, Activity2.class);
                startActivity(intent);
                break;
            case R.id.btn_act1_2:
                intent=new Intent(this, Activity3.class);
                startActivity(intent);
                break;
            case R.id.btn_act1_3:
                builder.show();
                break;
            default:
                break;
        }
    }

    @Override
    public void onClick(DialogInterface dialog, int whichButton) {
    }
}

3、Activity2.java

package com.activitydemo;

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;

public class Activity2 extends AppCompatActivity implements View.OnClickListener {
    private Button buttonOpenActivity1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.layout_activity2);
        Log.i("INFO", "Activity2: onCreate");

        buttonOpenActivity1 = (Button) findViewById(R.id.btn_act2_1);
        buttonOpenActivity1.setOnClickListener(this);
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.i("INFO", "Activity2: onStart");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.i("INFO", "Activity2: onResume");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.i("INFO", "Activity2: onPause");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.i("INFO", "Activity2: onStop");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.i("INFO", "Activity2: onDestroy");
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        Log.i("INFO", "Activity2: onRestart");
    }

    @Override
    public void onClick(View v) {
        Intent intent=new Intent(this, Activity1.class);
        startActivity(intent);
    }
}

4、Activity3.java

package com.activitydemo;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;

public class Activity3 extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.layout_activity3);
        Log.i("INFO", "Activity3: onCreate");
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.i("INFO", "Activity3: onStart");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.i("INFO", "Activity3: onResume");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.i("INFO", "Activity3: onPause");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.i("INFO", "Activity3: onStop");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.i("INFO", "Activity3: onDestroy");
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        Log.i("INFO", "Activity3: onRestart");
    }
}

5、layout_activity1.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <Button
        android:id="@+id/btn_act1_1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="跳转到Activity2(全屏)"/>
    <Button
        android:id="@+id/btn_act1_2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="跳转到Activity3(非全屏)"/>
    <Button
        android:id="@+id/btn_act1_3"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="打开对话框"/>

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center_vertical">
        <TextView
            android:text="Activity 1"
            android:textSize="30dp"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center_horizontal"/>
    </LinearLayout>
</LinearLayout>

6、layout_activity2.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <Button
        android:id="@+id/btn_act2_1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="返回Activity1"/>

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center_vertical">
        <TextView
            android:text="Activity 2"
            android:textSize="30dp"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center_horizontal"/>
    </LinearLayout>
</LinearLayout>

7、layout_activity2.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:text="Activity 3"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_horizontal" />
</LinearLayout>
 
 
【运行结果】
1、启动

Activity1: onCreate
Activity1: onStart
Activity1: onResume

2、跳转到ACTIVITY2

Activity1: onPause
Activity2: onCreate
Activity2: onStart
Activity2: onResume
Activity1: onStop

3、从ACTIVITY2返回ACTIVITY1
Activity2: onPause
Activity1: onCreate
Activity1: onStart
Activity1: onResume
Activity2: onStop

4、跳转到ACTIVITY3

Activity1: onCreate
Activity1: onStart
Activity1: onResume
Activity1: onPause
Activity3: onCreate
Activity3: onStart
Activity3: onResume

5、从ACTIVITY3返回ACTIVITY1
Activity3: onPause
Activity1: onResume
Activity3: onStop
Activity3: onDestroy

6、打开对话框(没有LOG输出)
7、从对话框返回ACTIVITY1(没有LOG输出)

除了界面切换时Activity会发生生命周期的转换之外,一些系统操作也会发生,比如:返回桌面时,锁屏时,横屏竖屏切换时等。
1、按桌面按钮返回桌面时:
Activity1: onPause
Activity1: onStop
从桌面再次打开APP时:
Activity1: onRestart
Activity1: onStart
Activity1: onResume
2、锁屏时:
Activity1: onPause
Activity1: onStop
解锁时:
Activity1: onRestart
Activity1: onStart
Activity1: onResume
3、横屏竖屏切换时(Ctrl + F12)
Activity1: onPause
Activity1: onStop
Activity1: onDestroy
Activity1: onCreate
Activity1: onStart
Activity1: onResume
 
 
 
除了上面列出的常见情况外,在不同的手机厂商开发的OS系统下,Activity表现出的生命周期可能也有差别,这时可以通过打印Log来确认。
 

                
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值