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 一起消失,但如果您刚刚开始,我现在不会担心:
您需要了解活动不会 运行 在后台进行。用户从 activity 导航后发生的情况取决于系统
有几种方法可以实现你想要做的事情,但我会给你两个
假设我们有一个我们想要改变的叫做年龄的整数
- 使用静态变量。
在普通的 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,我们可以根据需要更改它
- 使用片段
通过将入口点设置为 activity 并将其他活动更改为片段,您可以从片段
更改 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
}
}
我正在 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 一起消失,但如果您刚刚开始,我现在不会担心:
您需要了解活动不会 运行 在后台进行。用户从 activity 导航后发生的情况取决于系统
有几种方法可以实现你想要做的事情,但我会给你两个
假设我们有一个我们想要改变的叫做年龄的整数
- 使用静态变量。 在普通的 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,我们可以根据需要更改它
- 使用片段 通过将入口点设置为 activity 并将其他活动更改为片段,您可以从片段 更改 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
}
}