Android中从一个Activity跳转到另一个Activity经历的生命周期?

本文通过启动两个Activity并返回的场景,详细解析了Android中Activity的生命周期,并深入探讨了onStart与onResume、onPause与onStop的区别。

最近在看android的书,引起了一些启发和回忆起以前的面试经历,那是我进入第一家公司的面试官问我的问题,虽然我回答错了,但是依然被录取了,非常高兴,也非常荣幸。后来又对这个知识点进行了学习。现在看了书,再一次对比起来,发现有新的理解。

例子:这里先列举2个Activity分别为:ActivityA和ActivityB,我们要点击ActivityA的启动ActivityB按钮,来启动ActivityB,然后点击返回键。


1、期间经历了哪些生命周期?

先看ActivityA和ActivityB的代码:
ActivityA.java

public class ActivityA extends Activity {
    private ActivityA _this;
    private String TAG=ActivityA.class.getSimpleName();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.e(TAG,"onCreate");
        setContentView(R.layout.activity_a);
        _this=this;
    }

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

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

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

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

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

    public void startActivityB(View v){
        Intent intent=new Intent(_this,ActivityB.class);
        startActivity(intent);
    }
}

activity_a.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:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="startActivityB"
        android:text="启动ActivityB"
        />

</LinearLayout>

ActivityB.java的代码

public class ActivityB extends Activity {
    private ActivityB _this;
    private String TAG=ActivityB.class.getSimpleName();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.e(TAG,"onCreate");
        setContentView(R.layout.activity_a);
        _this=this;
    }


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

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

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

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

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

    public void startActivityB(View v){
        Intent intent=new Intent(_this,ActivityB.class);
        startActivity(intent);
    }
}

好了,重点来了。

  • (1)我先启动了ActivityA,生命周期

这里写图片描述

  • (2)然后点击ActivityA的跳转按钮
    这里写图片描述
  • (3)点击ActivityB的返回按钮。
    这里写图片描述

注意看我圈出来的地方,ActivityA先onPause了,ActivityB执行了onCreate,当ActivityB的onResume执行了,ActivityA才stop,这个是不是和我们经常看的activity的生命周期是一样的。
这里写图片描述
对,就是一样的。到这里第一个问题已经回答了。

2、新启发,关于onStart和onResume、onPause和onStop的实质不同点?

还是看上图我画圈的地方,因为在activity中onStart和onStop是从Activity是否可见的角度来说的,而onResume和onPause是从Activity是否位于前台的角度来说的。
是否可见和是否位于前台区别想必大家可想而知了。
可见并不代表已经显示在用户眼前了。(这一句才是最该理解的)
这也是我们经常在onResume中做一些显示之前的数据刷新的工作了。
好了,就到这里,谢谢大家花耐心看完。

Android 开发中,当一个 Activity 跳转一个 Activity 时,系统会按照特定的顺序调用生命周期方法。假设从 Activity A 跳转Activity B,生命周期的调用流程如下: - Activity A 首先调用 `onPause()`,表示它即将失去焦点。 - 接着,Activity B 依次调用 `onCreate()`、`onStart()` 和 `onResume()`,表示新 Activity 正在创建并即将进入前台。 - 在 Activity B 完全显示之后,Activity A 才会调用 `onStop()`,表示它已经不再可见。 如果从 Activity B 返回到 Activity A(例如按下返回键),生命周期的调用流程为: - Activity B 调用 `onPause()`,表示它即将失去焦点。 - Activity A 调用 `onRestart()`、`onStart()` 和 `onResume()`,表示它重新获得焦点并回到前台。 - 最后,Activity B 调用 `onStop()` 和 `onDestroy()`,表示它已经不可见并被销毁。 ### 示例代码:生命周期打印日志 可以在每个 Activity 中重写生命周期方法,并打印日志来观察跳转过程中的调用顺序: ```java public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Log.d("Lifecycle", "MainActivity: onCreate"); } @Override protected void onStart() { super.onStart(); Log.d("Lifecycle", "MainActivity: onStart"); } @Override protected void onResume() { super.onResume(); Log.d("Lifecycle", "MainActivity: onResume"); } @Override protected void onPause() { super.onPause(); Log.d("Lifecycle", "MainActivity: onPause"); } @Override protected void onStop() { super.onStop(); Log.d("Lifecycle", "MainActivity: onStop"); } @Override protected void onDestroy() { super.onDestroy(); Log.d("Lifecycle", "MainActivity: onDestroy"); } } ``` 类似的代码可以添加到第二个 Activity 中,用于观察生命周期的变化。 ### 特殊情况 - **不完全覆盖的跳转**:如果新启动的 Activity 是透明的或对话框样式的,那么前一个 Activity 不会调用 `onStop()`,因为它仍然部分可见。 - **配置变更**:如屏幕旋转等操作会触发 Activity 的销毁和重新创建,此时生命周期经历完整的销毁和重建过程。 通过理解这些生命周期方法的调用顺序,开发者可以更好地管理资源释放、数据保存和界面更新等操作,确保应用在不同场景下的稳定性与性能。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值