标签:android style color java os io strong 数据
Fragment的栈是Fragment管理颇为出彩的一部分,它跟Activity栈的本质差异除了在数据结构上和逻辑上的不同之外,主要区别还在于:
1.Fragment管理是在进程空间内的
2.Fragment的管理一般情况下是一个Window下进行的。
Fragment的管理在一个进程空间内是比较好理解的,因为我们知道Activity的管理其实相对复杂,它的管理是通过IPC调用,IPC的一端是我们的Client,而作为Server的是Ams服务。Activity的管理是基于Window的,而Fragment的管理普遍是基于同一个window下的View来实现的。在我看来,Fragment管理无疑是Android的福音,因为它更轻量级,相对更快。而且这种Fragment注册也可以不通过注册AndroidManifest.xml的方式来实现,意味着你可以实现一个非常好的插件系统。
或许各位看官还不理解,为何子墨兄为何要在开篇如此浓墨重彩,那是因为子墨希望大家尽量的将代码结构往Fragment管理上靠。当然我还是习惯性的提醒各位,Fragment不是View,不是控件,不要用View的观点去看待它,它就是一个容器,比Activity轻量级的容器。
我们回到本章的课题,Fragment的栈管理,或许你还不能很直观的了解什么是Fragment栈,我们引入一段代码:
FragmentTransaction ft = this.getSupportFragmentManager().beginTransaction();
fragment = new TestFragment1();
ft.add(R.id.fragmentContainer, fragment, "test");
ft.setTransition( FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
<span style="color:#ff0000;"><strong>ft.addToBackStack("test");</strong></span>
ft.commitAllowingStateLoss();<pre name="code" class="java">android.support.v4.app.FragmentManager:
@Override
public boolean popBackStackImmediate() {
checkStateLoss();
executePendingTransactions();
return popBackStackState(mActivity.mHandler, null, -1, 0);
}android.support.v4.app.BackStackRecord:
public void popFromBackStack(boolean doStateMove) {
...
switch (op.cmd) {
<span style="color:#ff0000;">case OP_ADD</span>: {
Fragment f = op.fragment;
f.mNextAnim = op.popExitAnim;
<span style="color:#cc0000;">mManager.removeFragment</span>(f,
FragmentManagerImpl.reverseTransit(mTransition),
mTransitionStyle);
}
}boolean popBackStackState(Handler handler, String name, int id, int flags) {
if (mBackStack == null) {
return false;
}
if (name == null && id < 0 && (flags & POP_BACK_STACK_INCLUSIVE) == 0) {
<span style="color:#3366ff;"> int last = mBackStack.size() - 1;
if (last < 0) {
return false;
}
final BackStackRecord bss = mBackStack.remove(last);
bss.popFromBackStack(true);
reportBackStackChanged();</span>
} else {
<span style="color:#ff0000;">int index = -1;
if (name != null || id >= 0) {
// If a name or ID is specified, look for that place in
// the stack.
index = mBackStack.size() - 1;
while (index >= 0) {
BackStackRecord bss = mBackStack.get(index);
if (name != null && name.equals(bss.getName())) {
break;
}
if (id >= 0 && id == bss.mIndex) {
break;
}
index--;
}
if (index < 0) {
return false;
}
if ((flags & POP_BACK_STACK_INCLUSIVE) != 0) {
index--;
// Consume all following entries that match.
while (index >= 0) {
BackStackRecord bss = mBackStack.get(index);
if ((name != null && name.equals(bss.getName()))
|| (id >= 0 && id == bss.mIndex)) {
index--;
continue;
}
break;
}
}
}
if (index == mBackStack.size() - 1) {
return false;
}
final ArrayList<BackStackRecord> states = new ArrayList<BackStackRecord>();
for (int i = mBackStack.size() - 1; i > index; i--) {
states.add(mBackStack.remove(i));
}
final int LAST = states.size() - 1;
for (int i = 0; i <= LAST; i++) {
states.get(i).popFromBackStack(i == LAST);
}
reportBackStackChanged();</span>
}
return true;
}if (v == view1) {
FragmentTransaction ft = this.getSupportFragmentManager().beginTransaction();
fragment = new TestFragment1();
ft.add(R.id.fragmentContainer, fragment, "test");
ft.setTransition( FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
<strong><span style="color:#ff0000;">ft.addToBackStack("test"+index);</span></strong>
ft.commitAllowingStateLoss();
index ++;
} else {
this.getSupportFragmentManager().popBackStack("test2", FragmentManager.POP_BACK_STACK_INCLUSIVE);
}好了,文章写到这里,相信你对Fragment的Stack的管理有了一个基本的认识,但是我们还是没有涉及Fragment如何加入Stack的问题。我们回调BackStackRecord的addToStack方法:
public FragmentTransaction addToBackStack(String name) {
if (!mAllowAddToBackStack) {
throw new IllegalStateException(
"This FragmentTransaction is not allowed to be added to the back stack.");
}
mAddToBackStack = true;
mName = name;
return this;
}这里,BackStackRecord对mAddToBackStack被设置为true.在Commit的时候会分配一个index号码:
int commitInternal(boolean allowStateLoss) {
if (mCommitted)
throw new IllegalStateException("commit already called");
mCommitted = true;
if (mAddToBackStack) {
mIndex = mManager.<strong><span style="color:#33cc00;">allocBackStackIndex</span></strong>(this);
} else {
mIndex = -1;
}
mManager.enqueueAction(this, allowStateLoss);
return mIndex;
}public int allocBackStackIndex(BackStackRecord bse) {
synchronized (this) {
if (<strong>mAvailBackStackIndices</strong> == null
|| mAvailBackStackIndices.size() <= 0) {
if (mBackStackIndices == null) {
mBackStackIndices = new ArrayList<BackStackRecord>();
}
int index = <strong>mBackStackIndices</strong>.size();
mBackStackIndices.add(bse);
return index;
} else {
int index = mAvailBackStackIndices
.remove(mAvailBackStackIndices.size() - 1);
mBackStackIndices.set(index, bse);
return index;
}
}
}
[Android]Fragment源码分析(肆) Fragment栈管理,布布扣,bubuko.com
[Android]Fragment源码分析(肆) Fragment栈管理
标签:android style color java os io strong 数据
原文地址:http://blog.csdn.net/hello__zero/article/details/38490439