1. 简述
单Activity、多Fragment架构可以保证App具有极高的流畅度,因为通过多个Fragment切换实现页面跳转的代价远低于通过多个Activity切换实现页面跳转的代价。这里使用一个统一的Activity来管理多个Fragment。
为了提高开发效率,降低出错概率,我选择集成非常流行的Fragmentation库来处理有关Fragment的事务。
2. 唯一的主Activity的父类
ProxyActivity实现Fragmentation提供的ISupportActivity接口,作为所有Fragment的容器。ProxyActivity类是抽象类。App中唯一的Activity将继承自ProxyActivity。
import android.annotation.SuppressLint;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.ContentFrameLayout;
import com.qilu.core.R;
import com.qilu.core.delegates.QiluDelegate;
import me.yokeyword.fragmentation.ExtraTransaction;
import me.yokeyword.fragmentation.ISupportActivity;
import me.yokeyword.fragmentation.SupportActivityDelegate;
import me.yokeyword.fragmentation.anim.DefaultHorizontalAnimator;
import me.yokeyword.fragmentation.anim.FragmentAnimator;
public abstract class ProxyActivity extends AppCompatActivity implements ISupportActivity {
private final SupportActivityDelegate DELEGATE = new SupportActivityDelegate(this);
public abstract QiluDelegate setRootDelegate();
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
DELEGATE.onCreate(savedInstanceState);
initContainer(savedInstanceState);
}
private void initContainer(@Nullable Bundle savedInstanceState) {
@SuppressLint("RestrictedApi")
final ContentFrameLayout container = new ContentFrameLayout(this);
container.setId(R.id.delegate_container);
setContentView(container);
if (savedInstanceState == null) {
DELEGATE.loadRootFragment(R.id.delegate_container, setRootDelegate());
}
}
@Override
protected void onDestroy() {
DELEGATE.onDestroy();
super.onDestroy();
System.gc();
System.runFinalization();
}
@Override
public SupportActivityDelegate getSupportDelegate() {
return DELEGATE;
}
@Override
public ExtraTransaction extraTransaction() {
return DELEGATE.extraTransaction();
}
@Override
public FragmentAnimator getFragmentAnimator() {
return DELEGATE.getFragmentAnimator();
}
@Override
public void setFragmentAnimator(FragmentAnimator fragmentAnimator) {
DELEGATE.setFragmentAnimator(new DefaultHorizontalAnimator());
}
@Override
public FragmentAnimator onCreateFragmentAnimator() {
return DELEGATE.onCreateFragmentAnimator();
}
@Override
public void onBackPressedSupport() {
DELEGATE.onBackPressedSupport();
}
@Override
public void onBackPressed() {
DELEGATE.o