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来管理。

资源图片.png

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

例如上述关系

  1. AlbumSetPage 所有专辑界面,点击Gallery图标后进入图库所显示的第一个页面;
  2. AlbumPage 单个专辑界面,AlbumSetPage的一个子集,显示该专辑内的所有图片,专辑通过文件夹来区分;
  3. 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;
        }
    }
}

第三方片.png

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方法。

第三方片.png

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 {

}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值