• Android学习笔记 72. Activity生命周期和状态


    Android学习笔记

    Android 开发者基础知识 (Java) —— Google Developers 培训团队

    第1单元 入门

    第2课 activity和intent

    72. Activity生命周期和状态

    你会做什么
    • 将代码添加到之前的实践中的 TwoActivity 应用程序,以实现各种Activity生命周期回调以包含日志记录语句。
    • 观察应用程序运行以及与Activity应用程序中的每个交互时的状态变化。
    • 修改您的应用程序以保留因Activity用户行为或设备上的配置更改而意外重新创建的实例状态。
    72.1 给TwoActivity添加生命周期回调
    1. 复制项目

    2. 在MainActivity中实现回调

      在该onCreate()方法中,添加以下日志语句:

      Log.d(LOG_TAG, "-------");
      Log.d(LOG_TAG, "onCreate");
      
      • 1
      • 2

      在这里插入图片描述

      添加onStart生命周期

      在这里插入图片描述

      同理,实现onPause()onRestart()onResume()onStop()onDestroy()生命周期回调。

      在这里插入图片描述

      运行

      在这里插入图片描述

    3. 在 SecondActivity 中实现生命周期回调

      package com.dingjiaxiong.twoactivities;
      
      import androidx.appcompat.app.AppCompatActivity;
      
      import android.content.Intent;
      import android.os.Bundle;
      import android.util.Log;
      import android.view.View;
      import android.widget.EditText;
      import android.widget.MediaController;
      import android.widget.TextView;
      
      public class SecondActivity extends AppCompatActivity {
      
          public static final String EXTRA_REPLY = "com.example.android.twoactivities.extra.REPLY";
      
      
          private static final String LOG_TAG = "dingjiaxiong";
      
          private EditText mReply;
      
          @Override
          protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_second);
      
              mReply = findViewById(R.id.editText_second);
      
      
              Intent intent = getIntent();
      
              String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);
      
              TextView textView = findViewById(R.id.text_message);
      
              textView.setText(message);
      
          }
      
          @Override
          protected void onStart() {
              super.onStart();
              Log.d(LOG_TAG, "onStart");
          }
      
          @Override
          protected void onPause() {
              super.onPause();
              Log.d(LOG_TAG, "onPause");
          }
      
          @Override
          protected void onRestart() {
              super.onRestart();
              Log.d(LOG_TAG, "onRestart");
          }
      
          @Override
          protected void onResume() {
              super.onResume();
              Log.d(LOG_TAG, "onResume");
          }
      
          @Override
          protected void onStop() {
              super.onStop();
              Log.d(LOG_TAG, "onStop");
          }
      
          @Override
          protected void onDestroy() {
              super.onDestroy();
              Log.d(LOG_TAG, "onDestroy");
          }
      
      
          public void returnReply(View view) {
              String reply = mReply.getText().toString();
      
              Intent replyIntent = new Intent();
      
              replyIntent.putExtra(EXTRA_REPLY, reply);
      
              setResult(RESULT_OK, replyIntent);
              Log.d(LOG_TAG, "End SecondActivity");
              finish();
      
          }
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
      • 34
      • 35
      • 36
      • 37
      • 38
      • 39
      • 40
      • 41
      • 42
      • 43
      • 44
      • 45
      • 46
      • 47
      • 48
      • 49
      • 50
      • 51
      • 52
      • 53
      • 54
      • 55
      • 56
      • 57
      • 58
      • 59
      • 60
      • 61
      • 62
      • 63
      • 64
      • 65
      • 66
      • 67
      • 68
      • 69
      • 70
      • 71
      • 72
      • 73
      • 74
      • 75
      • 76
      • 77
      • 78
      • 79
      • 80
      • 81
      • 82
      • 83
      • 84
      • 85
      • 86
      • 87
      • 88
      • 89
    4. 运行应用程序,观察日志

      在这里插入图片描述

    72.2 保存并恢复Activity实例状态

    根据系统资源和用户行为,Activity您的应用程序中的每个资源都可能比您想象的更频繁地被破坏和重建。

    每个状态都Activity作为一组键/值对存储在 Bundle称为Activity 实例状态的对象中。Bundle系统在停止之前将默认状态信息保存到实例状态Activity,并将其传递Bundle给新Activity实例进行恢复。

    为了避免在Activity意外销毁和重新创建数据时丢失数据,您需要实现该onSaveInstanceState()方法。当有可能被销毁和重新创建时,系统会在您的Activity(between onPause()and )上调用此方法。onStop()``Activity

    Activity在当前应用会话期间,您保存在实例状态中的数据仅特定于此特定的此实例。当您停止并重新启动新的应用程序会话时,Activity实例状态会丢失并Activity恢复为其默认外观。

    1. 使用onSaveInstanceState()保存Activity实例状态

      public class MainActivity extends AppCompatActivity {
          // Class name for Log tag
          private static final String LOG_TAG = "dingjiaxiong";
          // Unique tag required for the intent extra
          public static final String EXTRA_MESSAGE = "com.example.android.twoactivities.extra.MESSAGE";
          // Unique tag for the intent reply
          public static final int TEXT_REQUEST = 1;
      
          // EditText view for the message
          private EditText mMessageEditText;
          // TextView for the reply header
          private TextView mReplyHeadTextView;
          // TextView for the reply body
          private TextView mReplyTextView;
      
      
          @Override
          protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_main);
      
              Log.d(LOG_TAG, "-------");
              Log.d(LOG_TAG, "onCreate");
      
      
              mMessageEditText = findViewById(R.id.editText_main);
              mReplyHeadTextView = findViewById(R.id.text_header_reply);
              mReplyTextView = findViewById(R.id.text_message_reply);
      
              if (savedInstanceState != null) {
                  boolean isVisible = savedInstanceState.getBoolean("reply_visible");
                  if (isVisible) {
                      mReplyHeadTextView.setVisibility(View.VISIBLE);
                      mReplyTextView.setText(savedInstanceState.getString("reply_text"));
                      mReplyTextView.setVisibility(View.VISIBLE);
                  }
              }
      
      
          }
      
          @Override
          protected void onSaveInstanceState(@NonNull Bundle outState) {
              super.onSaveInstanceState(outState);
      
              if (mReplyHeadTextView.getVisibility() == View.VISIBLE) {
                  outState.putBoolean("reply_visible", true);
                  outState.putString("reply_text", mReplyTextView.getText().toString());
              }
      
          }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
      • 34
      • 35
      • 36
      • 37
      • 38
      • 39
      • 40
      • 41
      • 42
      • 43
      • 44
      • 45
      • 46
      • 47
      • 48
      • 49
      • 50
      • 51

      在这里插入图片描述

    2. 未保存和保存运行对比

      未保存:在主Activity收到回复后,旋转屏幕

      在这里插入图片描述

      可以看出,屏幕旋转后,回复被破坏显示了。

      而且可以从日志打印的生命周期明显看出,Activity是重新创建的。

      设置了保存:

      在这里插入图片描述

      666,新知识get

    72.3 小结
    • Activity 生命周期是Activity迁移经过的一组状态,从它首次创建时开始,到 Android 系统为其回收资源时结束Activity
    • 当用户Activity在您的应用程序内部和外部从一个导航到另一个导航时,每个用户都会Activity在生命周期中的状态之间移动Activity
    • 生命周期中的每个状态Activity都有一个相应的回调方法,您可以在Activity类中重写。
    • 生命周期方法是onCreate(), onStart(), onPause(), onRestart(), onResume(), onStop(), onDestroy().
    • 覆盖生命周期回调方法允许您添加在Activity转换到该状态时发生的行为。
    • 您可以使用Code > Override将骨架覆盖方法添加到 Android Studio 中的类。
    • 设备配置更改(例如旋转)会导致Activity销毁并重新创建,就好像它是新的一样。
    • 部分Activity状态在配置更改时保留,包括EditText元素的当前值。对于所有其他数据,您必须自己明确保存该数据。
    • 在方法中保存Activity实例状态。onSaveInstanceState()
    • 实例状态数据作为简单的键/值对存储在Bundle. 使用这些Bundle方法将数据放入并从Bundle.
    • 在 中恢复实例状态onCreate(),这是首选方式,或onRestoreInstanceState()
  • 相关阅读:
    IDC:阿里云获2021中国数据治理平台市场份额第一
    python基于PHP+MySQL的自习室图书馆座位管理系统
    MindSpore Graph Learning
    内网穿透配置(FRP)
    .NET 6.0中使用Identity框架实现JWT身份认证与授权
    YOLO系列梳理(九)初尝新鲜出炉的YOLOv6
    【gpt实践】50个提升工作效率的GPT指令
    Yolov8小目标检测(22):感受野注意力卷积运算(RFAConv),助力小目标检测
    SpringBoot Mybatis 多数据源 MySQL+Oracle+Redis
    STM32内存知识
  • 原文地址:https://blog.csdn.net/weixin_44226181/article/details/126358230