跳转至

了解活动生命周期,在安卓系统中按下回车键时保留用户界面数据

原文:https://www . geeksforgeeks . org/了解-活动-生命周期-保留-ui-数据-按回时-在安卓中/

安卓系统中的 onBackPressed()是什么?

这是当用户按下安卓设备上的后退按钮时调用的覆盖函数。它对应用程序的活动生命周期有很大的影响。官方文档指出,当活动检测到用户按下后退键时,将调用 onBackPressed() 方法。默认实现只是完成当前活动,但是您可以覆盖它来做任何您想做的事情。

因此,通过本文,我们将向您展示如何覆盖这个方法并保留活动数据。但在此之前,有必要了解一下安卓中的活动生命周期。参考本文,更好地了解安卓系统中的活动生命周期:安卓系统中的活动生命周期,带演示应用

*本文共 4 部分:*

  1. 创建一个模板代码来理解导航键事件和链接的活动生命周期方法(如果您知道活动生命周期,请跳过)
  2. 重写背面按压方法
  3. 测试编辑文本
  4. 测试文本视图

1.创建一个模板代码来理解导航键事件和链接的活动生命周期方法

*第一步:在安卓工作室新建项目*

要在安卓工作室创建新项目,请参考如何在安卓工作室创建/启动新项目。我们在 Kotlin 中演示了该应用程序,因此在创建新项目时,请确保选择 Kotlin 作为主要语言。

*步骤 2:覆盖活动生命周期*中的所有方法

我们在每个方法中实现了一个 Toast 消息,以了解在活动生命周期中什么时候调用哪个方法。现在只需在设备或模拟器上运行项目。

我的锅

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        Toast.makeText(applicationContext, "onCreate", Toast.LENGTH_SHORT).show()

        }
    }

    override fun onPause() {
        super.onPause()
        Toast.makeText(applicationContext, "onPause", Toast.LENGTH_SHORT).show()
    }

    override fun onStop() {
        super.onStop()
        Toast.makeText(applicationContext, "onStop", Toast.LENGTH_SHORT).show()
    }

    override fun onDestroy() {
        super.onDestroy()
        Toast.makeText(applicationContext, "onDestroy", Toast.LENGTH_SHORT).show()
    }

    override fun onRestart() {
        super.onRestart()
        Toast.makeText(applicationContext, "onRestart", Toast.LENGTH_SHORT).show()
    }

    override fun onStart() {
        super.onStart()
        Toast.makeText(applicationContext, "onStart", Toast.LENGTH_SHORT).show()
    }

    override fun onResume() {
        super.onResume()
        Toast.makeText(applicationContext, "onResume", Toast.LENGTH_SHORT).show()
    }
}

*第三步:运行程序*

  1. 应用程序启动时: onCreate,onStart,onResume****
  2. 当按下应用概述按钮时:开启暂停,开启关闭****
  3. 按下主页按钮时:暂停,暂停****
  4. 当按下后退按钮时:暂停、停止、停止****

*输出:*

*观察:*

我们可以看到,在任何情况下,除了背部按压,活动都被停止。基本上,它不会被破坏,数据会被保留。但是,当按下后退按钮时,活动会被破坏,这意味着在此调用期间临时数据会丢失。这就是官方文件中所说的。

但是我们不想丢失这些数据。为了保留数据,我们需要重写 back pressed 方法。反压法本质上破坏了活动。我们将做出改变,使活动停止,但不破坏。继续阅读。

2.重写背面按压方法

请阅读代码中的注释。

我的锅

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        Toast.makeText(applicationContext, "onCreate", Toast.LENGTH_SHORT).show()
    }

    // Overriding onBackPressed method
    override fun onBackPressed() {

        // Implement this method to stop
        // the activity and go back
        this.moveTaskToBack(true)
    }

    override fun onPause() {
        super.onPause()
        Toast.makeText(applicationContext, "onPause", Toast.LENGTH_SHORT).show()
    }

    override fun onStop() {
        super.onStop()
        Toast.makeText(applicationContext, "onStop", Toast.LENGTH_SHORT).show()
    }

    override fun onDestroy() {
        super.onDestroy()
        Toast.makeText(applicationContext, "onDestroy", Toast.LENGTH_SHORT).show()
    }

    override fun onRestart() {
        super.onRestart()
        Toast.makeText(applicationContext, "onRestart", Toast.LENGTH_SHORT).show()
    }

    override fun onStart() {
        super.onStart()
        Toast.makeText(applicationContext, "onStart", Toast.LENGTH_SHORT).show()
    }

    override fun onResume() {
        super.onResume()
        Toast.makeText(applicationContext, "onResume", Toast.LENGTH_SHORT).show()
    }
}

*输出:*

现在我们可以观察到,在背部按压时,活动会停止,但不会破坏。我们现在将实现一些用户界面来测试这是否真的有效。继续读。

3.测试编辑文本

*第一步:在布局文件(activity_main.xml)中添加 EditText*

可扩展标记语言

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <EditText
    android:id="@+id/et1"
    android:layout_width="match_parent"
    android:layout_height="50sp"
    android:textSize="25sp"
    android:inputType="text"
    android:layout_centerInParent="true"/>

</RelativeLayout>

为了测试 EditText,我们不需要在主代码中编写任何代码,除了在前面的代码中指定的代码(覆盖背面按下的方法)。

*输入:*

在编辑文本中键入任何内容,然后按后退按钮。返回应用程序,您会注意到文本保留在编辑文本栏中。

*输出:*

编辑文本中的文本将被保留。这意味着我们的方法运行良好。我们现在将在文本视图上测试它。继续读。

4.测试文本视图

*第一步:在布局文件(activity_main.xml)中添加一个 TextView 和一个 Button*

可扩展标记语言

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/tv1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Click the button"
        android:textSize="40sp"
        android:layout_centerInParent="true"/>

    <Button
        android:id="@+id/btn1"
        android:layout_below="@id/tv1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Click"
        android:layout_centerHorizontal="true"/>

</RelativeLayout>

*步骤 2:通过主代码(MainActivity.kt)* 给这些元素添加功能

我的锅

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.TextView
import android.widget.Toast

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        Toast.makeText(applicationContext, "onCreate", Toast.LENGTH_SHORT).show()

        // TextView and Button
        val tv1 = findViewById<TextView>(R.id.tv1)
        val btn1 = findViewById<Button>(R.id.btn1)

        // A code to increment a variable and 
        // display it on TextView on Button Click
        var k = 0
        btn1.setOnClickListener {
            tv1.text = k.toString()
            k++
        }
    }

    override fun onBackPressed() {
        this.moveTaskToBack(true)
    }

    override fun onPause() {
        super.onPause()
        Toast.makeText(applicationContext, "onPause", Toast.LENGTH_SHORT).show()
    }

    override fun onStop() {
        super.onStop()
        Toast.makeText(applicationContext, "onStop", Toast.LENGTH_SHORT).show()
    }

    override fun onDestroy() {
        super.onDestroy()
        Toast.makeText(applicationContext, "onDestroy", Toast.LENGTH_SHORT).show()
    }

    override fun onRestart() {
        super.onRestart()
        Toast.makeText(applicationContext, "onRestart", Toast.LENGTH_SHORT).show()
    }

    override fun onStart() {
        super.onStart()
        Toast.makeText(applicationContext, "onStart", Toast.LENGTH_SHORT).show()
    }

    override fun onResume() {
        super.onResume()
        Toast.makeText(applicationContext, "onResume", Toast.LENGTH_SHORT).show()
    }
}

*输入:*

继续点击按钮,文本视图中的数字会不断增加。现在尝试后退按钮,并再次打开应用程序。文本将保留在文本视图中。

*输出:*

我们的方法非常有效。现在在代码中使用这种方法来保留活动数据。


我们一直在努力

apachecn/AiLearning

【布客】中文翻译组