上回说到进入了AbstractAppActivity,它继承了FragmentActivity
因为android3.0 之前没有Fragment,所以引入了FragmentActivity,需要导入android.support.v4包,FragmentActivity里使用的是android.support.v4.app.Fragment。3.0之后可以直接继承Activity并使用fragment(android.app.Fragment)。
管理Fragment时,FragmentActivity调用的是getSupportFragmentManager()方法,而Activity调用的是getFragmentManager()方法。
添加Fragment示例: getSupportFragmentManager().beginTransaction().add(R.id.fragment_container,firstFragment).commit();
回到AbstractAppActivity的onCreate()上来
@Override protected void onCreate(Bundle savedInstanceState) { if (savedInstanceState == null) { theme = SettingUtility.getAppTheme();//SharedPreferences里没有数据时默认主题为R.style.AppTheme_Light } else { theme = savedInstanceState.getInt("theme"); } setTheme(theme); super.onCreate(savedInstanceState); forceShowActionBarOverflowMenu(); initNFC(); GlobalContext.getInstance().setActivity(this); }
当你的程序中某一个Activity A 在运行时中,主动或被动地运行另一个新的Activity B 这个时候A会执行 public void onSaveInstanceState(Bundle outState){}方法。如在AbstractAppActivity中,
@Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putInt("theme", theme); }
如果是第一次启动该Activity时并没有数据被存贮在设备中,此时调用SettingUtility.getAppTheme();方法。如果SharedPreferences里没有数据,将默认主题为R.style.AppTheme_Light,否则取出存储的主题。
setTheme方法用来设置主题,需要放在创建任何activity子view之前,一般用法为
onCreate { super.onCreate(); setTheme(); setContentView(); }
forceShowActionBarOverflowMenu是为了解决有实体键无菜单按键时无法显示ActionBar的溢出菜单问题。(ActionBar的溢出菜单默认只在没有实体键只有虚拟按键的时候显示)
在ViewConfiguration.java中,sHasPermanentMenuKey代表是否有实体菜单按键,利用反射机制将其修改为false。
private void forceShowActionBarOverflowMenu() { try { ViewConfiguration config = ViewConfiguration.get(this); Field menuKeyField = ViewConfiguration.class.getDeclaredField("sHasPermanentMenuKey"); if (menuKeyField != null) { menuKeyField.setAccessible(true); menuKeyField.setBoolean(config, false); } } catch (Exception ignored) { } }
当activity暂停时会调用onPause
@Override protected void onPause() { super.onPause(); if (GlobalContext.getInstance().getCurrentRunningActivity() == this) { GlobalContext.getInstance().setCurrentRunningActivity(null); } }该函数清除了GlobalContext中当前运行活动的记录。
当切换回该Activity调用onResume时重新设置当前运行活动的记录。
@Override protected void onResume() { super.onResume(); GlobalContext.getInstance().setCurrentRunningActivity(this); if (theme != SettingUtility.getAppTheme()) { reload(); } }
如果在其他Acitivity里修改了主题的话,会出现当前Activity里保存的theme和SharedPreferences里不一致,需要重新加载
private void reload() { Intent intent = getIntent(); overridePendingTransition(0, 0); intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); finish(); overridePendingTransition(0, 0); startActivity(intent); TimeLineBitmapDownloader.refreshThemePictureBackground(); }