Android:如何在活动之间导航并保持其状态

Android: how to navigate between activities and keep its states

我正在 Android Studio 中开发应用程序,但在活动之间导航和维护用户在其中所做的更改时遇到问题。

我想要的:
第一步:用户在Activity1中引入数据
第 2 步: 用户转到 Activity 2
第3步:用户在Activity2中引入数据
第 4 步: 用户返回 Activity 1
第 5 步: 用户更改 Activity 1 中的数据
第 6 步: 用户转到 Activity 2 但数据已经填满(因为第 3 步)

每个 activity 有 2 个按钮:一个返回(上一个 activity),一个前进(下一个 activity)。后退按钮只是调用方法 onBackPressed(),前进按钮正在启动下一个 activity,如下所示:

val i = Intent(this@NActivity, N+1Activity::class.java)
        intent.flags = Intent.FLAG_ACTIVITY_REORDER_TO_FRONT
        startActivity(i)

从Activity 2 到Activity 1 它维护数据,但是从Activity 1 到Activity 2 它不维护数据。我认为它要么在按下后退按钮时完成 Activity 2,要么在第二次单击前进按钮时开始新的 Activity 2。

我已经尝试使用 moveTaskToBack(true) 但它最小化了整个应用程序。

活动仅用于存储瞬态 UI 状态,一次只有一个 activity 处于活动状态。如果你开始另一个 activity 原来的可能会或可能不会被杀死,并且最好的做法是假设它会被杀死(有一个开发人员设置“不保持活动”允许你检查你的行为是否正确)。

在您的示例中,如果您希望对 Activity 2 所做的状态更改在用户下次返回 Activity 2 时可用,那么它们需要保存在某处(例如到内存存储、文件存储或数据库)。创建 activity 后,您需要检查持久性并更新 activity 以显示正确的信息。

我建议围绕活动和 activity 生命周期做一些阅读:

https://developer.android.com/guide/components/activities/intro-activities

https://developer.android.com/guide/components/activities/activity-lifecycle

我还建议阅读有关 Fragments 的内容:

https://developer.android.com/guide/fragments

一旦您熟悉了这些,我建议您查看 android ViewModel class 和实时数据:

https://developer.android.com/topic/libraries/architecture/viewmodel

https://developer.android.com/topic/libraries/architecture/livedata

https://developer.android.com/guide/components/activities/activity-lifecycle#saras

最后一点,其中一些内容将随 Compose 一起消失,但如果您刚刚开始,我现在不会担心:

https://developer.android.com/jetpack/compose

您需要了解活动不会 运行 在后台进行。用户从 activity 导航后发生的情况取决于系统

有几种方法可以实现你想要做的事情,但我会给你两个

假设我们有一个我们想要改变的叫做年龄的整数

  1. 使用静态变量。 在普通的 kotlin class 中说 Common.kt
    class Common{
    
    companion object{
    var age=1
    }
    }

在你的Activity1.kt

 class Activity1:AppCompatActivity(){

override fun onCreate(savedInstanceState:Bundle) {
super.onCreate(savedInstanceState)

//change your value as required
Common.age=4
}
}

在你的第二个activityActivity2.kt

class Activity2:AppCompatActivity(){
override fun onCreate(savedInstanceState: Bundle) {
super.onCreate(savedInstanceState)

//Since age is static. It's value still remains as last updated even though the activity has changed
//change your variable again as required
Common.age=10

}
}

至此。如果我们回到 Activity1,age 的值仍然是 10,我们可以根据需要更改它

  1. 使用片段 通过将入口点设置为 activity 并将其他活动更改为片段,您可以从片段
  2. 更改 activity 中的变量值

Activity1.kt

class Activity1:AppCompatActivity(){

//This is your variable
var age:Int=1
override fun onCreate(savedInstanceState:Bundle) {
super.onCreate(savedInstanceState)


}
}

然后您可以像这样从片段中修改此变量

class Fragment1: Fragment(){
 
fun changeActivityVarValue(){

val activity1= requireActivity() as Activity1

activity1.age=10
}
}