现在的位置: 首页 > 综合 > 正文

Gallery3d 学习笔记(15)

2013年06月05日 ⁄ 综合 ⁄ 共 4425字 ⁄ 字号 评论关闭

上次讲到了StateManager如何用工厂模式创建出很多Page,然后将这些Page放在一个栈里面管理

 

我们先看下所有Page的父类

 

abstract public class ActivityState {
    public static final int FLAG_HIDE_ACTION_BAR = 1;
    public static final int FLAG_HIDE_STATUS_BAR = 2;
    public static final int FLAG_SCREEN_ON = 3;

    private static final int SCREEN_ON_FLAGS = (
              WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
            | WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON
            | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
        );

    protected GalleryActivity mActivity;
    protected Bundle mData;
    protected int mFlags;

    protected ResultEntry mReceivedResults;
    protected ResultEntry mResult;

    protected static class ResultEntry {
        public int requestCode;
        public int resultCode = Activity.RESULT_CANCELED;
        public Intent resultData;
        ResultEntry next;
    }

    private boolean mDestroyed = false;
    
    private boolean mPlugged = false;
    
    protected ActivityState() {
    }

    protected void setContentPane(GLView content) {
        mActivity.getGLRoot().setContentPane(content);
    }

    void initialize(GalleryActivity activity, Bundle data) {
        mActivity = activity;
        mData = data;
    }

    public Bundle getData() {
        return mData;
    }

    protected void onBackPressed() {
        mActivity.getStateManager().finishState(this);
    }

    protected void setStateResult(int resultCode, Intent data) {
        if (mResult == null) return;
        mResult.resultCode = resultCode;
        mResult.resultData = data;
    }

    protected void onConfigurationChanged(Configuration config) {
    }

    protected void onSaveState(Bundle outState) {
    }

    protected void onStateResult(int requestCode, int resultCode, Intent data) {
    }

    protected void onCreate(Bundle data, Bundle storedState) {
    }

    BroadcastReceiver mPowerIntentReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            final String action = intent.getAction();
            if (Intent.ACTION_BATTERY_CHANGED.equals(action)) {
                boolean plugged = (0 != intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, 0));

                if (plugged != mPlugged) {
                    mPlugged = plugged;
                    final Window win = ((Activity) mActivity).getWindow();
                    final WindowManager.LayoutParams params = win.getAttributes();
                    setScreenOnFlags(params);
                    win.setAttributes(params);
                }
            }
        }
    };

    void setScreenOnFlags(WindowManager.LayoutParams params) {
        if (mPlugged && 0 != (mFlags & FLAG_SCREEN_ON)) {
            params.flags |= SCREEN_ON_FLAGS;
        } else {
            params.flags &= ~SCREEN_ON_FLAGS;
        }
    }
    
    void setScreenOn() {
	        final Window win = ((Activity) mActivity).getWindow();
	        final WindowManager.LayoutParams params = win.getAttributes();
	        params.flags |= WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD;
	        win.setAttributes(params);
    }

    protected void onPause() {
        if (0 != (mFlags & FLAG_SCREEN_ON)) {
            ((Activity) mActivity).unregisterReceiver(mPowerIntentReceiver);
        }
    }

    // should only be called by StateManager
    void resume() {
        Activity activity = (Activity) mActivity;
        ActionBar actionBar = activity.getActionBar();
        if (actionBar != null) {
            if ((mFlags & FLAG_HIDE_ACTION_BAR) != 0) {
                actionBar.hide();
            } else {
                actionBar.show();
            }
            int stateCount = mActivity.getStateManager().getStateCount();
            actionBar.setDisplayOptions(
                    stateCount == 1 ? 0 : ActionBar.DISPLAY_HOME_AS_UP,
                    ActionBar.DISPLAY_HOME_AS_UP);
            actionBar.setHomeButtonEnabled(true);
        }

        activity.invalidateOptionsMenu();

        final Window win = activity.getWindow();
        final WindowManager.LayoutParams params = win.getAttributes();

        if ((mFlags & FLAG_HIDE_STATUS_BAR) != 0) {
            params.systemUiVisibility = View.SYSTEM_UI_FLAG_LOW_PROFILE;
        } else {
            params.systemUiVisibility = View.SYSTEM_UI_FLAG_VISIBLE;
        }

        setScreenOnFlags(params);
        win.setAttributes(params);

        ResultEntry entry = mReceivedResults;
        if (entry != null) {
            mReceivedResults = null;
            onStateResult(entry.requestCode, entry.resultCode, entry.resultData);
        }

        if (0 != (mFlags & FLAG_SCREEN_ON)) {
            // we need to know whether the device is plugged in to do this correctly
            final IntentFilter filter = new IntentFilter();
            filter.addAction(Intent.ACTION_BATTERY_CHANGED);
            activity.registerReceiver(mPowerIntentReceiver, filter);
        }
        onResume();
    }

    // a subclass of ActivityState should override the method to resume itself
    protected void onResume() {
    }

    protected boolean onCreateActionBar(Menu menu) {
        // TODO: we should return false if there is no menu to show
        //       this is a workaround for a bug in system
        return true;
    }

    protected boolean onItemSelected(MenuItem item) {
        return false;
    }

    protected void onDestroy() {
        mDestroyed = true;
    }

    boolean isDestroyed() {
        return mDestroyed;
    }

 }

 首先是一个抽象类,没有继承任何父类,说明自己就是鼻祖,我们研究省事了。

 

setContentPane方法把View视图放到Root上。

initialize 初始化Activity和data到成员变量

 

mPowerIntentReceiver 一个接受者,在resume中注册,在onPause反注册

 

怎么是resume?大家要记住,这个类不是Activity类,没有系统来调用onResume,要靠自己内部调用,那么一定有内部的代码调用resume

 

注释里面都写的很清楚了

// should only be called by StateManager

 

那这里弄个receiver是什么意思呢,还是个电量变化的,最后只是设置了窗口的属性SCREEN_ON_FLAGS,这个属性是干啥的呢?

 

原来在Gallary在非常多的图片中可以使用幻灯片模式播放,用户按电源键上锁,重新点亮屏幕后,就会出来讨厌的锁屏,用户又得解锁,为了让点亮屏幕后没有锁屏,就设计了这个receiver,电量在变化时,检查是否插着充电器,如果有,就设置成按电源按键也不上锁,一直播放下去。

抱歉!评论已关闭.