今天,它可以被视为只是基本完成了其首个商业项目,在发展过程中,风格,然而随着工作经验的积累。最终開始慢慢的了解到抽象思想在面向对象编程中的重要性,这一篇简单的介绍一下我的一点收获。

首先,在如今的项目中使用的主要是afinal框架,并且这个框架确实比較不错,省去了不少工作量。在编写Activity的过程中,基本都是直接继承自FinalActivity类,这样能够使用这个类给我们封装好的不少的方法,可是随着项目慢慢推进,这样的直接继承框架类的一些缺点也開始慢慢的显现出来。最基本的就是扩展性受到了一些限制,比方对于Activity,我们一般进行控件的初始化操作。为了使代码风格更加的简单介绍明了,我一般都是在一个单独的initView()方法中实现对控件的初始化,然后在onCreate中直接调用这种方法实现控件的初始化。除此之外,在非常多的涉及到网络连接的Activity中须要对网络情况进行检測,假设网络状况出现故障,就弹出一个对话框提醒用户进行网络的设置或者是检查。

像是这样的的需求,我们最好能抽成单独的方法,这样我们就不须要在每一个Activity中都写大量的代码进行设置。

可是因为我们是直接集成自FinalActivity,所以一个实现方案就是直接改动我们的FinalActivity的源码,添加这些公共的方法。可是这样就改动了外部框架的源码,添加了代码之间的耦合度,当我们在另外的项目中须要使用这个框架的时候,就须要再改源码。所以说这样的方式能够解决这个问题,但并非最好的解决方式。

第二种解决方式就是我们另外写一个Activity的基类BaseActivity,这个类也是继承自FinalActivity,并且在这个基类里面我们能够实现一些公共的方法。这样其它的Activity继承自我们这个BaseActivity基类。既能够使用FinalActivity里面封装好的方法。也能够使用我们在BaseActivity里面扩展的一些公共的方法。假设我们再抽象一层的话。我们能够把这些公共的方法抽象到一个接口里面。然后我们的BaseActivity实现这个接口,这样也能够实现程序的扩展。

以下贴一些我整理的一些代码

首先是抽象出来的一个Activity的接口

  1. /**
  2. * Activity的支持类接口,主要定义了Activity中经常使用的功能
  3. *
  4. * @Package com.example.myallutils
  5. *
  6. * TODO
  7. * @author ZhaoKaiQiang
  8. *
  9. * @time 2014年5月7日
  10. */
  11. public interface IBaseActivity {
  12. /**
  13. * 获取Application对象
  14. *
  15. * @return
  16. */
  17. public abstract Application getApplication();
  18.  
  19. /**
  20. * 开启服务
  21. */
  22. public abstract void startService();
  23.  
  24. /**
  25. * 停止服务
  26. */
  27. public abstract void stopService();
  28.  
  29. /**
  30. * 推断是否有网络连接,若没有,则弹出网络设置对话框。返回false
  31. *
  32. * @return
  33. */
  34. public abstract boolean validateInternet();
  35.  
  36. /**
  37. *
  38. * 推断是否有网络连接,没有返回false
  39. *
  40. */
  41. public abstract boolean hasInternetConnected();
  42.  
  43. /**
  44. * 退出应用
  45. */
  46. public abstract void isExit();
  47.  
  48. /**
  49. * 推断GPS是否已经开启.
  50. *
  51. * @return
  52. */
  53. public abstract boolean hasLocationGPS();
  54.  
  55. /**
  56. * 推断基站是否已经开启.
  57. */
  58. public abstract boolean hasLocationNetWork();
  59.  
  60. /**
  61. * 检查内存卡.
  62. */
  63. public abstract void checkMemoryCard();
  64.  
  65. /**
  66. * 获取进度条.
  67. *
  68. * @return
  69. */
  70. public abstract ProgressDialog getProgressDialog();
  71.  
  72. /**
  73. * 返回当前Activity上下文.
  74. */
  75. public abstract Context getContext();
  76.  
  77. /**
  78. * 获取当前登录用户的SharedPreferences配置.
  79. */
  80. public SharedPreferences getLoginUserSharedPre();
  81.  
  82. /**
  83. * 用户是否在线(当前网络是否重连成功)
  84. */
  85. public boolean getUserOnlineState();
  86.  
  87. /**
  88. * 设置用户在线状态 true 在线 false 不在线
  89. *
  90. * @param isOnline
  91. */
  92. public void setUserOnlineState(boolean isOnline);
  93.  
  94. /**
  95. *
  96. * 发出Notification的method.
  97. *
  98. * @param iconId
  99. * 图标
  100. * @param contentTitle
  101. * 标题
  102. * @param contentText
  103. * 内容
  104. * @param activity
  105. */
  106. public void PushNotification(int iconId, String contentTitle,
  107. String contentText, Class<?> activity, String from);
  108. }

以下是对这个接口的实现,是全部Activity的基类

  1. /**
  2. * Activity的基类。实现了IActivitySupport接口
  3. *
  4. * @Package com.example.myallutils
  5. *
  6. * TODO
  7. * @author ZhaoKaiQiang
  8. *
  9. * @time 2014年5月7日
  10. */
  11. public abstract class BaseActivity extends FinalActivity implements
  12. IBaseActivity {
  13.  
  14. protected Context mContext = null;
  15. protected SharedPreferences preferences;
  16. protected MyApplication myApplication;
  17. protected ProgressDialog pg = null;
  18. protected NotificationManager notificationManager;
  19.  
  20. @Override
  21. protected void onCreate(Bundle savedInstanceState) {
  22. super.onCreate(savedInstanceState);
  23. mContext = this;
  24. preferences = getSharedPreferences("TAG", 0);
  25. notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
  26. pg = new ProgressDialog(mContext);
  27. myApplication = (MyApplication) getApplication();
  28.  
  29. }
  30.  
  31. /**
  32. * 初始化页面布局
  33. */
  34. abstract void iniView();
  35.  
  36. @Override
  37. protected void onStart() {
  38. super.onStart();
  39. }
  40.  
  41. @Override
  42. protected void onResume() {
  43. super.onResume();
  44. }
  45.  
  46. @Override
  47. protected void onPause() {
  48. super.onPause();
  49. }
  50.  
  51. @Override
  52. protected void onStop() {
  53. super.onStop();
  54. }
  55.  
  56. @Override
  57. public void onDestroy() {
  58. super.onDestroy();
  59. }
  60.  
  61. @Override
  62. public ProgressDialog getProgressDialog() {
  63. return pg;
  64. }
  65.  
  66. /**
  67. * 在这里开启全部须要开启的服务
  68. */
  69. @Override
  70. public void startService() {
  71.  
  72. }
  73.  
  74. /**
  75. * 在这里关闭全部须要开启的服务
  76. */
  77. @Override
  78. public void stopService() {
  79.  
  80. }
  81.  
  82. /**
  83. * 停止服务并结束全部的Activity退出应用
  84. */
  85. @Override
  86. public void isExit() {
  87. new AlertDialog.Builder(mContext).setTitle("确定退出吗?")
  88. .setNeutralButton("确定", new DialogInterface.OnClickListener() {
  89. @Override
  90. public void onClick(DialogInterface dialog, int which) {
  91. stopService();
  92. myApplication.exit();
  93. }
  94. })
  95. .setNegativeButton("取消", new DialogInterface.OnClickListener() {
  96. @Override
  97. public void onClick(DialogInterface dialog, int which) {
  98. dialog.cancel();
  99. }
  100. }).show();
  101. }
  102.  
  103. /**
  104. * 推断是否有网络连接,没有返回false
  105. */
  106. @Override
  107. public boolean hasInternetConnected() {
  108. ConnectivityManager manager = (ConnectivityManager) mContext
  109. .getSystemService(Context.CONNECTIVITY_SERVICE);
  110. if (manager != null) {
  111. NetworkInfo network = manager.getActiveNetworkInfo();
  112. if (network != null && network.isConnectedOrConnecting()) {
  113. return true;
  114. }
  115. }
  116. return false;
  117. }
  118.  
  119. /**
  120. * 推断是否有网络连接,若没有。则弹出网络设置对话框。返回false
  121. */
  122. @Override
  123. public boolean validateInternet() {
  124. ConnectivityManager manager = (ConnectivityManager) mContext
  125. .getSystemService(Context.CONNECTIVITY_SERVICE);
  126. if (manager == null) {
  127. openWirelessSet();
  128. return false;
  129. } else {
  130. NetworkInfo[] info = manager.getAllNetworkInfo();
  131. if (info != null) {
  132. for (int i = 0; i < info.length; i++) {
  133. if (info[i].getState() == NetworkInfo.State.CONNECTED) {
  134. return true;
  135. }
  136. }
  137. }
  138. }
  139. openWirelessSet();
  140. return false;
  141. }
  142.  
  143. /**
  144. * 推断GPS定位服务是否开启
  145. */
  146. @Override
  147. public boolean hasLocationGPS() {
  148. LocationManager manager = (LocationManager) mContext
  149. .getSystemService(Context.LOCATION_SERVICE);
  150. if (manager
  151. .isProviderEnabled(android.location.LocationManager.GPS_PROVIDER)) {
  152. return true;
  153. } else {
  154. return false;
  155. }
  156. }
  157.  
  158. /**
  159. * 推断基站定位是否开启
  160. */
  161. @Override
  162. public boolean hasLocationNetWork() {
  163. LocationManager manager = (LocationManager) mContext
  164. .getSystemService(Context.LOCATION_SERVICE);
  165. if (manager
  166. .isProviderEnabled(android.location.LocationManager.NETWORK_PROVIDER)) {
  167. return true;
  168. } else {
  169. return false;
  170. }
  171. }
  172.  
  173. /**
  174. * 检查内存卡可读
  175. */
  176. @Override
  177. public void checkMemoryCard() {
  178. if (!Environment.MEDIA_MOUNTED.equals(Environment
  179. .getExternalStorageState())) {
  180. new AlertDialog.Builder(mContext)
  181. .setTitle("检測内存卡")
  182. .setMessage("请检查内存卡")
  183. .setPositiveButton("设置",
  184. new DialogInterface.OnClickListener() {
  185. @Override
  186. public void onClick(DialogInterface dialog,
  187. int which) {
  188. dialog.cancel();
  189. Intent intent = new Intent(
  190. Settings.ACTION_SETTINGS);
  191. mContext.startActivity(intent);
  192. }
  193. })
  194. .setNegativeButton("退出",
  195. new DialogInterface.OnClickListener() {
  196. @Override
  197. public void onClick(DialogInterface dialog,
  198. int which) {
  199. dialog.cancel();
  200.  
  201. }
  202. }).create().show();
  203. }
  204. }
  205.  
  206. /**
  207. * 打开网络设置对话框
  208. */
  209. public void openWirelessSet() {
  210. AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(mContext);
  211. dialogBuilder
  212. .setTitle("网络设置")
  213. .setMessage("检查网络")
  214. .setPositiveButton("网络设置",
  215. new DialogInterface.OnClickListener() {
  216. @Override
  217. public void onClick(DialogInterface dialog,
  218. int which) {
  219. dialog.cancel();
  220. Intent intent = new Intent(
  221. Settings.ACTION_WIRELESS_SETTINGS);
  222. mContext.startActivity(intent);
  223. }
  224. })
  225. .setNegativeButton("取消", new DialogInterface.OnClickListener() {
  226. @Override
  227. public void onClick(DialogInterface dialog, int whichButton) {
  228. dialog.cancel();
  229. }
  230. });
  231. dialogBuilder.show();
  232. }
  233.  
  234. /**
  235. * 关闭键盘
  236. */
  237. public void closeInput() {
  238. InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
  239. if (inputMethodManager != null && this.getCurrentFocus() != null) {
  240. inputMethodManager.hideSoftInputFromWindow(this.getCurrentFocus()
  241. .getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
  242. }
  243. }
  244.  
  245. /**
  246. *
  247. * 发出Notification
  248. *
  249. * @param iconId
  250. * 图标
  251. * @param contentTitle
  252. * 标题
  253. * @param contentText
  254. * 你内容
  255. * @param activity
  256. */
  257. @SuppressWarnings("deprecation")
  258. public void PushNotification(int iconId, String contentTitle,
  259. String contentText, Class<?> activity, String to) {
  260.  
  261. // 创建新的Intent。作为点击Notification留言条时, 会执行的Activity
  262. Intent notifyIntent = new Intent(this, activity);
  263. notifyIntent.putExtra("to", to);
  264. // 创建PendingIntent作为设置递延执行的Activity
  265. PendingIntent appIntent = PendingIntent.getActivity(mContext, 0,
  266. notifyIntent, 0);
  267. /* 创建Notication,并设置相关參数 */
  268. Notification myNoti = new Notification();
  269. // 点击自己主动消失
  270. myNoti.flags = Notification.FLAG_AUTO_CANCEL;
  271. /* 设置statusbar显示的icon */
  272. myNoti.icon = iconId;
  273. /* 设置statusbar显示的文字信息 */
  274. myNoti.tickerText = contentTitle;
  275. /* 设置notification发生时同一时候发出默认声音 */
  276. myNoti.defaults = Notification.DEFAULT_SOUND;
  277. /* 设置Notification留言条的參数 */
  278. myNoti.setLatestEventInfo(mContext, contentTitle, contentText,
  279. appIntent);
  280. /* 送出Notification */
  281. notificationManager.notify(0, myNoti);
  282. }
  283.  
  284. /**
  285. * 返回上下文对象
  286. */
  287. @Override
  288. public Context getContext() {
  289. return mContext;
  290. }
  291.  
  292. /**
  293. * 返回登录用户的SharedPreferences对象
  294. */
  295. @Override
  296. public SharedPreferences getLoginUserSharedPre() {
  297. return preferences;
  298. }
  299.  
  300. /**
  301. * 获取用户在线状态
  302. */
  303. @Override
  304. public boolean getUserOnlineState() {
  305. return false;
  306. }
  307.  
  308. /**
  309. * 设置用户在线状态
  310. */
  311. @Override
  312. public void setUserOnlineState(boolean isOnline) {
  313.  
  314. }
  315.  
  316. }

在我们定义的Activity中就能够这样使用

  1. /**
  2. *
  3. * @Package com.example.myallutils
  4. *
  5. * TODO
  6. * @author ZhaoKaiQiang
  7. *
  8. * @time 2014年5月6日
  9. */
  10. public class MainActivity extends BaseActivity {
  11.  
  12. @Override
  13. protected void onCreate(Bundle savedInstanceState) {
  14. super.onCreate(savedInstanceState);
  15. setContentView(R.layout.activity_main);
  16. iniView();
  17. }
  18.  
  19. @Override
  20. void iniView() {
  21. mContext = this;
  22. validateInternet();
  23. PushNotification(R.drawable.ic_launcher, "測试", "内容測试", OtherActivity.class,
  24. "嘻嘻");
  25. }
  26.  
  27. }

经过几层抽象。我们能够看到,代码的扩展性和耦合性确实得到了一定的改善。这篇文章仅仅针对菜鸟,假设有牛人有幸能够看到这篇文章。还希望能够不吝赐教一二!

版权声明:本文博客原创文章。博客,未经同意,不得转载。

【Android先进】我们为什么要创建Activity基类Activity什么是一般的基类方法的更多相关文章

  1. android 在基类activity中注册BroadcastReceiver,子activity类实现响应

    android app 一般都会定义自己的BaseActivity, 如果各子Activity都需要接收广播但对广播的处理又不同时,可以考虑在BaseActivity中注册BroadcastRecei ...

  2. Delphi 继承基类的窗体,并显示基类的控件操作。

    1.  先建一个普通的窗体,until1 2.  先把类实现基类, 并需要实现基类需要继承的方法, 可以先不用再方法中写实现代码. TForm4 = class(TfrmmtAReportPeriod ...

  3. 我的Android 4 学习系列之创建应用程序和Activity:Manifest、Application、Activity

    目录 介绍Android应用程序组件,以及使用这些组件构建的各种Android应用程序 Android应用程序的生命周期 如何创建应用程序Manifest 如何使用外部资源提供对位置.语言和硬件配置的 ...

  4. 【Android进阶】为什么要创建Activity基类以及Activity基类中一般有哪些方法

    现在也算是刚刚基本完成了自己的第一个商业项目,在开发的过程中,参考了不少人的代码风格,然而随着工作经验的积累,终于开始慢慢的了解到抽象思想在面向对象编程中的重要性,这一篇简单的介绍一下我的一点收获. ...

  5. guxh的python笔记七:抽象基类

    1,鸭子类型和白鹅类型 1.1,白鹅类型 白鹅类型对接口有明确定义,比如不可变序列(Sequence),需要实现__contains__,__iter__,__len__,__getitem__,__ ...

  6. 【Python】【元编程】【从协议到抽象基类】

    """class Vector2d: typecode = 'd' def __init__(self,x,y): self.__x = float(x) self.__ ...

  7. 虚析构函数? vptr? 指针偏移?多态数组? delete 基类指针 内存泄漏?崩溃?

    五条基本规则: 1.如果基类已经插入了vptr, 则派生类将继承和重用该vptr.vptr(一般在对象内存模型的顶部)必须随着对象类型的变化而不断地改变它的指向,以保证其值和当前对象的实际类型是一致的 ...

  8. OOP2(虚函数/抽象基类/访问控制与继承)

    通常情况下,如果我们不适用某个函数,则无需为该函数提供定义.但我们必须为每个虚函数都提供定义而不管它是否被用到了,这因为连编译器也无法确定到底会适用哪个虚函数 对虚函数的调用可能在运行时才被解析: 当 ...

  9. OOP1(定义基类和派生类)

    面向对象程序设计基于三个基本概念:数据抽象,继承和动态绑定 数据抽象是一种依赖于接口和实现分离的编程技术.继承和动态绑定对程序的编号有两方面的影响:一是我们可以更容易地定义与其它类相似但不完全相同的类 ...

随机推荐

  1. 间隔DP基础 POJ2955——Brackets

    取血怒.first blood,第一区间DP,这样第一次没有以某种方式在不知不觉中下降~~~ 题目尽管是鸟语.但还是非常赤裸裸的告诉我们要求最大的括号匹配数.DP走起~ dp[i][j]表示区间[i, ...

  2. win10无法新建文件夹怎么办 win10右键新建菜单设置方法

    有朋友安装了win10系统后发现右键菜单中没有新建项,而平时使用新建 - 文件夹项的机率很高.如何才能恢复桌面右键菜单中的新建项呢? 右键点击桌面空白处,在右键菜单中发现没有新建项: 桌面右键菜单没有 ...

  3. C# Windows Phone 8 WP8 开发,取得手机萤幕大小两种方法。

    原文:C# Windows Phone 8 WP8 开发,取得手机萤幕大小两种方法. 一般我们在开发Windows Phone App时,需要取得萤幕的大小来自定义最佳化控制项的大小,但是开如何取得萤 ...

  4. C#判断操作系统是32位还是64位(超简单)

    由于项目需要在64位和32位系统运行,需要判断当前系统是32位还是64位. 网上很多方法,但是都感觉不是很简洁,最后发现可以使用int的长度来判断:看代码 /// <summary>    ...

  5. strategy pattern

  6. c# 获取某个对象的[公有属性]的名称,类型,值

    /// <summary> /// 获取某个对象的[公有属性]的名称,类型,值 /// </summary> /// <typeparam name="T&qu ...

  7. oracle存储过程的例子

    oracle存储过程的例子 分类: 数据(仓)库及处理 2010-05-03 17:15 1055人阅读 评论(2)收藏 举报 认识存储过程和函数 存储过程和函数也是一种PL/SQL块,是存入数据库的 ...

  8. CareerCup chapter 1 Arrays and Strings

    1.Implement an algorithm to determine if a string has all unique characters What if you can not use ...

  9. Cookie rejected: Illegal path attribute &quot;/nexus&quot;. Path of origin: &quot;/content/&quot; 解

    问题叙述性说明 通过运行"mvn clean deploy" 命令 将 Maven 项目公布 Nexus 当PW.举例控制台输出以下警告消息: [INFO] Downloaded: ...

  10. 几款开源ESB总线的比较(转)

    现有的开源ESB总线中,自从2003年第一个开源总线Mule出现后,现在已经是百花争鸣的景象了.现在我就对现有的各种开源ESB总线依据性能.可扩展性.资料文档完整程度以及整合难易程度等方面展开. CX ...