三、添加符号
在加入和移除symbol功能中,都用到了changeUnreadMessageCount函数,只是参数0和1的区别。功能是当飞信之类的软件有消息来的时候,改变其未读消息的数量。

这里mUnreadMessageCount是个全局,初始化时private int mUnreadMessageCount = 0 。取0和它大的那一个。然后用了broadcastUnreadMessageCount,由于未读消息是全局的,所以不需参数传递。
我们下面来分析broadcastUnreadMessageCount函数,由于该函数较长,我们分成一个个部分来解释。
Intent countNumIntent = new Intent(HomeIntents.ACTION_SHORTCUT_SYMBOL);
countNumIntent.putExtra(HomeIntents.SHORTCUT_SYMBOL_INTENT, fetionIntent);
这里HomeIntents是OPhone里特有的一个类,oms.home.HomeIntents,作用是将一个符号添加成快捷方式,putExtra方法的功能是向飞信的intent添加扩展数据。
Intent不是一个新的概念,它对系统传递的各种消息进行了分类。在《HelloWorld工程简介》中,我们提到:receiver也是application的运行时子元素。receiver通过增加intent-fliter来标识它需要接受哪些intent。当收到intent后,receiver将根据不同的intent进行不同的处理。当一个Intent发出后,所有注册了该intent的receiver都将会收到,系统会根据receiver在系统中的注册次序顺序发送。当一个receiver处理完该Intent后,系统才会向下一个receiver发送。当一个receiver有多个未接收的intent时,将按照intent发送的次序顺序接收。
if (mUnreadMessageCount > 0) {
Bitmap bg = BitmapFactory.decodeResource(getResources(),R.drawable.shortcut_msgcount);
Bitmap symbol = Bitmap.createBitmap(bg.getWidth(), bg.getHeight(),bg.getConfig());
创建好intent之后,当消息数量大于0时,建立两个bitmap类型作为图标, BitmapFactory.decodeResource 的返回值是一个bitmap,将一个资源的ID号转化成图片。然后新建一个symbol类型的bitmap。

这段代码比较简单,在屏幕上画了图标,并将消息条数也显示在图标的下面。设置完图标后,执行
countNumIntent.putExtra(HomeIntents.SHORTCUT_SYMBOL_BITMAP, symbol)
向图片添加扩展数据,HomeIntents.SHORTCUT_SYMBOL_BITMAP实际上就是字符串"symbol_bitmap"。
最后,不管消息条数是否大于0,执行
countNumIntent.putExtra(HomeIntents.SHORTCUT_SYMBOL_POSITION,HomeIntents.SYM_TOP);
sendBroadcast(countNumIntent);
第一条语句设置位置数据,SHORTCUT_SYMBOL_POSITION有SYM_CENTER, SYM_TOP两种,第二条语句发送广播消息。该广播消息可以被所有感兴趣的receiver所接收,是异步的。
至此,符号添加/移除工作已经完成。运行结果如图:
加入symbol前:

加入symbol后:
