【问题标题】:Android - Prevent activity from restarting after staying in backgroundAndroid - 在后台停留后阻止活动重新启动
【发布时间】:2018-11-29 06:44:57
【问题描述】:

我正在开发一个包含 4 个活动 [A、B、C、D] 的库

Activity A is launched by user-app
    A launches B and expect response on `onActivityResult`.
        B finishes by setting RESULT_OK
    A launches C and expect response on `onActivityResult`.
        C do some Image processing on a 4096x2160 image and finishes by setting RESULT_OK
    A launches D and expect response on `onActivityResult`.
        D finishes by setting RESULT_OK
    A set it's result as  RESULT_OK finishes.
The result is returned to the user-app.

此步骤后出现问题 C do some Image processing on a 4096x2160 image and finishes by setting RESULT_OK

在该步骤之后,活动 A 从后面销毁,并调用 A 中的 onCreate,即再次调用 A launches B and expect response on onActivityResult.。我怎样才能以更好的方式做到这一点,以免出现任何意外停机。

这是活动A的代码:

class  SelectPackage : AppCompatActivity() {

companion object {

    internal const val RES_PACKAGE_CANCEL = 100
    internal const val RES_PACKAGE_OK = 104
    internal const val RES_EDITACTIVITY_CANCEL = 101
    internal const val RES_EDITACTIVITY_OK = 105
    internal const val RES_SUMMARY_CANCEL = 102
    internal const val RES_SUMMARY_OK = 103
}

private val REQ_CODE = 1023

private val data: Data by lazy { makeDataObject() }

private fun makeDataObject(): Data {
    val data = Data()

    data.clientToken = intent.getStringExtra(clientToken)
    ....
    ....
    data.screenSize = intent.getStringExtra(screenSize)

    return data
}

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_select_package)

    Log.d("YYY", "Activity started again")
    val i = Intent(this, Packages::class.java)
    i.putExtra(SelectPackage.DATA, data)

    startActivityForResult(i, REQ_CODE)

}

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    if (requestCode == REQ_CODE) {
        when (resultCode) {

            RES_PACKAGE_CANCEL -> {
                setResult(AppCompatActivity.RESULT_CANCELED)
                finish()
            }

            RES_PACKAGE_OK -> {
                if (data != null) {
                    val intent = Intent(this, EditActivity::class.java)
                    intent.putExtra(SelectPackage.DATA, data.getSerializableExtra(SelectPackage.DATA))
                    intent.putExtra(Pkgs.TAG, data.getSerializableExtra(Pkgs.TAG))
                    startActivityForResult(intent, REQ_CODE)
                }
            }

            RES_EDITACTIVITY_CANCEL -> {
                setResult(AppCompatActivity.RESULT_CANCELED)
                finish()
            }

            RES_EDITACTIVITY_OK -> {
                if (data != null) {
                    val intent = Intent(this, SummaryActivity::class.java)
                    intent.putExtra(SelectPackage.DATA, data.getSerializableExtra(SelectPackage.DATA))
                    intent.putExtra(Pkgs.TAG, data.getSerializableExtra(Pkgs.TAG))
                    startActivityForResult(intent, REQ_CODE)
                }
            }

            RES_SUMMARY_CANCEL -> {
                setResult(AppCompatActivity.RESULT_CANCELED)
                finish()
            }

            RES_SUMMARY_OK -> {
                if (data != null) {
                    val intent = Intent()
                    intent.putExtra(SelectPackage.packageName, data.getStringExtra(SelectPackage.packageName))
                    intent.putExtra(SelectPackage.packageId, data.getStringExtra(SelectPackage.packageId))
                    intent.putExtra(SelectPackage.packagePrice, data.getFloatExtra(SelectPackage.packagePrice,0f))
                    setResult(AppCompatActivity.RESULT_OK)
                    finish()
                }
            }
        }

    }
}

}

【问题讨论】:

  • 可能是因为你在启动 3 个其他活动后使用 ram 和系统破坏了 A 活动,如果你不能在 1 个活动中完成所有这些活动,请在完成 D 活动后再次启动一个活动
  • 其他activity在返回A之前被销毁

标签: android android-activity android-library


【解决方案1】:

内存不足会导致操作系统终止您的 Activity A 的进程(查看this)。也许你在Activity C的过程中做的太多了。

解决方法可以将结果存储到本地存储(例如:SharedPreferences)。在 Activity A 的onCreate() 中,检查本地存储以决定下一步该做什么。

【讨论】:

  • 感谢您的解决方案!!。我决定以不同的方式去!也就是说.. 用户应用程序调用 Activity C(最重的一个!)。它会根据需要启动其他活动。这为我解决了这个问题。
  • 很高兴听到这个消息!
最近更新 更多