Android - 防止 activity 留在后台后重新启动
Android - Prevent activity from restarting after staying in background
我正在开发一个包含 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
在那一步之后,activity 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()
}
}
}
}
}
}
RAM 不足导致 OS 终止您的 Activity A 进程(查看 this)。也许你在 Activity C 的过程中做的太多了。
解决方法是将结果存储到本地存储(示例:SharedPreferences
)。在 Activity A 的 onCreate()
中,检查本地存储以决定下一步做什么。
我正在开发一个包含 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
在那一步之后,activity 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()
}
}
}
}
}
}
RAM 不足导致 OS 终止您的 Activity A 进程(查看 this)。也许你在 Activity C 的过程中做的太多了。
解决方法是将结果存储到本地存储(示例:SharedPreferences
)。在 Activity A 的 onCreate()
中,检查本地存储以决定下一步做什么。