原来以为google的代码一定都非常好,比如android的全局搜索框的代码,涉及了大量的设计模式,想来一年前我的java学习竟然是从这么复杂的代码开始的,一开始的云里雾里,真是令我头痛啊。

直至今天,让我看android的源码,基本上能分出些好坏来了。

以Notification为例来说说吧。

API 1(绝大部分现在用的)的用Notification的代码一般为:

private void showNotification(Context context, String ticker,     String title, String describe, int icon, Intent intent) {    int id = mIncrement++;    NotificationManager nm = (NotificationManager)context.getSystemService(    Context.NOTIFICATION_SERVICE);    PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);     Notification notification = new Notification(icon,    ticker,System.currentTimeMillis());    notification.setLatestEventInfo(context, title, describe, pendingIntent);    notification.flags |= Notification.FLAG_AUTO_CANCEL;    nm.notify(id, notification);    }

注意:1)PendingIntent的getActivity的方法的最后一个参数,这个参数决定了更新PendingIntent中发送intent的数据。

2)NotificationManager的notify方法的第一个参数,这个id标识了不同的通知。

我们看到对于用一个Notificaiton,我们不仅要写参数很多的构造函数,而且这些还不够,还要用setLastestEventInfo方法设置更多的内容才行,而且还有flags等这些属性。何等凌乱啊。

而这种构造函数参数多,还要设置其他属性的这种情况是典型的java bean。

不管是构造函数参数多,还是java bean都有很大的缺点。

1、多个构造器的坏处

好多种参数,特别是参数特别多时,用户调用非常不方便,如果不对照文档,根本不知道哪个参数表示什么含义,对于同类型的参数,如果传参错误,编译时也检查不出来,只有运行时才会发现不对。总之,不方便用户调用。

2、利用Java Bean的方式的坏处

对于多个参数,如果让用户调用时能够知道各个参数都是什么含义,可以采用Java Bean的方法,但是这种方式有严重的缺点,就是因为构造过程被分到几个调用中,因此可能处于不一致的状态,因此可能参数错误,而这种错误与包含错误代码大相径庭,调试起来非常困难。

对于以上这种情况,最好是用Builder的方式。至于为什么,参见我以前的博客文章:http://www.cnblogs.com/tingzi/archive/2012/04/18/2454940.html

惊喜地发现,对于android中Notification的使用在API 11竟然有了更新。用的就是Builder的方式。使用如下:

private void showNotificaion(Context context, int id) {NotificationManager nm = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);Intent intent = new Intent(Intent.ACTION_MAIN);PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);Notification notification = new Notification.Builder(context).setAutoCancel(true).setContentTitle("title").setContentText("describe").setContentIntent(pendingIntent).setSmallIcon(R.drawable.ic_launcher).setWhen(System.currentTimeMillis()).build();nm.notify(id, notification);}

看起来何等简洁啊。

更多相关文章

  1. Android中native进程内存泄露的调试技巧
  2. webservice二进制文件传输
  3. Android(安卓)调用系统相机以及相册源码
  4. Android应用程序框架层和系统运行库层日志系统源代码分析
  5. Android的View和ViewGroup深入分析
  6. android怎样调用@hide和internal API
  7. 浅析Android(安卓)Activity的启动过程
  8. mybatisplus的坑 insert标签insert into select无参数问题的解决
  9. Python技巧匿名函数、回调函数和高阶函数

随机推荐

  1. [Android] 你真的了解Activity吗?
  2. react-native开发实例之code-push更新(and
  3. IOS类似android的view.gone/view.visable
  4. Android(安卓)AOP注解Annotation详解(一)
  5. Android代码覆盖率初探—问题已解决!
  6. 最简单的Android更新组件~
  7. SDK Platform Android(安卓)无法更新?
  8. Android(安卓)Studio 管理打包版本 起步
  9. 在Android中将子View的坐标转换为父View
  10. Android(安卓)SDCard UnMounted 流程分析