[Android]从新旧API看android代码演进
原来以为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);}
看起来何等简洁啊。
更多相关文章
- Android中native进程内存泄露的调试技巧
- webservice二进制文件传输
- Android(安卓)调用系统相机以及相册源码
- Android应用程序框架层和系统运行库层日志系统源代码分析
- Android的View和ViewGroup深入分析
- android怎样调用@hide和internal API
- 浅析Android(安卓)Activity的启动过程
- mybatisplus的坑 insert标签insert into select无参数问题的解决
- Python技巧匿名函数、回调函数和高阶函数