(四次元新浪微博源代码学习笔记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()上来
当你的程序中某一个Activity A 在运行时中,主动或被动地运行另一个新的Activity B 这个时候A会执行 public void onSaveInstanceState(Bundle outState){}方法。如在AbstractAppActivity中,
该方法将当前主题(白天或夜晚主题)保存了起来。当下一次切换回该Activity时,如果该Activity已经被回收,就调用它的onCreate方法,如果没有被回收,就调用它的onResume方法。onCreate()方法从 savedInstanceState中读我们保存到存储设备中的数据,但是需要判断 savedInstanceState是否为 null。
如果是第一次启动该Activity时并没有数据被存贮在设备中,此时调用SettingUtility.getAppTheme();方法。如果SharedPreferences里没有数据,将默认主题为R.style.AppTheme_Light,否则取出存储的主题。
setTheme方法用来设置主题,需要放在创建任何activity子view之前,一般用法为
forceShowActionBarOverflowMenu是为了解决有实体键无菜单按键时无法显示ActionBar的溢出菜单问题。(ActionBar的溢出菜单默认只在没有实体键只有虚拟按键的时候显示)
在ViewConfiguration.java中,sHasPermanentMenuKey代表是否有实体菜单按键,利用反射机制将其修改为false。
当activity暂停时会调用onPause
当切换回该Activity调用onResume时重新设置当前运行活动的记录。
如果在其他Acitivity里修改了主题的话,会出现当前Activity里保存的theme和SharedPreferences里不一致,需要重新加载
overridePendingTransition(0, 0);的作用是去掉跳转效果。overridePendingTransition 方法必须在startActivity()或者 finish()方法之后立即调用。
因为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()方法之后立即调用。
相关文章推荐
- (四次元新浪微博源代码学习笔记2)SharedPreferences
- (四次元新浪微博源代码学习笔记0)导入源代码
- (四次元新浪微博源代码学习笔记1)全局变量Application
- ApiDemos学习笔记---app---activity
- Java 学习笔记 (3) -抽象类 abstract 接口 interface 内部类 inner class 继承 extends 实现 implements 包 package
- PHP实现源代码学习笔记
- Buffalo 学习笔记- buffalo.js 源代码注释(一)
- Google App Engine学习笔记
- 学习笔记:App-V测试应用程序发布问题
- Android(OPhone) 学习笔记 - Intent和Activity(2)
- Buffalo 学习笔记- buffalo.js 源代码注释(二)
- NetApp DataONTAP核心技术学习笔记(一)
- 数据连接部分通过测试源代码-----java学习笔记之4
- JAVA学习笔记之二控件消息原理之源代码
- Buffalo 学习笔记- buffalo.js 源代码注释(三)
- 学习笔记:App-V测试错误代码4505CD-1690150A-20000194
- [原创]Ruby学习笔记(3)-给源代码加上行号
- Android ExpandableListActivity 学习笔记
- 『框架设计(第2版)CLR Via C#』学习笔记(001)——将源代码编译成托管模块
- OA (ssh) 基本实现(poi 生成 Excel , struts2动态下载 mysql) 学习笔记(含源代码)