您的位置:首页 > 移动开发

(四次元新浪微博源代码学习笔记3)AbstractAppActivity

2014-05-23 16:49 267 查看
上回说到进入了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时,如果该Activity已经被回收,就调用它的onCreate方法,如果没有被回收,就调用它的onResume方法。onCreate()方法从 savedInstanceState中读我们保存到存储设备中的数据,但是需要判断 savedInstanceState是否为 null。

如果是第一次启动该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();
}


overridePendingTransition(0, 0);的作用是去掉跳转效果。overridePendingTransition 方法必须在startActivity()或者 finish()方法之后立即调用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: