Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android平台Gallery2應用分析(三)---StateManager和AbstractGalleryActivity

Android平台Gallery2應用分析(三)---StateManager和AbstractGalleryActivity

編輯:關於Android編程

StateManager

StateManager中有個Stack mStack,類似於ActivityManager中的ActivityStack。用於控制相冊界面的窗口堆棧管理,成員為StateEntry類。再看startState這個函數:

    public void startState(Class klass,
            Bundle data) {
        Log.v(TAG, "startState " + klass);
        ActivityState state = null;
        try {
            // 用窗口類創建一個ActivityState實例
            state = klass.newInstance();
        } catch (Exception e) {
            throw new AssertionError(e);
        }
        // 堆棧非空
        if (!mStack.isEmpty()) {
             // 獲取棧頂ActivityState
            ActivityState top = getTopState();
            top.transitionOnNextPause(top.getClass(), klass,
                    StateTransitionAnimation.Transition.Incoming);
            // 調用棧頂ActivityState的onPause
            if (mIsResumed) top.onPause();
        }
        // 初始化當前的ActivityState,這個和startActivity非常相似
        state.initialize(mActivity, data);
        // 初始化後入棧
        mStack.push(new StateEntry(data, state));

        Log.d(TAG, "startState: startState->onCreate");
        // 調用新ActivityState實例的onCreate,這個和startActivity的流程又好相似
        state.onCreate(data, null);
        Log.d(TAG, "startState: startState->resume");
        // 調用新ActivityState實例的onResume
        if (mIsResumed) state.resume();
}
可以說這個函數和啟動應用activity的流程非常相似,只是簡化了流程而已。另外,startStateForResult也和startActivityForResult類似。

AbstractGalleryActivity 在介紹AlbumSetPage、AlbumPage、PhotoPage等頁面前,必須先介紹AbstractGalleryActivity,因為以上三個頁面的父類ActivityState中有成員變量AbstractGalleryActivity mActivity。相冊的Activity實際上只有一個,可以說就是這個mActivity,通過StateManager和DataManager來控制顯示不同的頁面。
繼承自Activity,其中有幾個重要成員:GLRootView mGLRootView,StateManager mStateManager,DataManager,GalleryActionBar mActionBar,OrientationManager mOrientationManager。
其中GalleryActionBar就是相冊各個界面頂部的ActionBar控件。按照Activity的生命周期,在onCreate中創建OrientationManager對象賦予mOrientationManager,調用toggleStatusBarByOrientation在屏幕橫豎屏時對window的全屏標記做增加和清除。

    // Shows status bar in portrait view, hide in landscape view
    private void toggleStatusBarByOrientation() {
        if (mDisableToggleStatusBar) return;

        Window win = getWindow();
        if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
            win.clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
        } else {
            win.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
        }
    }
在setContentView()中加載GLRootView。在onStart()中注冊AlertDialog的onClick處理。在onResume(),onPause()中都會分別對StateManager,DataManager做對應的onResume, onPause操作。例如:

    @Override
    protected void onResume() {
        super.onResume();
        mGLRootView.lockRenderThread();
        try {
            getStateManager().resume();
            getDataManager().resume();
        } finally {
            mGLRootView.unlockRenderThread();
        }
        mGLRootView.onResume();
        mOrientationManager.resume();
    }
其中 mGLRootView會調用 lockRenderThread(),在執行完xxx.resume()後會再調用unlockRenderThread()。下面是GLRootView的lockXXX()和unlockXXX()函數。

    @Override
    public void lockRenderThread() {
        mRenderLock.lock();
    }

    @Override
    public void unlockRenderThread() {
        mRenderLock.unlock();
    }
其中 mRenderLock是ReentrantLock對象。那麼ReentrantLock(可重入鎖)的作用是什麼?
因為Gallery的每個頁面AlbumSet、AlbumPage、PhotoPage、PhotoView都是同一個Activity,界面的控制是通過StateManager以及DataManager,切換進入每個狀態頁面,都會獲取不同的GLRootView,所以必須保證GLRootView是鎖定情況下,才能對StateManager以及DataManager做處理。

歡迎轉載和技術交流,轉載請幫忙注明出處,http://blog.csdn.net/discovery_by_joseph,謝謝!

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved