上一篇《淘宝Atlas框架初探atlas-core(一)》我们研究了淘宝模块化apk:bundle体系,还有bundle体系配套的hook体系。
本篇我们继续研究一下atlas框架的四大组件插件化。
第一篇的分析中我们了解到bundle体系已经为组件的插件化做了准备。下面我们看atlas如何运用bundle机制动态完成bundle的加载,我们看AtlasDemo MainActivity怎么做的。
private ActivityGroupDelegate mActivityDelegate;
private ViewGroup mActivityGroupContainer;
private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener
= new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.navigation_home:
switchToActivity("home","com.taobao.firstbundle.FirstBundleActivity");
return true;
case R.id.navigation_dashboard:
switchToActivity("second","com.taobao.secondbundle.SecondBundleActivity");
return true;
case R.id.navigation_notifications:
return true;
}
return false;
}
};
public void switchToActivity(String key,String activityName){
Intent intent = new Intent();
intent.setClassName(getBaseContext(),activityName);
mActivityDelegate.startChildActivity(mActivityGroupContainer,key,intent);
}
MainActivity通过ActivityGroupDelegate的startChildActivity实现Bundle的切换
public void startChildActivity(ViewGroup container, String key, Intent intent){
//移除内容部分全部的View
container.removeAllViews();
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
Activity contentActivity = mLocalActivityManager.getActivity(key);
if(contentActivity!=null) {
container.addView(
mLocalActivityManager.getActivity(key)
.getWindow().getDecorView(),
new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT));
mLocalActivityManager.switchToChildActivity(key);
}else{
execStartChildAc