[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,notification)