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

1.继承关系
[java] view plain copy print ?
- public final class Gallery extends AbstractGalleryActivity implements OnCancelListener
public final class Gallery extends AbstractGalleryActivity implements OnCancelListener
重点是父类AbstractGalleryActivity做了哪些通用的事情,后文再作分析。
2. onCreate()
[java] view plain copy print ?
- protected void onCreate(Bundle savedInstanceState) {
-
- super.onCreate(savedInstanceState);
- requestWindowFeature(Window.FEATURE_ACTION_BAR);
- requestWindowFeature(Window.FEATURE_ACTION_BAR_OVERLAY);
-
- if (getIntent().getBooleanExtra(KEY_DISMISS_KEYGUARD, false)) {
- getWindow().addFlags(
- WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
- }
-
- setContentView(R.layout.main);
- mDisplayManager = (DisplayManager)getSystemService(Context.DISPLAY_SERVICE);
-
- if (savedInstanceState != null) {
- getStateManager().restoreFromState(savedInstanceState);
- } else {
- initializeByIntent();
- }
-
- }
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()
[java] view plain copy print ?
- 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();
- }
- }
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()
[java] view plain copy print ?
- 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);
- }
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()
[java] view plain copy print ?
- public void startState(Class<? extends ActivityState> klass,
- 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();
- }
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中去寻找。