11 Gallery 源码-页面ActivityState 和 StateManager 管理
0. 原文拜读
1. 功能介绍
实现Android系统本地存储以及网络存储中的媒体(图片&视频)资源的浏览,媒体信息,显示和更多操作(删除、分享、选择、缩放、编辑等)。
Gallery2界面的生成和普通的应用程序不同,普通应用程序一般就一个界面对应一个activity,搭配布局xml或代码来实现界面的显示,而Gallery2没有用到 Android的UI系统,而是通过openGL画出来,只用到了一个 GalleryActivity。
2. Gallery 页面结构
Gallery2主要由AlbumSetPage, AlbumPage, PhotoPage三个页面组成,它们都继承自ActivityState。ActivityState会在下面描述,实际上可以把ActivityState看作是Gallery2三个页面中的其中一个Activity状态,也可以理解成当前Activity以哪种界面显示。 一般我们见到的程序窗口,大多是用Actiivty来实现的,而Gallery2中,实际上只有一个Activity,叫AbstractGalleryActivity,Gallery2通过ActivityState和StateManager来实现三个页面在同一个Activity中显示和切换。
3. 界面-ActivityState
Gallery2中定义了ActivityState这样一个抽象类,表示一个页面的状态,或者可以理解成在Galelry2中,这就是一个界面。每一个子页面(如AlbumSetPage)都是ActivityState的衍生类。
ActivityState有一整套类似Activity一样的生命周期,整个生命周期全部由StateManager来管理。
ActivityState的结构和Activity十分的类似,可以说是一个精简的Activity。和StartActivity来启动一个Activity不同,ActivityState通过StateManager的startState方法来开启,整个生命周期的管理由StateManager来管理。
package com.android.gallery3d.app;
abstract public class ActivityState {
...
}
查看所有继承 ActivityState 可知
- AlbumSetPage.java:显示所有相册缩略图的页面:public class AlbumSetPage extends ActivityState implements
- AlbumPage.java:显示单个相册所有照片缩略图的页面:public class AlbumPage extends ActivityState implements GalleryActionBar.ClusterRunner,
- PhotoPage.java:单张照:public abstract class PhotoPage extends ActivityState implements
- SlideshowPage.java:滑屏页面:public class SlideshowPage extends ActivityState {
- ManageCachePage.java:缓存管理页面:public class ManageCachePage extends ActivityState implements
- TimeLinePage.java:时间轴页面:public class TimeLinePage extends ActivityState implements
例如上述关系
- AlbumSetPage 所有专辑界面,点击Gallery图标后进入图库所显示的第一个页面;
- AlbumPage 单个专辑界面,AlbumSetPage的一个子集,显示该专辑内的所有图片,专辑通过文件夹来区分;
- PhotoPage 单张图片界面,可用通过AlbumPage进入,也可以通过外部调用浏览单张图片。
4. 界面管理-StateManager
StateManager的作用类似于ActivityManager,是每个子页面(ActivityState)的管理类,负责子页面的切换,命令的执行,页面的刷新显示等职能,是ActivtyState的调度器。Gallery将所有页面操作命令交给StateManager来执行,StateManager再将命令分发给当前的子页面执行。
StateManger可以通过AbstractGalleryActivity的getStateManager方法获得。StateManager 中包含一个堆栈mStack,用于保存ActivtyState,和Activity一样的实现方式,子页面先进后出,当切换到新的子页面时,当前页面压入堆栈中。当用户按back返回时,当前页面出栈并销毁,前一个子页面做为当前显示界面。
public class StateManager {
private static class StateEntry {
public Bundle data;
public ActivityState activityState;
public StateEntry(Bundle data, ActivityState state) {
this.data = data;
this.activityState = state;
}
}
}
StateManager是一个桥梁,将真正的Actiivty(GalleryActivity)和ActivityState状态关联起来。当启动Gallery2时,首先执行GalleryActivity的onCreate方法,然后调用StateManager的startState方法加载AlbumSetPage,StateManager在startState方法中,首先
会判断当前堆栈栈顶是否为空,由于AlbumSetPage是第一页面,此时堆栈为空,因此AlbumSetPage会被压入堆栈中,并在栈顶显示。在将AlbumSetPage压入栈后,会依次执行AlbumSetPage的onCreate和onResume方法。这样一来给人的感觉就是,我启动了AlbumSetPage,同样会执行onCreate和onResume方法,从Actiivty到ActivityState状态的同步是通过StateManager来传递的。
同时SateManager也是ActivityState之间切换的桥梁,举个例子:从AlbumSetPage进入AlbumPage的过程中,在AlbumSetPage中通过调用SateManager的startStateForResult(类似于StartActivityForResult,含返回值)方法切换到AlbumPage,此时AlbumSetPage会被压入堆栈,执行onPause方法。并建立AlbumPage并将其进栈,执行onCreate, onResume方法,最终AlbumPage在栈顶显示。当用户执行back事件后跳回AlbumSetPage页面,AlbumPage出栈并执行onStop和onDestory方法。
5. GalleryAppImpl
GalleryAppImpl 继承于Application并实现了GalleryApp接口,Gallery2应用程序启动后首先执行GalleryAppImpl,GalleryApp接口抽象了Gallery2作为图库所要实现的最基本操作,例如getDataManager获取数据管理器加载图片视频数据,getImageCacheService获取图片缓存服务,getDownloadCache获取下载缓存,getThreadPool获取线程池等。
GalleryAppImpl 的onCreate方法主要执行GalleryUtils工具类的initialize初始化方法来获得手机屏幕的分辨率大小等信息。
package com.android.gallery3d.app;
public class GalleryAppImpl extends Application implements GalleryApp {
}
6. AbstractGalleryActivity
AbstractGalleryAcitivty是Gallery2最重要的一个Activity,Gallery2只有一个Actiivty用于显示,它就是AbstractGalleryActivity,它的派生类GalleryActivity是程序的主入口。AbstractGalleryActivity实现了GalleryContext接口,包括StateManager的初始化,在StateManager的初始化中传入AbstractGalleryActiivty的对象引用,这样就StateManager以及它的所有子类都可以通过该引用调用AbstractGalleryActivity提供的方法。
同时AbstractGalleryActivity提供很多实用方法,如调用getDataManager得到DataManager实例,通过getGLRoot方法获得GLRootView,通过getGalleryActionBar方法获得GalleryActionBar等。
package com.android.gallery3d.app;
public abstract class AbstractGalleryActivity extends AbstractPermissionActivity
}
7. GalleryActivity
GalleryActivity是AbstractGalleryActivity的衍生类,是Gallery2程序的主入口,在onCreate方法中initializeByIntent来判断调用的方式,调用方式包括ACTION_GET_CONTENT,ACTION_PICK,ACTION_VIEW和default,根据不同的ACTION执行正确的Gallery调用。如在MMS中调用Gallery2添加图片资源,MMS会发出ACTION_PICK广播进入Gallery2选择图片。
如果ACTION不属于以上(直接点击程序图标进入),GalleryActivity执行startDefaultPage方法,该方法调用StateManager的startState方法进入AlbumSetPage,并传入的KEY_MEDIA_PATH值为INCLUDE_ALL,表示在AlbumSetPage中查看所有media。
package com.android.gallery3d.app;
public final class GalleryActivity extends AbstractGalleryActivity implements OnCancelListener {
}