Ben*_* P. 14 android android-fragments android-activity android-fragmentactivity fragmentmanager
几年前,当我尝试FragmentTransaction在onActivityResult()回调中提交内容时,我在我的一个应用程序中遇到了问题.谷歌搜索,我发现这个问题和答案,说
在
onActivityResult()调用时,活动/片段的状态可能尚未恢复,因此在此期间发生的任何事务都将丢失.
我最终采用了相同答案推荐的解决方案来应用我的应用程序,生活很美好.然而,最近的实验表明,事情可能已经发生了变化,现在从内部投入可能是安全的.FragmentTransactiononActivityResult()
(支持v4)的文档FragmentManager.beginTransaction()将事务的安全窗口定义为:
注意:只能在活动保存其状态之前创建/提交片段事务.如果您尝试在之后
FragmentActivity.onSaveInstanceState()(以及之后FragmentActivity.onStart或之前)提交事务FragmentActivity.onResume(),您将收到错误.
阅读文档onActivityResult(),我明白了
您将在
onResume()重新启动活动之前立即收到此电话.
这使我相信执行这些事务应该是安全的onActivityResult(),就像onStart()已经被调用的那样,将我置于安全窗口内.
我做了一个应用程序来测试它,我成功地看到了我创建并提交的对话框片段onActivityResult().我有相同的应用程序也记录活动生命周期回调,所以我可以检查他们的订单onStart(),然后onRestoreInstanceState(),我看到,然后onActivityResult()每次.
我错过了什么吗?或者框架已更改,onActivityResult()现在保证是片段交易的安全位置?此行为是否因API级别而异?
我发现了另一个问题和答案似乎与我的文档相同,但两者都超过一年,并没有特别指的是onActivityResult()交易的安全场所.
azi*_*ian 19
有点潜入消息来源
在FragmentManager类中有一个布尔变量,称为mStatedSaved.此变量根据活动的生命周期回调跟踪已保存的状态.这是方法,抛出众所周知的异常:
private void checkStateLoss() {
if (mStateSaved) {
throw new IllegalStateException(
"Can not perform this action after onSaveInstanceState");
}
...
}
这意味着,只要将此变量更改为false,就可以自由执行片段事务.true当保存活动的状态时,该变量将变为,即onSaveInstanceState().
回到问题
你说,以前你在提交交易时遇到了问题onActivityResult().这应该意味着,以前mStateSaved没有分配false,目前它是.事实上是这样的.
这是onActivityResult()O版本的实现:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
mFragments.noteStateNotSaved();
...
}
在哪里,noteStateNotSaved()会做以下:
public void noteStateNotSaved() {
...
mStateSaved = false;
...
}
相反,你可以看到onActivityResult()Jelly Bean发布的实现:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
int index = requestCode>>16;
if (index != 0) {
index--;
if (mFragments.mActive == null || index = mFragments.mActive.size()) {
Log.w(TAG, "Activity result fragment index out of range: 0x"
+ Integer.toHexString(requestCode));
return;
}
Fragment frag = mFragments.mActive.get(index);
if (frag == null) {
Log.w(TAG, "Activity result no fragment exists for index: 0x"
+ Integer.toHexString(requestCode));
} else {
frag.onActivityResult(requestCode&0xffff, resultCode, data);
}
return;
}
super.onActivityResult(requestCode, resultCode, data);
}
没有什么会改变mStateSaved字段的值,如果提交了事务,则会抛出异常.
实际上,该系列mFragments.noteStateNotSaved() 是在Kit-Kat发布中引入的.正如您在Dianne Hackborn 提交的评论中所看到的:
ActivityFragment应该清除接收时保存状态的标志
onNewIntent().这可能会在活动恢复之前发生,因此我们可能尚未清除它.还需要做同样的事情onActivityResult().
总结
是
onActivityResult()目前保证是片段交易安全的地方?
假设您正在使用包含提交4ccc001的源,这是在2012年10月制作的 - 是的,它是片段事务的安全位置.
| 归档时间: |
|
| 查看次数: |
739 次 |
| 最近记录: |