Android活动的生命周期——Activity A与Activity B之间切换和Activity A与Activity C(对话框)之间切换

 

目录

 

一、问题描述

二、活动的生命周期

1. 返回栈

2. 活动的状态

3. 活动的7个回调方法

三、Activity A与Activity B之间切换

1. 创建主活动Activity A

2.创建ActivityB

3. 创建Activity C(对话框)

 4. 实验结果


一、问题描述

前不久面试Android开发几乎每次都被问:1. Activity的状态有哪几种?2. Activity的生存周期是怎样的?3.从一个Activity A启动一个Activity B,然后再返回Activity A七个回调方法是如何调用的?今天做了个实验,写篇文章记录一下


二、活动的生命周期

以下知识点参考:《第一行代码》郭霖

1. 返回栈

Android使用任务(Task)来管理活动,一个任务就是一组存放在栈里的活动的集合,这个栈也被称作返回栈(Back Stack)。栈是一种后进先出的数据结构,在默认情况下,每当我们启动了一个新的活动,他会在返回栈中入栈,并处于栈顶的位置。而每当我们按下Back键或者调用finish()方法去销毁一个活动时,处于栈顶的活动会出栈,这时前一个入栈的活动就会重新处于栈顶的位置。系统总是会显示处于栈顶的活动给用户。

2. 活动的状态

  1. 运行状态:当一个活动处于返回栈的栈顶时,这时活动就处于运行状态,系统最不愿意回收处于此状态的活动。
  2. 暂停状态:当一个活动不再处于栈顶位置,但仍然可见时,这时活动就进入了暂停状态,例如对话框活动之后的活动。只有在内存极低的情况下,系统才会去考虑回收这种活动。
  3. 停止状态:当一个活动不再处于栈顶位置,并且完全不可见的时候,就进入了停止状态。当其他地方需要内存时,处于停止状态的活动有可能会被系统回收。
  4. 销毁状态:当一个活动从返回栈中移除后,就变成了销毁状态,系统最倾向于回收处于这种状态的活动。

3. 活动的7个回调方法

  1. onCreate():在活动第1次被创建的时候调用,在这个方法中完成活动的初始化操作,比如加载布局,绑定事件等。
  2. onStart():这个方法在活动由不可见变为可见的时候调用。
  3. onResume():这个方法在活动准备好和用户进行交互的时候调用,此时活动一定处于返回栈栈顶,并且一定处于运行状态。
  4. onPause():这个方法在系统准备去启动或者恢复另一个活动的时候调用。通常会在这个方法中将一些消耗CPU的资源释放掉,以保存一些关键数据。
  5. onStop():这方法在活动完全不可见的时候调用。它和onStop()的区别主要在,如果启动的新活动是一个对话框式的活动,那么onPause()会执行,而onStop()不会执行。
  6. onDestory():这个方法在活动被销毁之前调用,之后的活动状态将变为销毁状态。
  7. onRestart():这个方法在活动由停止状态变为运行状态之前调用,也就是活动被重新启动。

三、Activity A与Activity B之间切换

1. 创建主活动Activity A

  1. 创建主活动MainActivity。
  2. 设置两个按钮:一个用于点击启动Activity B,一个用于点击启动对话框类型的活动
  3. 重写剩余六个回调方法,并在其中打印日志
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d("TAG","A_onCreate");
        setContentView(R.layout.activity_main);
        Button startNormalActivity=(Button)findViewById(R.id.start_normal_activity);//Activity B
        Button startDialogActivity=(Button)findViewById(R.id.start_dialog_activity);//Activity C(对话框)
        startNormalActivity.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent=new Intent(MainActivity.this,NormalActivity.class);
                startActivity(intent);
            }
        });
        startDialogActivity.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent=new Intent(MainActivity.this,DialogActivity.class);
                startActivity(intent);
            }
        });
    }

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

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

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

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

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

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

2.创建ActivityB

public class NormalActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_normal);
        Log.d("TAG","B_onCreate");
    }

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

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

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

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

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

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

3. 创建Activity C(对话框)

public class DialogActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_dialog);
        Log.d("TAG","C_onCreate");
    }

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

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

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

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

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

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

 4. 实验结果

  • 首先启动Activity A,

  • 在A中点击按钮启动Activity B

  • 返回Activity A

  • 启动ActivityC(对话框)

  • 从ActivityC(对话框)返回Activity A

多动手,理解得更深刻

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值