虽然我的项目经验不是很丰富,但是,就接手过的几个项目来说,如果在项目建立时存在下面提到的那些东西将会给项目的进行带来很大的方便,编写以下的那些类是个很好的习惯,也许大家都会这么做的吧,通常我把它们放在总包的.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 等;设备制造商如 ...
教程会详细介绍如何在Eclipse中设置Android开发环境,包括下载和安装必要的SDK,以及如何创建和运行第一个Android项目。 3. **Android UI设计基础**:通过“Converter应用”这一具体实例,教程展示了如何在Eclipse...
丛书名: 图灵程序设计丛书 出版社:人民邮电出版社 ISBN:9787115215369 上架时间:2009-11-6 出版日期:2009 年11月 开本:16开 页码:196 版次:1-1 编辑推荐 你的第一本Android书. Pragmatic系列...
### Android应用程序设计基础手艺知识点详解 #### 一、章节概览 本章节主要介绍了Android应用程序设计的基础手艺,包括12个具体的技能点。这些技能涵盖了菜单创建、按钮展示、布局管理等多个方面,对于初学者来说是...
- **线程处理**:由于服务器需要同时处理多个客户端请求,因此通常会为每个连接创建一个新的线程,以避免阻塞其他客户端的连接。 - **数据交换**:数据通常是通过输入输出流(InputStream和OutputStream)在服务器...
### Android UI程序设计知识点 #### 一、UI概念与变革 - **选择区别于桌面系统的窗体**:在设计Android应用界面时,需考虑移动设备的特性,与传统的桌面系统有所区别。 - **屏幕尺寸的限制**:考虑到移动设备屏幕...
Android应用由多个组件构成,每个组件都有自己的生命周期。了解各个组件的生命周期对于优化应用性能至关重要。 - **Activity生命周期**:包括onCreate()、onStart()、onResume()、onPause()、onStop()、onDestroy()...
在本节"Android项目实战--手机卫士07--设置向导"中,我们将深入探讨如何在Android平台上开发一个功能完善的手机卫士应用,并重点介绍设置向导的实现过程。这个实战项目旨在帮助开发者理解如何将Android系统的核心...
Android SDK是Android应用程序开发不可或缺的工具集,它包含了一系列用于构建、调试和部署Android应用的组件。"android-21"指的是SDK中的一个特定版本,即API Level 21,对应的是Android 5.0(Lollipop)系统。在这...
- **Filter Chain**:MINA采用过滤器链的设计模式,允许开发者插入自定义的处理逻辑,每个过滤器对数据进行处理,然后传递给下一个过滤器。 - **Session**:MINA中的Session代表一个网络连接,它包含了与连接相关...
3. **AndroidManifest.xml**:这是每个Android应用的核心配置文件,它定义了应用的组件、权限、设备兼容性等信息。在绿豆通讯录中,你需要关注如何声明活动(Activity)和其他组件。 4. **布局设计**:在`res/...
### Android培训课程中文版知识点概览 #### 一、Android入门基础 1. **序言** ...每个部分都围绕着Android开发的核心技术和应用场景展开,旨在帮助读者全面掌握Android开发的基本技能和进阶技术。
界面 活动的概念 活动(Activity)是应用程序的四大组件之一 活动负责管理Android应用程序的用户界面 一个应用程序一般会包含若干个活动,每一个活动组件负责一个用户界面的展现。 活动的建立 如何建立活动? 活动的...
第一个Android程序”的资源包,旨在为正在进行毕业设计的学生提供一个基础的起点,帮助他们理解和掌握Android应用的基本构建过程。下面将详细阐述这个过程中涉及的关键知识点。 1. **Android Studio入门**:Android...
整体来看,该文件展示了一个Android天气预报程序的开发过程,从项目结构的建立、布局设计、API使用、中文拼音转换、工具类编写到Manifest配置,每一步都是构建Android应用不可或缺的部分。开发者需要熟悉这些基本...
8. **多线程**:如果服务器需要同时处理多个客户端连接,可能需要使用多线程技术,每个客户端连接在一个独立的线程中处理。 9. **IP和端口**:确保PC服务器的IP地址是可访问的,如公网IP或者通过内网穿透工具映射的...
创建Hello World项目是每个新开发者都会经历的步骤,这将帮助理解Android应用的基本结构,包括`MainActivity.java`(主活动)和`AndroidManifest.xml`(应用清单)文件。 接下来是`Android_day01_homework`,这可能...
4. **活动(Activity)和生命周期**:每个Android应用由一个或多个活动组成,它们代表用户可见的屏幕。学习如何创建、启动、暂停、恢复和销毁活动是Android开发的基础。 5. **Intent和Intent Filter**:Intent用于...
本资源"Android-tcp-server-and-client.zip"包含了一个Android TCP客户端和服务器端的示例,可以帮助开发者理解如何在Android设备上建立TCP连接,进行数据传输。以下是关于Android TCP通信的关键知识点: 1. **TCP...