首先,在现在的项目中使用的主要是afinal框架,而且这个框架确实比较不错,省去了不少工作量,在编写Activity的过程中,基本都是直接继承自FinalActivity类,这样可以使用这个类给我们封装好的不少的方法,但是随着项目慢慢推进,这种直接继承框架类的一些缺点也开始慢慢的显现出来。最主要的就是扩展性受到了一些限制,比如对于Activity,我们一般进行控件的初始化操作,为了使代码风格更加的简介明了,我一般都是在一个单独的initView()方法中实现对控件的初始化,然后在onCreate中直接调用这个方法实现控件的初始化。除此之外,在很多的涉及到网络连接的Activity中需要对网络情况进行检测,如果网络状况出现问题,就弹出一个对话框提醒用户进行网络的设置或者是检查。像是这种的需求,我们最好能抽成单独的方法,这样我们就不需要在每个Activity中都写大量的代码进行设置。但是由于我们是直接集成自FinalActivity,所以一个实现方案就是直接修改我们的FinalActivity的源代码,增加这些公共的方法,但是这样就修改了外部框架的源代码,增加了代码之间的耦合度,当我们在另外的项目中需要使用这个框架的时候,就需要再改源代码,所以说这样的方式可以解决问题,但并不是最好的解决方案。
在我们定义的Activity中就可以这样使用
经过几层抽象,我们可以看到,代码的扩展性和耦合性确实得到了一定的改善,这篇文章只针对菜鸟,如果有牛人有幸可以看到这篇文章,还希望可以指教一二!
另外一种解决方案就是我们另外写一个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,
- "嘻嘻");
- }
- }
经过几层抽象,我们可以看到,代码的扩展性和耦合性确实得到了一定的改善,这篇文章只针对菜鸟,如果有牛人有幸可以看到这篇文章,还希望可以指教一二!