我使用一些额外的参数启动一个Intent,然后在Activity的onCreate
方法中读取传递过来的参数。
class MyActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val extras: Bundle? = intent.extras // <-- crash
val someInt = extras?.getInt(EXTRA_SOME_INT, -1) ?: -1
// ...
}
companion object {
const val EXTRA_SOME_INT = "someInt"
fun createIntent(context: Context, someInt: Int) =
Intent(context, MyActivity::class.java).apply {
putExtra(EXTRA_SOME_INT, someInt)
}
}
}
// Activity started like this:
fun startMyActivity(context: Context) {
context.startActivity(MyActivity.createIntent(context, 1234))
}
这个代码在测试中运行良好,但是在生产环境中,当调用getExtras()
时,标记行有时会导致应用程序崩溃。根据文档,它可以为null,但不应该抛出异常。
崩溃日志并不总是相同的,但是要么发生在BaseBundle
中:
java.lang.NullPointerException
Attempt to invoke virtual method 'int android.os.Parcel.dataSize()' on a null object reference
BaseBundle.java line 164 in android.os.BaseBundle.<init>()
Bundle.java line 106 in android.os.Bundle.<init>()
Intent.java line 6580 in android.content.Intent.getExtras()
……否则会发生这种情况:
java.lang.IllegalArgumentException
Duplicate key in ArrayMap:
BaseBundle.java line 126 in android.os.BaseBundle.<init>()
Bundle.java line 102 in android.os.Bundle.<init>()
Intent.java line 5756 in android.content.Intent.getExtras()
崩溃仅发生在Android 5、6或7上。我没有找到在自己的设备上复现它的方法。
我做错了什么吗?或者有什么最好的方法可以避免这种崩溃?如果没有额外的bundle,我就无法显示我的Activity。