在API 27中,在startActivityForResult之后崩溃。
在API 27中,在startActivityForResult之后崩溃。
更新到API 27和Support库27.0.2后,我突然在Crashlytics中看到了很多这样的堆栈跟踪:
Fatal Exception: java.lang.IllegalArgumentException at android.os.Parcel.readException(Parcel.java:1544) at android.os.Parcel.readException(Parcel.java:1493) at android.app.ActivityManagerProxy.isTopOfTask(ActivityManagerNative.java:5108) at android.app.Activity.isTopOfTask(Activity.java:5688) at android.app.Activity.startActivityForResult(Activity.java:3973) at android.support.v4.app.BaseFragmentActivityApi16.startActivityForResult(Source:54) at android.support.v4.app.FragmentActivity.startActivityForResult(Source:67)
我像这样调用它:
ActivityOptions options = ActivityOptions.makeCustomAnimation(activity, R.anim.slide_in_from_right, R.anim.fade_out); startActivityForResult(intent, REQ_ACTION, options.toBundle());
我无法阅读源代码,因为它尚未发布。我甚至尝试替换并使用android-26的代码,但它们是不同的。
对于上述调用,有一个警告说BaseFragmentActivityApi16.startActivityForResult只能从同一库组中调用,所以我通过使用ActivityCompat进行了修复,但我不认为这会解决崩溃问题。
这是一个平台问题还是我可以解决它?
编辑
if (Build.VERSION.SDK_INT >= 21) { ActivityOptions options = ActivityOptions.makeCustomAnimation(activity, R.anim.slide_in_from_right, R.anim.fade_out); startActivityForResult(intent, REQ_ACTION, options.toBundle()); } else { ActivityOptions options = ActivityOptions.makeCustomAnimation(activity, R.anim.slide_in_from_right, R.anim.fade_out); ActivityCompat.startActivityForResult(this, intent, REQ_ACTION, options.toBundle()); }
如果我根据我的评论中的链接更改为上述代码,Android Studio会出现上述的警告。这可能与问题有关。
在API 27中,调用startActivityForResult后发生崩溃的问题可能是由于使用了ActivityOptions而不是ActivityOptionsCompat所导致的。
解决方法是在API 21以下使用ActivityOptionsCompat代替ActivityOptions。
以下是修改后的代码示例:
if (Build.VERSION.SDK_INT >= 21) { ActivityOptions options = ActivityOptions.makeCustomAnimation(activity, R.anim.slide_in_from_right, R.anim.fade_out); startActivityForResult(intent, REQ_ACTION, options.toBundle()); } else { ActivityOptionsCompat options = ActivityOptionsCompat .makeCustomAnimation(activity,R.anim.slide_in_from_right,R.anim.fade_out); ActivityCompat.startActivity(this, intent, options.toBundle()); }
希望这能帮到你。
问题原因:在API 27中,需要使用Activity对象来调用startActivityForResult方法,而不是使用Context对象。如果使用Context对象调用startActivityForResult方法,会导致该方法不存在。
解决方法:如果context是Activity类的实例,需要将其转换为Activity对象后再调用startActivityForResult方法。
Context context = ...; context.startActivityForResult(...); // 这个方法不存在 ((Activity)context).startActivityForResult(...); // 这个方法可以使用
这样做可以消除IDE的警告,但不确定是否能解决崩溃问题。我会等待几天看看结果。我正在使用27.1.0版本,崩溃是在6.0.1版本中发生的。