如何在 android Kotlin 中获取以前的活动

Posted

技术标签:

【中文标题】如何在 android Kotlin 中获取以前的活动【英文标题】:How to get previous activity in android Kotlin 【发布时间】:2019-04-30 04:16:07 【问题描述】:

假设我的默认活动是MainActivity,我开始另一个活动DepositActivity 没有finish() 中使用finish()@

现在我如何访问MainActivity 内部DepositActivity 的实例

【问题讨论】:

你能提供一个例子吗,你为什么想要一个 Activity 的实例?我问是因为这听起来不是一个好习惯,因为后台 Activity 可能处于未定义状态(可能已被系统破坏等),这听起来像是泄漏。 查看此链接 --> medium.com/@peterekeneeze/… //创建了一个静态变量伴随对象 @MarošŠeleng 感谢您在这里发出理性的声音。 【参考方案1】:

现在我如何访问 DepositActivity 中的 MainActivity 实例

AFAIK这是不可能在另一个活动中访问一个活动的实例

如果您有这种类型的要求,请尝试使用Fragments 进行管理

【讨论】:

【参考方案2】:

    如果您想从DepositActivity 检索某些结果,请使用startActivityForResult(..., DepositActivity::class.java) 方法。在MainActivity 覆盖onActivityResult 方法:

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) 
        // retrieve data using 'data' variable
    
    

    DepositActivity中,你需要在完成DepositActivity之前使用方法setResult()设置数据。

    如果您想将一些数据传递给DepositActivity,请使用intent,例如:

    val intent = Intent(this, DepositActivity::class.java)
    intent.putExtra("Extra_Name", /*Some Data*/)
    startActivity(intent)
    

    不推荐:使用MainActivity的静态引用(不要忘记在onDestroy()方法中删除它):

    class MainActivity : AppCompatActivity() 
       companion object 
            @SuppressLint("StaticFieldLeak")
            @JvmStatic
            var instance: MainActivity? = null
       
    
       override fun onCreate(savedInstanceState: Bundle?) 
            super.onCreate(savedInstanceState)
            instance = this
       
    
       override fun onDestroy() 
           instance = null
           super.onDestroy()
       
    
    

    DepositActivity 你可以这样访问它:

    MainActivity.instance?./* call some method or property */
    

    但你不应该依赖 onDestroy() 被调用,因为 there are situations where the system will simply kill the activity's hosting process without calling this method (or any others) in it... 所以你可能有内存泄漏

【讨论】:

我很高兴您将“不推荐”加粗,但我认为您根本不应该发布它。此外,你不应该依赖 onDestroy() 被调用,导致 There are situations where the system will simply kill the activity's hosting process without calling this method (or any others) in it...,因此 StaticFieldLeak lint 警告你压制。【参考方案3】:

您需要在 MainActivity 中声明为 companion object 变量和方法。静态类型的变量和方法在 Kotlin 中被声明为 companion object

看下面的例子,

在MainActivity中声明变量和方法,

val value : String = "hello from Main"

companion object 

    lateinit var instance : MainActivity

    fun getInstancem() : MainActivity 

        return instance
    

使用此实例并在 DepositActivity 中打印值,例如,

Log.d("log_in_second_activity", "message " + MainActivity.getInstancem().value)

你可以看到日志信息。

希望这会给你提示。

【讨论】:

以上是关于如何在 android Kotlin 中获取以前的活动的主要内容,如果未能解决你的问题,请参考以下文章

如何在 kotlin android 中使用 volley 获取 json

如何在kotlin android的MaterialButton中获取背景颜色

如何在 android 中获取 XML 响应字符串以及 Kotlin 数据模型?

如何在 Android Studio 中使用 Kotlin 从 Firebase 中的数据库中获取特定值?

Android Kotlin Volley 如何从 JSONArray 中获取价值

如何在 Android Studio 中使用 Kotlin 从 Firestore 数据库中获取下一条和上一条数据?