Activity的状态和生命周期

Activity的概述

在一个Android的应用中可以有多个Activity,这些Activity组成了Activity栈(Stack),当前活动的Activity位于栈顶,之前的Activity,这些Activity被压在当前Activity下面成为非活动的Activity,等待是否可能被恢复为活动状态。在Activity的生命周期中有4个重要的状态。

Activity的4个重要状态

状态描述
运行状态当前的Activity为于Activity栈的栈顶,用户可见,且可以获得焦点。1
暂停状态失去焦点的Activity,仍然可见,但是在内存极低的情况下,系统才会主动考虑回收这种活动。
停止状态该Activity被其他Activity所覆盖,不可见,但是它仍然保存所有的状态和信息。当内存极低的时候,它将会被系统杀掉。
销毁状态当前Activity结束,或Activity在模拟器上的进程结束。

Activity生命周期中的七个回调方法

如图:Activity的生命周期及调用方法
在这里插入图片描述

Activity生命周期调用方法及描述

  • onCreate():在创建Activity时就被调用。在Android Studio中创建Android项目时,就会自动创建一个Activity,在该Activity中就默认有该方法onCreate()方法,用于对完成加载布局和绑定实践等初始化操作。
  • onStart() :当一个activity由不可见变为可见的时候调用。
  • onResume() :当activity由暂停状态恢复为活动状态的时候被调用。此时activity返回栈顶,总是在onPause()方法后执行。
  • onPause() : 这个方法在系统准备去启动或者恢复另一个活动的时候调用。我们通常会在这个方法中将一些消耗 CPU 的资源释放掉,以及保存一些关键数据。l例如在播放视频的时候,突然来打了一个电话,这个方法就将视频状态持久保存下来。
  • onRestart() :重新启动Activity时被调用,总是在onStart()方法后执行。
  • onStop() :停止Activity时被调用,这个方法在活动完全不可见的时候调用。它和onPause()方法的区别在于,当启动的新活动是一个对话框式的活动,那么onPause()会得到执行,而onStop()不会得到执行。
  • onDestory() :销毁Activity时被调用,之后为销毁状态。

一个简单案例

第一个Activity界面 第二个Activity界面类似

import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.i("MainActivity","我是第一个界面的onCreate()");
        Button button=findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent=new Intent(MainActivity.this,Main2Activity.class);
                startActivity(intent);
            }
        });
    }
    @Override
    protected void onStart() {
        super.onStart();
        Log.i("MainActivity","我是第一个界面的onStart() ");
    }
    @Override
    protected void onResume() {
        super.onResume();
        Log.i("MainActivity","我是第一个界面的onResume() ");
    }
    @Override
    protected void onPause() {
        super.onPause();
        Log.i("MainActivity","我是第一个界面的onPause() ");
    }
    @Override
    protected void onRestart() {
        super.onRestart();
        Log.i("MainActivity","我是第一个界面的onRestart() ");
    }
    @Override
    protected void onStop() {
        super.onStop();
        Log.i("MainActivity","我是第一个界面的onStop() ");
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.i("MainActivity","我是第一个界面的onDestroy() ");
    }
}

运行项目,生成Activity,查看生命周期变化

一、启动模拟器,运行项目,调用方法。

在这里插入图片描述
二、在第一个Activity中点击按钮,进入第二个Activity,调用方法。

在这里插入图片描述
三、由第二个Activity中点击按钮,用 finsh( ) 方法返回第一个Activity

在这里插入图片描述

活动被回收了怎么办

当一个活动进入到了停止状态,活动是可能会被回收的,当又要返回到这个Activity的时候,因为已经被回收,将不会在调用onRestart() 方法,而是重新调用 onCreate()方法。

  1. 当存在这种情况的时候,比如:Activity中存在一个文本框,你预输入了一些东西,当你跳到另外的页面,页面回收,再次返回该页面时,你输入的东西就不见了,给人的体验是非常不好的。

解决办法

  1. 在Activity对应的Java文件内加入代码

 @Override
    protected void onSaveInstanceState(@NonNull Bundle outState) {
        super.onSaveInstanceState(outState);
        String str="Hello Word!";
        outState.putString("0527",str);
    }
    
  1. 在onCreate(Bundle savedInstanceState)里加入代码
//在 setContentView(R.layout.activity_main);后添加
if(savedInstanceState!=null){
            String string=savedInstanceState.getString("0527");
            Log.i("MainActivity",string);
        }

这样就可将值保存下来。


  1. 焦点:就是为了解决哪个控件响应键盘的问题,比如界面上有两个输入框,只有获得焦点的输入框才能的到键盘的输入。 ↩︎

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值