您的位置:首页 > 移动开发 > Android开发

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

2013-10-31 13:58 507 查看
我现在的目的是找出那个相册视图为什么是空的,也就是(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中去寻找。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: