【Android先进】我们为什么要创建Activity基类Activity什么是一般的基类方法

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

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

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

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

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

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

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

/**
 * Activity的支持类接口,主要定义了Activity中经常使用的功能
 *
 * @Package com.example.myallutils
 *
 *          TODO
 * @author ZhaoKaiQiang
 *
 * @time 2014年5月7日
 */
public interface IBaseActivity {
	/**
	 * 获取Application对象
	 *
	 * @return
	 */
	public abstract Application getApplication();

	/**
	 * 开启服务
	 */
	public abstract void startService();

	/**
	 * 停止服务
	 */
	public abstract void stopService();

	/**
	 * 推断是否有网络连接,若没有,则弹出网络设置对话框。返回false
	 *
	 * @return
	 */
	public abstract boolean validateInternet();

	/**
	 *
	 * 推断是否有网络连接,没有返回false
	 *
	 */
	public abstract boolean hasInternetConnected();

	/**
	 * 退出应用
	 */
	public abstract void isExit();

	/**
	 * 推断GPS是否已经开启.
	 *
	 * @return
	 */
	public abstract boolean hasLocationGPS();

	/**
	 * 推断基站是否已经开启.
	 */
	public abstract boolean hasLocationNetWork();

	/**
	 * 检查内存卡.
	 */
	public abstract void checkMemoryCard();

	/**
	 * 获取进度条.
	 *
	 * @return
	 */
	public abstract ProgressDialog getProgressDialog();

	/**
	 * 返回当前Activity上下文.
	 */
	public abstract Context getContext();

	/**
	 * 获取当前登录用户的SharedPreferences配置.
	 */
	public SharedPreferences getLoginUserSharedPre();

	/**
	 * 用户是否在线(当前网络是否重连成功)
	 */
	public boolean getUserOnlineState();

	/**
	 * 设置用户在线状态 true 在线 false 不在线
	 *
	 * @param isOnline
	 */
	public void setUserOnlineState(boolean isOnline);

	/**
	 *
	 * 发出Notification的method.
	 *
	 * @param iconId
	 *            图标
	 * @param contentTitle
	 *            标题
	 * @param contentText
	 *            内容
	 * @param activity
	 */
	public void PushNotification(int iconId, String contentTitle,
			String contentText, Class<?> activity, String from);
}

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

/**
 * Activity的基类。实现了IActivitySupport接口
 *
 * @Package com.example.myallutils
 *
 *          TODO
 * @author ZhaoKaiQiang
 *
 * @time 2014年5月7日
 */
public abstract class BaseActivity extends FinalActivity implements
		IBaseActivity {

	protected Context mContext = null;
	protected SharedPreferences preferences;
	protected MyApplication myApplication;
	protected ProgressDialog pg = null;
	protected NotificationManager notificationManager;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		mContext = this;
		preferences = getSharedPreferences("TAG", 0);
		notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
		pg = new ProgressDialog(mContext);
		myApplication = (MyApplication) getApplication();

	}

	/**
	 * 初始化页面布局
	 */
	abstract void iniView();

	@Override
	protected void onStart() {
		super.onStart();
	}

	@Override
	protected void onResume() {
		super.onResume();
	}

	@Override
	protected void onPause() {
		super.onPause();
	}

	@Override
	protected void onStop() {
		super.onStop();
	}

	@Override
	public void onDestroy() {
		super.onDestroy();
	}

	@Override
	public ProgressDialog getProgressDialog() {
		return pg;
	}

	/**
	 * 在这里开启全部须要开启的服务
	 */
	@Override
	public void startService() {

	}

	/**
	 * 在这里关闭全部须要开启的服务
	 */
	@Override
	public void stopService() {

	}

	/**
	 * 停止服务并结束全部的Activity退出应用
	 */
	@Override
	public void isExit() {
		new AlertDialog.Builder(mContext).setTitle("确定退出吗?")
				.setNeutralButton("确定", new DialogInterface.OnClickListener() {
					@Override
					public void onClick(DialogInterface dialog, int which) {
						stopService();
						myApplication.exit();
					}
				})
				.setNegativeButton("取消", new DialogInterface.OnClickListener() {
					@Override
					public void onClick(DialogInterface dialog, int which) {
						dialog.cancel();
					}
				}).show();
	}

	/**
	 * 推断是否有网络连接,没有返回false
	 */
	@Override
	public boolean hasInternetConnected() {
		ConnectivityManager manager = (ConnectivityManager) mContext
				.getSystemService(Context.CONNECTIVITY_SERVICE);
		if (manager != null) {
			NetworkInfo network = manager.getActiveNetworkInfo();
			if (network != null && network.isConnectedOrConnecting()) {
				return true;
			}
		}
		return false;
	}

	/**
	 * 推断是否有网络连接,若没有。则弹出网络设置对话框。返回false
	 */
	@Override
	public boolean validateInternet() {
		ConnectivityManager manager = (ConnectivityManager) mContext
				.getSystemService(Context.CONNECTIVITY_SERVICE);
		if (manager == null) {
			openWirelessSet();
			return false;
		} else {
			NetworkInfo[] info = manager.getAllNetworkInfo();
			if (info != null) {
				for (int i = 0; i < info.length; i++) {
					if (info[i].getState() == NetworkInfo.State.CONNECTED) {
						return true;
					}
				}
			}
		}
		openWirelessSet();
		return false;
	}

	/**
	 * 推断GPS定位服务是否开启
	 */
	@Override
	public boolean hasLocationGPS() {
		LocationManager manager = (LocationManager) mContext
				.getSystemService(Context.LOCATION_SERVICE);
		if (manager
				.isProviderEnabled(android.location.LocationManager.GPS_PROVIDER)) {
			return true;
		} else {
			return false;
		}
	}

	/**
	 * 推断基站定位是否开启
	 */
	@Override
	public boolean hasLocationNetWork() {
		LocationManager manager = (LocationManager) mContext
				.getSystemService(Context.LOCATION_SERVICE);
		if (manager
				.isProviderEnabled(android.location.LocationManager.NETWORK_PROVIDER)) {
			return true;
		} else {
			return false;
		}
	}

	/**
	 * 检查内存卡可读
	 */
	@Override
	public void checkMemoryCard() {
		if (!Environment.MEDIA_MOUNTED.equals(Environment
				.getExternalStorageState())) {
			new AlertDialog.Builder(mContext)
					.setTitle("检測内存卡")
					.setMessage("请检查内存卡")
					.setPositiveButton("设置",
							new DialogInterface.OnClickListener() {
								@Override
								public void onClick(DialogInterface dialog,
										int which) {
									dialog.cancel();
									Intent intent = new Intent(
											Settings.ACTION_SETTINGS);
									mContext.startActivity(intent);
								}
							})
					.setNegativeButton("退出",
							new DialogInterface.OnClickListener() {
								@Override
								public void onClick(DialogInterface dialog,
										int which) {
									dialog.cancel();

								}
							}).create().show();
		}
	}

	/**
	 * 打开网络设置对话框
	 */
	public void openWirelessSet() {
		AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(mContext);
		dialogBuilder
				.setTitle("网络设置")
				.setMessage("检查网络")
				.setPositiveButton("网络设置",
						new DialogInterface.OnClickListener() {
							@Override
							public void onClick(DialogInterface dialog,
									int which) {
								dialog.cancel();
								Intent intent = new Intent(
										Settings.ACTION_WIRELESS_SETTINGS);
								mContext.startActivity(intent);
							}
						})
				.setNegativeButton("取消", new DialogInterface.OnClickListener() {
					@Override
					public void onClick(DialogInterface dialog, int whichButton) {
						dialog.cancel();
					}
				});
		dialogBuilder.show();
	}

	/**
	 * 关闭键盘
	 */
	public void closeInput() {
		InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
		if (inputMethodManager != null && this.getCurrentFocus() != null) {
			inputMethodManager.hideSoftInputFromWindow(this.getCurrentFocus()
					.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
		}
	}

	/**
	 *
	 * 发出Notification
	 *
	 * @param iconId
	 *            图标
	 * @param contentTitle
	 *            标题
	 * @param contentText
	 *            你内容
	 * @param activity
	 */
	@SuppressWarnings("deprecation")
	public void PushNotification(int iconId, String contentTitle,
			String contentText, Class<?> activity, String to) {

		// 创建新的Intent。作为点击Notification留言条时, 会执行的Activity
		Intent notifyIntent = new Intent(this, activity);
		notifyIntent.putExtra("to", to);
		// 创建PendingIntent作为设置递延执行的Activity
		PendingIntent appIntent = PendingIntent.getActivity(mContext, 0,
				notifyIntent, 0);
		/* 创建Notication,并设置相关參数 */
		Notification myNoti = new Notification();
		// 点击自己主动消失
		myNoti.flags = Notification.FLAG_AUTO_CANCEL;
		/* 设置statusbar显示的icon */
		myNoti.icon = iconId;
		/* 设置statusbar显示的文字信息 */
		myNoti.tickerText = contentTitle;
		/* 设置notification发生时同一时候发出默认声音 */
		myNoti.defaults = Notification.DEFAULT_SOUND;
		/* 设置Notification留言条的參数 */
		myNoti.setLatestEventInfo(mContext, contentTitle, contentText,
				appIntent);
		/* 送出Notification */
		notificationManager.notify(0, myNoti);
	}

	/**
	 * 返回上下文对象
	 */
	@Override
	public Context getContext() {
		return mContext;
	}

	/**
	 * 返回登录用户的SharedPreferences对象
	 */
	@Override
	public SharedPreferences getLoginUserSharedPre() {
		return preferences;
	}

	/**
	 * 获取用户在线状态
	 */
	@Override
	public boolean getUserOnlineState() {
		return false;
	}

	/**
	 * 设置用户在线状态
	 */
	@Override
	public void setUserOnlineState(boolean isOnline) {

	}

}

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

/**
 *
 * @Package com.example.myallutils
 *
 *          TODO
 * @author ZhaoKaiQiang
 *
 * @time 2014年5月6日
 */
public class MainActivity extends BaseActivity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		iniView();
	}

	@Override
	void iniView() {
		mContext = this;
		validateInternet();
		PushNotification(R.drawable.ic_launcher, "測试", "内容測试", OtherActivity.class,
				"嘻嘻");
	}

}

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

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

时间: 2024-10-03 08:16:10

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

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

目录 介绍Android应用程序组件,以及使用这些组件构建的各种Android应用程序 Android应用程序的生命周期 如何创建应用程序Manifest 如何使用外部资源提供对位置.语言和硬件配置的支持 如何实现和使用自己的Application类 如何创建新的Activity 理解Activity的状态转换和生命周期 Android应用程序的组成部分 Android应用程序是由松散耦合的组件构成的,并使用应用程序Manifest绑定到一起. Manifest描述了每一个组件以及他们之间的交互

C++之 模板化基类 的名称处理

在引入模板之后,我们面临一个新的问题,那就是如果继承自一个模板基类,是否跟继承一般的类有什么区别呢? 就是说,如果一个类继承自某个模板类,那么该类应该注意一些什么呢?其实,它与一般类的继承是很不一样的. 先举个简单的例子: 我们可以看到,在上述代码中,Derived类中的成员函数调用了Base类的成员函数,显然这是很合理的,因为PrintBase并没有被声明 为virtual,因此,派生类直接继承其声明与实现,可是编译器却不这么认为,编译器给出的错误是: error: there are no

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

现在也算是刚刚基本完成了自己的第一个商业项目,在开发的过程中,参考了不少人的代码风格,然而随着工作经验的积累,终于开始慢慢的了解到抽象思想在面向对象编程中的重要性,这一篇简单的介绍一下我的一点收获. 首先,在现在的项目中使用的主要是afinal框架,而且这个框架确实比较不错,省去了不少工作量,在编写Activity的过程中,基本都是直接继承自FinalActivity类,这样可以使用这个类给我们封装好的不少的方法,但是随着项目慢慢推进,这种直接继承框架类的一些缺点也开始慢慢的显现出来.最主要的就

Android Studio快速创建常用工具类的插件Utils

现如今Android开发,开发工具Android Studio已成为主流,而为Android Studio打造的插件也越来越多,今天为大家介绍一个快速创建常用工具类的插件Utils.其实Android中有关工具类的库有很多,但我们开发中一般只会用到某个库的一个或几个类,所以这时候Utils就有了很大的优势了,它直接创建自己所需要的工具类,而且每个工具类是相互解耦的.下面,我们就来一起看看它的集成及使用. 首先,我们看一下集成方式 下载jar包导入1.下载最新jar包Utils.jar-v1.32

为多态基类声明一个虚析构函数

使用一个基类指针删除派生类对象,同时基类的析构函数是非虚的,那么这个指针只会删除派生类对象中的基类的部分,其派生部分不会被删除.造成资源泄漏. 而如果一个类并不用作基类,则没必要把析构函数声明为虚的,否则会浪费空间来存储虚函数指针和虚函数表. STL容器并不含虚析构函数,因此最好不要继承STL容器. 只要有一个纯虚函数,就会导致抽象基类,即不能声明该基类的对象.抽象基类只能用来继承,纯虚函数如: virtual ~AWOV() = 0; 你必须为这个纯虚析构函数提供定义,因为析构函数调用时,最先

C++ Primer学习笔记32_面向对象编程(3)--继承(三):多重继承、虚继承与虚基类

C++ Primer学习笔记32_面向对象编程(3)--继承(三):多重继承.虚继承与虚基类 一.多重继承 在C++语言中,一个派生类可以从一个基类派生,称为单继承:也可以从多个基类派生,称为多继承. 多重继承--一个派生类可以有多个基类 class <派生类名> : <继承方式1> <基类名1>,<继承方式2> <基类名2>,... { <派生类新定义成员> }; 可见,多继承与单继承的区别从定义格式上看,主要是多继承的基类多于一个

C#继承机制 访问与隐藏基类成员

(1) 访问基类成员 通过base 关键字访问基类的成员:   调用基类上已被其他方法重写的方法.  指定创建派生类实例时应调用的基类构造函数.  基类访问只能在构造函数.实例方法或实例属性访问器中进行. 从静态方法中使用 base 关键字是错误的. 示例:下面程序中基类 Person 和派生类 Employee 都有一个名为 Getinfo 的方法.通过使用 base 关键字,可以从派生类中调用基类上的 Getinfo 方法. using System ;public class Person

VC++ 之 虚基类详解

在上一节中,有两个身份证号显然是不合理的.为此,可以把class Person这个共同基类设置为虚基类,这样,从不同路径继承来的同名数据成员在内存中就只有一个拷贝,同名函数也只有一种映射. 虚基类定义方式 虚基类(virtual base class)定义方式如下:    class 派生类名:virtual 访问限定符 基类类名{...};或:    class 派生类名:访问限定符 virtual 基类类名{...}; 其中:virtual 关键字只对紧随其后的基类名起作用. 例如:   

OOP1(定义基类和派生类)

面向对象程序设计基于三个基本概念:数据抽象,继承和动态绑定 数据抽象是一种依赖于接口和实现分离的编程技术.继承和动态绑定对程序的编号有两方面的影响:一是我们可以更容易地定义与其它类相似但不完全相同的类:二是在使用这些彼此相似的类编写程序时,我们可以在一定程度上忽略掉它们的区别. 在 c++ 语言中,当我们使用基类的引用或指针调用一个虚函数时将发生动态绑定 定义基类: 1 class Quote { 2 public: 3 Quote() = default; 4 Quote(const std: