Android 基于 ActivityGroup 实现多 Activity 容器切换
一、界面布局
我们利用 RadioGroup 作为导航控件,每个选项可以设计为图片形式。点击对应的 RadioButton 时,主容器内会动态加载并显示不同的 Activity 视图。布局中包含一个用于承载子 Activity 的视图容器(View Container)。
二、核心逻辑实现
后台逻辑封装在一个继承自 ActivityGroup 的抽象类中。该类负责管理本地活动管理器(LocalActivityManager),并通过容器视图来切换显示的 Activity。
1. 初始化与启动
在 onCreate 中获取本地活动管理器实例:
public abstract class StackActivityGroup extends ActivityGroup {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mManager = getLocalActivityManager();
}
}
2. 启动子 Activity
通过重载的方法支持传入 Class 或 Intent 对象。这里需要注意 Intent 标志位的设置,特别是涉及消息实体时的清除栈策略。
public void startSubActivity(Class<?> which, Bundle param) {
Intent intent = new Intent();
intent.setClassName(this.getPackageName(), which.getName());
Log.i("main1", this.getPackageName()); // 例如 com.icson
Log.i("main1", which.getName()); // 例如 com.icson.home.HomeActivity
if (param != null) {
intent.putExtras(param);
// message must clear_top otherwise will not call onNewIntent
(param.containsKey(MsgEntity.SERIAL_NAME_MSGENTITY)) {
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
}
}
startSubActivity(intent);
}
{
intent.getComponent().getClassName();
(mContainer == ) {
mContainer = getContainer();
}
mManager.startActivity(strClassName, intent).getDecorView();
( != pDecorView && != mContainer) {
mContainer.removeAllViews();
mContainer.addView(pDecorView);
}
}

