Android4.2.2 Gallery2源码分析(3)——分析Gallery.java

我现在的目的是找出那个相册视图为什么是空的,也就是(1)中提到的第三个疑点。下图的这个视图是在什么地方形成的。


1.继承关系

public final class Gallery extends AbstractGalleryActivity implements OnCancelListener 

重点是父类AbstractGalleryActivity做了哪些通用的事情,后文再作分析。

2. onCreate()

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_ACTION_BAR);
        requestWindowFeature(Window.FEATURE_ACTION_BAR_OVERLAY);//前文提到要使用ActionBar的覆盖模式需要在主题中进行设置,但是我在manifest的该activity使用的主题中并没有发现该设置,原来在这里进行的设置,效果等同。

        if (getIntent().getBooleanExtra(KEY_DISMISS_KEYGUARD, false)) {
            getWindow().addFlags(
                    WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);//解除锁屏,我们可以在setContentView加上这句,即可在启动这个activity的之前先解除锁屏。
        }

        setContentView(R.layout.main);
        mDisplayManager = (DisplayManager)getSystemService(Context.DISPLAY_SERVICE);//Android4.2新加入的一个服务,与之相关的类是Display。它的作用是实现本地设备在远程显示器上的镜像显示。可以理解一个Display代表一个显示屏。

        if (savedInstanceState != null) {
            getStateManager().restoreFromState(savedInstanceState);
        } else {
            initializeByIntent();
        }

    }
乍看之下,onCreate()并没有作比较特殊的处理,它的作用只是基本上只是加载了GLRootView这个视图,难道疑点三在这个视图中吗,但(1)中提到GLRootView中并没有显示任何内容,不管如何,暂且记下,先继续往下分析源码。
我们分析下onCreate()中最后的那个initializeByIntent(),Java函数的名字对它的功能往往有很强的概括性,这个函数名字的意思是由Intent进行初始化,难道我们要寻求的答案在这里,每次相册里内容不同,列表中显示的内容不一样,这视乎也很符合这个名字。


2.1.initializeByIntent()

    private void initializeByIntent() {
        Intent intent = getIntent();
        String action = intent.getAction();

        if (Intent.ACTION_GET_CONTENT.equalsIgnoreCase(action)) {
            startGetContent(intent);
        } else if (Intent.ACTION_PICK.equalsIgnoreCase(action)) {
             ...
            startGetContent(intent);
        } else if (Intent.ACTION_VIEW.equalsIgnoreCase(action)
                || ACTION_REVIEW.equalsIgnoreCase(action)){
            startViewAction(intent);
        } else {
            startDefaultPage();
        }
    }

很明显的,我们还需要察看几个条件语句里调用的函数:

2.2.startGetContent()

    private void startGetContent(Intent intent) {
        Bundle data = intent.getExtras() != null
                ? new Bundle(intent.getExtras())
                : new Bundle();
        data.putBoolean(KEY_GET_CONTENT, true);
        int typeBits = GalleryUtils.determineTypeBits(this, intent);
        data.putInt(KEY_TYPE_BITS, typeBits);
        data.putString(AlbumSetPage.KEY_MEDIA_PATH,
                getDataManager().getTopSetPath(typeBits));
        getStateManager().startState(AlbumSetPage.class, data);
    }

这段代码里,Bundle数据data中放入了比较多的内容,而Bundle正是Android设计用来在系统组件之间传递数据的。因此这段代码最主要的是分析最后一个startState()函数,事实上我们发现3中的startViewAction()和startDefaultPage()中最主要要分析的也是这个函数。

2.3.startState()

    public void startState(Class<? extends ActivityState> klass,//需要保存到管理栈中的类都需要继承ActivityState
            Bundle data) {
        Log.v(TAG, "startState " + klass);
        ActivityState state = null;
        try {
            state = klass.newInstance();//反射机制获取类的实例
        } catch (Exception e) {
            throw new AssertionError(e);
        }
        if (!mStack.isEmpty()) {
            ActivityState top = getTopState();
            top.transitionOnNextPause(top.getClass(), klass,
                    StateTransitionAnimation.Transition.Incoming);
            if (mIsResumed) top.onPause();
        }
        state.initialize(mActivity, data);

        mStack.push(new StateEntry(data, state));
        state.onCreate(data, null);
        if (mIsResumed) state.resume();
    }

startState()是StateManager类中的一个函数,简单分析StateManager和StateActivity源码,可以发现StateManager通过传递进来的Bundle数据是管理Gallery里所有继承自AbstractGalleryActivity(Gllery的父类)的Activity的显示状态,即是否显示控制条等。有时间的话可以具体分析一下StateManager和StateActivity类了解Gallery中的这个管理Activity的方法。

onCreate()分析到这里,似乎没有发现什么线索。这时候我突然意识到分析似乎偏离了初衷,静下心来,以往分析布局,寻找布局都是在onCreate()中的setContentView(R.layout....)找到的线索,既然已经找到了main.xml也找到了GLRootView。对布局到底是如何呈现的依然需要回归到GLRootView.java中去寻找。


你可能感兴趣的:(源码,android,gallery)