分析整个Android DeskClock的Android Manifest文件之后,从应用程序组件开始分析,当然第一个组件就是Activity之DeskClock。
分析一个Activity,从固定的复写函数入手。
protected void onCreate(Bundle icicle) {
super.onCreate(icicle);
//mIsFirstLaunch = (icicle == null);
//getWindow().setBackgroundDrawable(null);
//mIsFirstLaunch = true;
//首先将选中的TAB直接置为1 即所有的TAB默认显示1
mSelectedTab = CLOCK_TAB_INDEX;
//如果icicle这个参数不是null,则选中的TAB显示为icicle里面带的参数
if (icicle != null) {
mSelectedTab = icicle.getInt(KEY_SELECTED_TAB, CLOCK_TAB_INDEX);
android.util.Log.i("LYG","onCreate mSelectedTab = " + mSelectedTab);
}
// Timer receiver may ask the app to go to the timer fragment if a timer expired
//当设定的计时器期满时,计时器接收者可能会打开计时器的分支
//首先获取intent,如果intent不是空,获取intent携带的EXTRA
//默认选取的值为-1,如果不是默认值,让当前选择的TAB选择为intent中携带的有关TAB信息
Intent i = getIntent();
if (i != null) {
int tab = i.getIntExtra(SELECT_TAB_INTENT_EXTRA, -1);
if (tab != -1) {
mSelectedTab = tab;
}
}
//初始化整个界面
initViews();
//设置家中时区
setHomeTimeZone();
// We need to update the system next alarm time on app startup because the
// user might have clear our data.
//我们需要更新系统下次的闹钟时间在app启动时,因为用户可能会清理掉data
AlarmStateManager.updateNextAlarm(this);
ExtensionsFactory.init(getAssets());
}
关注 initViews();
private void initViews() {
//通过语言判断当前是否需要作出布局调整
int layoutDrection = TextUtils.getLayoutDirectionFromLocale(Locale.getDefault());
if( 1== layoutDrection){
AgoldIsRTL = true;
}else{
AgoldIsRTL = false;
}
//到这里是根据语言判断是不是需要作出左右布局调整的问题
android.util.Log.i("SHN"," AgoldIsRTL = " + AgoldIsRTL);
android.util.Log.i("SHN","################ layoutDrection = " + layoutDrection);
//Actionbar的实例化
//配置新的ActionbarAdapter
//在Adapter上设置Listener
mActionBar = getActionBar();
mActionBarAdapter = new AgoldActionBarAdapter(this, mActionBar,AgoldIsRTL);
mActionBarAdapter.setListener(this);
//创建新的ViewPagerAdapter实例
//创建新的ViewPager实例
//对新的ViewPager实例设置组件id
//初始化ViewPager 以及 ActionBarAdapter ViewPagerAdapter
if(mViewPagerAdapter == null){
mViewPagerAdapter = new ViewPagerAdapter(getFragmentManager());
mViewPager = new ViewPager(this);
mViewPager.setId(R.id.desk_clock_pager);
// Keep all four tabs to minimize jank.
mViewPager.setOffscreenPageLimit(3);
mViewPager.setAdapter(mViewPagerAdapter);
mViewPager.setOnPageChangeListener(mPageChangeListener);
mViewPager.setCurrentItem(mSelectedTab);
mActionBarAdapter.setCurrentTab(mSelectedTab);
mViewPagerAdapter.notifyPageChanged(mSelectedTab);
}
//最后setContentView
setContentView(mViewPager);
}
主页主要是由Action bar ,ViewPager 和FragmentPagerAdapter 三部分组合而成的,通过四个Action bar TAB和抽象过的Fragment由自定义的FragmentPagerAdapter适配器来完成DeskClock中四个主要功能的切换.
在DeskClock被创建的时候会先取得一个ActionBar被选中显示的标识位置,再去初始化Views.这里需要注意的是该ViewPager通过setOffscreenPageLimit方法来设置预加载的Fragment,这里是四个主要的fragment,DeskClock显示一个fragment,再预加载另外3个fragment来提高UI显示的流畅度.
if (mTabsAdapter == null) {
mViewPager = new ViewPager(this);
mViewPager.setId(R.id.desk_clock_pager);
// Keep all four tabs to minimize jank.
mViewPager.setOffscreenPageLimit(3);
mTabsAdapter = new TabsAdapter(this, mViewPager);
createTabs(mSelectedTab);
}
setContentView(mViewPager);