首页 > 编程知识 正文

vue2源码分析,android源码分析

时间:2023-05-04 08:09:47 阅读:217311 作者:4128

我现在的目的是找出那个相册视图为什么是空的,也就是(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()分析到这里,似乎没有发现什么线索。这时候我突然意识到分析似乎偏离了初衷,lcddmt,以往分析布局,寻找布局都是在onCreate()中的setContentView(R.layout....)找到的线索,既然已经找到了main.xml也找到了GLRootView。对布局到底是如何呈现的依然需要回归到GLRootView.java中去寻找。


版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。