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

上回说到进入了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()方法之后立即调用。

你可能感兴趣的:(新浪微博,Actionbar)