Android开发工具----界面管理器(MiddleManager)

设计目的

        在Android APP 开发过程中,设计与用户良好交互并且运行效率高、资源占用少的界面几乎是一件不可避免的事情。因为Android 系统的CUP和内存不像PC机那样充足。对于Android 界面展示可能最开始想到的就是每一个界面用一个Activity,如果界面之间需要跳转,用意图(Intent)来启动要跳转的界面。但是仔细想想一个应用里的界面有几十个,在使用应用时,我们可能将这几十个Activity 全部开启了起来,ActivityAndroid 中四大组件之一,它的启动和保存都将消耗大量的资源。如果出现上面的情况那后果可想而知了。所以我们只用一个Activity,即MainActivity,然后用界面管理器替换MainActivity里显示的页面。

设计思想

        对于页面切换机制,最核心的方法就是removeView()addView()了,我们可以用FristViewSecondView这两个页面为例进行说明。显然在界面管理器中我们可以这样做,写两个方法addFirstView()addSecondView(),在这两个方法中分别创建FirstViewSecondView ,并通过他的getView()方法获取到显示的内容。这是一个最简单的方法,但当增加界面时不得不修改管理器中的代码,而界面管理器主要用于管理界面切换的,很明显这样设计与管理器三个字很不符合。那就必须去定义一个更加通用的方法了,现将方法定义给出public voidchangeUI(Class<? extends BaseUI> targetClazz,Bundle bundle,booleanisLoadDate);,下面讲解该方法的详细实现过程

具体实现

        为了提高运行效率,我们将已经创建好的界面保存起来,在changeUI方法开始执行时对于那些已经创建好的界面直接拿来重用,对于没有创建的界面使用构造器(Constructor)实例化对象、初始化界面。

        此外式,选择单例模式就是为了避免多个管理器同时工作而在页面切换的过程中产生不一致状态。

关键代码
public void changeUI(Class<? extends BaseUI> targetClazz,Bundle bundle,boolean isLoadDate) {
		// 判断:当前正在展示的界面和切换目标界面是否相同
		if (currentUI != null && currentUI.getClass() == targetClazz) {
			return;
		}
		BaseUI targetUI = null;
		// 一旦创建过,重用
		// 判断是否创建了——曾经创建过的界面需要存储
		String key = targetClazz.getSimpleName();
		if (VIEWCACHE.containsKey(key)) {
			// 创建了,重用
			targetUI = VIEWCACHE.get(key);
			System.out.println("重用"+targetUI.toString());
		} else {
			// 否则,创建
			try {
				Constructor<? extends BaseUI> constructor = targetClazz.getConstructor(Context.class);
				targetUI = constructor.newInstance(getContext());
				if(!VIEWCACHE.containsKey(key)) {
					VIEWCACHE.put(key, targetUI);
				}
			} catch (Exception e) {
				e.printStackTrace();
				throw new RuntimeException("constructor new instance error");
			}
			System.out.println("创建"+targetUI.toString());
		}
		//设置参数
		if (targetUI != null) {
			targetUI.setBundle(bundle);
		}
	    System.out.println(targetUI.toString());
		if (currentUI != null) {
			// 对当前正在展示的界面进行收尾工作——onPause方法
			currentUI.onPause();
		}
		// 添加之前清空内容
		middle.removeAllViews();
		View child = targetUI.getView();
		middle.addView(child);
		// 在加载完界面之后——onResume
		targetUI.onResume();
		//判断是否加载网络数据
        if(isLoadDate){
	    	//调用  loadData 方法加载网络数据
	    	targetUI.loadData();
	    }
		currentUI = targetUI;
		// 将当前显示的界面放到栈顶
		HISTORY.addFirst(key);
	}

 

猜你喜欢

转载自blog.csdn.net/qq_32445015/article/details/80798375