虽然我的项目经验不是很丰富,但是,就接手过的几个项目来说,如果在项目建立时存在下面提到的那些东西将会给项目的进行带来很大的方便,编写以下的那些类是个很好的习惯,也许大家都会这么做的吧,通常我把它们放在总包的.app包内,如图:
看到这个图感觉熟悉的兄弟姐妹们就可以直接略过本篇啦...因为我要将要把它们一个个地拿出来长篇大论咯。
一、MyApplication(代表本项目的类,它继承自android.app.Application)
因为Application对象是在程序运行起来就创建在虚拟机中的,只有当程序退出之后它的对象才会销毁。所以它常用来创建和缓存程序中可能用到的对象的引用,这些对象往往是以单例存在的。下面的代码就创建和缓存了activityManager对象和excutor对象的引用。因为Application对象的常在特性也偶尔用来缓存一些小数据。如下面的字符串APPCONFIG。
1 /** 2 * 应用程序实体 3 * @author Change 4 * 5 */ 6 public class MyApplication extends Application { 7 private ActivityManager activityManager = null; // activity管理类 8 private Executor excutor = null; // 线程池执行器 9 public static String APPCONFIG = ""; // 程序中用来缓存应用程序配置字段 10 @Override 11 public void onCreate() { 12 activityManager = ActivityManager.getInstance(); // 获得实例 13 excutor = Executors.newFixedThreadPool(5); // 拥有固定数量5的线程池 14 super.onCreate(); 15 } 16 17 public ActivityManager getActivityManager(){ 18 return activityManager; 19 } 20 21 public Executor getExcutor() { 22 return excutor; 23 }
当然,这个类得在AndroidManifest.xml中配置以下才能使用。
只需要在<application>节点中添加如下代码即可。
android:name="您的项目包名.app.MyApplication"
那么,从现在起,我们就可以通过activity对象的getApplication()方法强制转换成MyApplication后的对象来使用它的方法了,如下我们用到了MyApplication中创建的线程池执行器。
1 ((MyApplication) getApplication()).getExcutor().execute(new Runnable() { 2 3 @Override 4 public void run() { 5 System.out.println("执行"); 6 } 7 });
下面我们还会在BaseActivity中使用它来获取activityManager。
二、ActivityManager(该类用来管理程序中所有的activity实例,如返回时只需要调用endActivity()结束当前activity,退出程序时调用finishAllActivity()结束所有activity,此外还有跳转到指定activity的方法:finishAllActivityExceptOne,这些在页面跳转时都是很方便的)
这种设计来源于面向对象的类比,activity就相当于一叠扑克牌,我们只能看到最上面的一张,而且越后放上的就先展示,那么用栈来管理最恰当不过了。
1 /** 2 * activity管理类,防止activity跳转混乱 3 * 4 * @author Change 5 */ 6 public class ActivityManager { 7 /** 8 * 接收activity的Stack 9 */ 10 private static Stack<Activity> activityStack = null; 11 private static ActivityManager activityManager = null; 12 13 private ActivityManager(){} 14 15 /** 16 * 单实例 17 * 18 * @return 19 */ 20 public static ActivityManager getInstance() { 21 if(activityManager==null){ 22 activityManager = new ActivityManager(); 23 } 24 return activityManager; 25 } 26 27 28 /** 29 * 将activity移出栈 30 * 31 * @param activity 32 */ 33 public void popActivity(Activity activity) { 34 if (activity != null) { 35 activityStack.remove(activity); 36 } 37 } 38 39 /** 40 * 结束指定activity 41 * 42 * @param activity 43 */ 44 public void endActivity(Activity activity) { 45 if (activity != null) { 46 activity.finish(); 47 activityStack.remove(activity); 48 activity = null; 49 } 50 } 51 52 /** 53 * 获得当前的activity(即最上层) 54 * 55 * @return 56 */ 57 public Activity currentActivity() { 58 Activity activity = null; 59 if (!activityStack.empty()) 60 activity = activityStack.lastElement(); 61 return activity; 62 } 63 64 /** 65 * 将activity推入栈内 66 * 67 * @param activity 68 */ 69 public void pushActivity(Activity activity) { 70 if (activityStack == null) { 71 activityStack = new Stack<Activity>(); 72 } 73 activityStack.add(activity); 74 } 75 76 /** 77 * 弹出除cls外的所有activity 78 * 79 * @param cls 80 */ 81 public void popAllActivityExceptOne(Class<? extends Activity> cls) { 82 while (true) { 83 Activity activity = currentActivity(); 84 if (activity == null) { 85 break; 86 } 87 if (activity.getClass().equals(cls)) { 88 break; 89 } 90 popActivity(activity); 91 } 92 } 93 94 /** 95 * 结束除cls之外的所有activity,执行结果都会清空Stack 96 * 97 * @param cls 98 */ 99 public void finishAllActivityExceptOne(Class<? extends Activity> cls) { 100 while (!activityStack.empty()) { 101 Activity activity = currentActivity(); 102 if (activity.getClass().equals(cls)) { 103 popActivity(activity); 104 } else { 105 endActivity(activity); 106 } 107 } 108 } 109 110 /** 111 * 结束所有activity 112 */ 113 public void finishAllActivity() { 114 while (!activityStack.empty()) { 115 Activity activity = currentActivity(); 116 endActivity(activity); 117 } 118 } 119 }
如何使用更为恰当呢?接下来,我们看看BaseActivity这个类,上面两个类的基本使用均有体现。
三、BaseActivity(所有项目中定义的activity的父类,一般来所它继承Activity,如果程序中需要用到fragment,请继承FragmentActivity)
它的设计用到了继承,有高耦合的特性,以至于所有子类都能直接访问其中公用和受保护的方法。在其中执行了activity入栈操作,简化了子类activity的处理。并且在销毁activity让栈中的对应对象引用弹出。维护stack内数据的真确性。
1 /** 2 * activity基础类,作为程序中所有activity的父类,便于管理,与公有方法的调用。 3 * 4 * @author Change 5 * 6 */ 7 public class BaseActivity extends Activity { 8 @Override 9 protected void onCreate(Bundle b) { 10 requestWindowFeature(Window.FEATURE_NO_TITLE); 11 ((MyApplication) this.getApplication()).getActivityManager() 12 .pushActivity(this); // 将activity推入管理栈 13 super.onCreate(b); 14 } 15 16 @Override 17 protected void onDestroy() { // 销毁时activity出栈 18 ((MyApplication) this.getApplication()).getActivityManager() 19 .popActivity(this); 20 super.onDestroy(); 21 } 22 23 /** 24 * activity跳转 25 * @param from 26 * @param to 27 * @param data 携带数据 28 */ 29 protected void goTo(Context from,Class<? extends BaseActivity> to,Bundle data){ 30 Intent i = new Intent(); 31 i.setClass(from, to); 32 i.putExtras(data); 33 from.startActivity(i); 34 } 35 36 }
其中在
((MyApplication) this.getApplication()).getActivityManager() .pushActivity(this); // 将activity推入管理栈
用到了MyApplication对象中缓存的activityManager引用。
写代码是枯燥的,但设计却是有趣的,多思考,多观察,也许会有不同的收获,自勉,共勉。
相关推荐
Android 进一步推进了 " 随时随地为每个人提供信息 " 这一企 业 目标的实现。 � Open Handset Alliance 汇集了多家业界巨头。运营商如: China Mobile 、 NTT DoCoMo 、 Vodafone 、 T-M obile 等;设备制造商如 ...
丛书名: 图灵程序设计丛书 出版社:人民邮电出版社 ISBN:9787115215369 上架时间:2009-11-6 出版日期:2009 年11月 开本:16开 页码:196 版次:1-1 编辑推荐 你的第一本Android书. Pragmatic系列...
界面 活动的概念 活动(Activity)是应用程序的四大组件之一 活动负责管理Android应用程序的用户界面 一个应用程序一般会包含若干个活动,每一个活动组件负责一个用户界面的展现。 活动的建立 如何建立活动? 活动的...
作为使用androidsdk构建这些应用程序的实用指南书籍,《android高级编程》从始至终穿插了一系列示例项目,每个项目都引入android的新功能和新技术,以助您达到最圆满的学习效果。书中介绍android的所有基本功能,并...
建立第一个Android项目(Hello Android!) Android应用程序架构——从此开始 可视化的界面开发工具 部署应用程序到Android手机 该作品是PDF文件格式请下载 福昕PDF阅读器 第3章 用户人机界面 3.1...
隐藏在每个应用后面的是一系列的服务和系统, 其中包括; • 丰富而又可扩展的视图( Views),可以用来构建应用程序, 它包括列表(lists),网格( grids), 文 本框(text boxes),按 钮 (buttons), 甚至可...
网络编程课程 设计报告 课程名称 java程序设计之网络编程 题 目 Android Socket 聊天室 专 业 信息管理与信息系统 班 级 组 长 副 组 长 组 员 指导教师 目 录 1设计目的 3 2 开发工具和开发环境 3 3 设计原理 3 3.1...
除此之外,用户需要亲临检测机构实地送检,在检测的每一个环节用户也无法有效的进行追踪,这些都制约着认证检测领域的进一步发展。鉴于市场上用户的手机型号、种类、屏幕分辨率等参差不齐,传统方式根据主流系统分别...
>基础规范部分主要讨论命名规范和代码规范, 规范这种东西虽然消灭了每个团队成员的个性, 但却大大提高了整个团队的协作能力, 让每个人都能轻松接手 别人的工作。 代码设计 >代码设计从Java编程的角度来讨论如何构建...
在此项目中,您将完成Sandwich Club应用程序,以显示每个三明治的详细信息。 为什么这个项目 建立布局并使用JSON接收的数据填充其字段是Android开发人员的一项常见任务。 尽管JSON解析通常是使用库完成的,但为该...
作为使用AndroidSDK构建这些应用程序的实用指南书籍,《Android高级编程》从始至终穿插了一系列示例项目,每个项目都引入Android的新功能和新技术,以助您达到最圆满的学习效果。书中介绍Android的所有基本功能,并...
2.2 创建第一个Android项目(Hello Android!) 2.3 Android应用程序架构——从此开始 2.4 可视化的界面开发工具 2.5 部署应用程序到Android手机 第3章 用户人机界面 3.1 更改与显示文字标签 3.2 更改手机窗口画面底色 ...
应用程序,每个应用程序用于最终用户、店主和管理员,后端有一个基于 JSON 的 REST API。 下载 从 Google Play 商店获取 使用的库 Android-Jetpack, Retrofit, Ok-Http, Event-Bus, Picasso, butterknife, dagger2, ...
2.2 创建第一个Android项目(Hello Android!) 2.3 Android应用程序架构——从此开始 2.4 可视化的界面开发工具 2.5 部署应用程序到Android手机 第3章 用户人机界面 3.1 更改与显示文字标签 3.2 更改手机窗口画面底色 ...
2.2 创建第一个Android项目(Hello Android!) 2.3 Android应用程序架构——从此开始 2.4 可视化的界面开发工具 2.5 部署应用程序到Android手机 第3章 用户人机界面 3.1 更改与显示文字标签 3.2 更改手机窗口画面底色 ...
2、了解Eclipse,学会用Eclipse和Java 开发一个Android程序。 3、进一步巩固课堂上所学到的知识,深刻把握Java语言的重要概念及其面向对象的特性 ,能够熟练的应用面向对象的思想和设计方法解决实际问题的能力。 4...
在这个项目中,我完成了Sandwich Club应用程序,以显示每个三明治的详细信息。 为什么这个项目 建立布局并使用JSON接收的数据填充其字段是Android开发人员的一项常见任务。 尽管JSON解析通常是使用库完成的,但为该...
实现快速人脸识别,录入学生签到信息,使用wifi模块将信息上传到云端管理系统,对每个学生建立独立档案,管理系统汇总所有数据,分析签到率、中途离开人数等传输到教师客户端,学生成功签到/离退会收到学生端提醒,...
本书共分两篇,第一篇介绍了Android 3D游戏... 有一定Android基础的读者通过阅读本书的前半部分便可快速掌握OpenGL ES的基础知识,然后通过7个真实案例的学习迅速掌握Android平台下应用程序的开发。 在职的开发人员