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

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


1.继承关系

  1. public final class Gallery extends AbstractGalleryActivity implements OnCancelListener   
public final class Gallery extends AbstractGalleryActivity implements OnCancelListener 

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

2. onCreate()

  1. protected void onCreate(Bundle savedInstanceState) {  
  2.   
  3.     super.onCreate(savedInstanceState);  
  4.     requestWindowFeature(Window.FEATURE_ACTION_BAR);  
  5.     requestWindowFeature(Window.FEATURE_ACTION_BAR_OVERLAY);//前文提到要使用ActionBar的覆盖模式需要在主题中进行设置,但是我在manifest的该activity使用的主题中并没有发现该设置,原来在这里进行的设置,效果等同。   
  6.   
  7.     if (getIntent().getBooleanExtra(KEY_DISMISS_KEYGUARD, false)) {  
  8.         getWindow().addFlags(  
  9.                 WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);//解除锁屏,我们可以在setContentView加上这句,即可在启动这个activity的之前先解除锁屏。   
  10.     }  
  11.   
  12.     setContentView(R.layout.main);  
  13.     mDisplayManager = (DisplayManager)getSystemService(Context.DISPLAY_SERVICE);//Android4.2新加入的一个服务,与之相关的类是Display。它的作用是实现本地设备在远程显示器上的镜像显示。可以理解一个Display代表一个显示屏。   
  14.   
  15.     if (savedInstanceState != null) {  
  16.         getStateManager().restoreFromState(savedInstanceState);  
  17.     } else {  
  18.         initializeByIntent();  
  19.     }  
  20.   
  21. }  
    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()

  1. private void initializeByIntent() {  
  2.     Intent intent = getIntent();  
  3.     String action = intent.getAction();  
  4.   
  5.     if (Intent.ACTION_GET_CONTENT.equalsIgnoreCase(action)) {  
  6.         startGetContent(intent);  
  7.     } else if (Intent.ACTION_PICK.equalsIgnoreCase(action)) {  
  8.          ...  
  9.         startGetContent(intent);  
  10.     } else if (Intent.ACTION_VIEW.equalsIgnoreCase(action)  
  11.             || ACTION_REVIEW.equalsIgnoreCase(action)){  
  12.         startViewAction(intent);  
  13.     } else {  
  14.         startDefaultPage();  
  15.     }  
  16. }  
    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()

  1. private void startGetContent(Intent intent) {  
  2.     Bundle data = intent.getExtras() != null  
  3.             ? new Bundle(intent.getExtras())  
  4.             : new Bundle();  
  5.     data.putBoolean(KEY_GET_CONTENT, true);  
  6.     int typeBits = GalleryUtils.determineTypeBits(this, intent);  
  7.     data.putInt(KEY_TYPE_BITS, typeBits);  
  8.     data.putString(AlbumSetPage.KEY_MEDIA_PATH,  
  9.             getDataManager().getTopSetPath(typeBits));  
  10.     getStateManager().startState(AlbumSetPage.class, data);  
  11. }  
    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()

  1. public void startState(Class<? extends ActivityState> klass,//需要保存到管理栈中的类都需要继承ActivityState   
  2.         Bundle data) {  
  3.     Log.v(TAG, "startState " + klass);  
  4.     ActivityState state = null;  
  5.     try {  
  6.         state = klass.newInstance();//反射机制获取类的实例   
  7.     } catch (Exception e) {  
  8.         throw new AssertionError(e);  
  9.     }  
  10.     if (!mStack.isEmpty()) {  
  11.         ActivityState top = getTopState();  
  12.         top.transitionOnNextPause(top.getClass(), klass,  
  13.                 StateTransitionAnimation.Transition.Incoming);  
  14.         if (mIsResumed) top.onPause();  
  15.     }  
  16.     state.initialize(mActivity, data);  
  17.   
  18.     mStack.push(new StateEntry(data, state));  
  19.     state.onCreate(data, null);  
  20.     if (mIsResumed) state.resume();  
  21. }  
    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中去寻找。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值