欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android Mms之:联系人管理的应用分析

程序员文章站 2023-11-20 18:23:34
contact联系人对mms来说是十分重要的,因为每一个对话的收信人都是一个联系人,新建信息时可以输入联系人的任何信息,比如号码或名字,mms都可以把信息发给相应的人。mm...

contact联系人对mms来说是十分重要的,因为每一个对话的收信人都是一个联系人,新建信息时可以输入联系人的任何信息,比如号码或名字,mms都可以把信息发给相应的人。mms中的类contact就是用来代表一个联系人,它含有联系人的信息,如名字,号码,联系人id,是否存在于联系人数据库等等,同时contact也提供了一些方法来获取contact对象,contact.get()方法来获取contact对象。contact会保持数据与联系人数据库的同步,有一个接口updatecontact()用于通知联系人信息已经发生了改变。

contact内部也有一个cache,用于保存最近用到的联系人。因为外部在用contact.get()方法来获取contact时通常都只传给一个号码,并期望获取contact。

contact内部的cache是由contactcache类来创建和管理的。它内部还有一个taskstack用于管理一些runnable。因为每个从数据库中加载contact都是一个单独的线程,这个taskstack就是专门用于管理runnable和,以stack的方式来管理,也即filo顺序的方式来运行runnable任务。

contactcache中有很多重载的get()方法用于获取contact对象,其中都有一个布尔参数canblock,这个是说是以阻塞调用者的方式来加载contact还是以异步的方式来加载,另外一个参数就是联系人的号码。get()方法会先调用internalget()方法,internalget()会先试图从内部的cachemcontacthash中获取contact,如果不存在就用传入的号码新建一个contact,总之它一定会返回一个联系人的。之后会进行updatecontact()的动作,updatecontact()就是放在一个runnable线程中,如果调用者是可阻塞的,马上就运行这个runnable来updatecontact,如果是异步方式就把这个runnable放到taskstack中稍后运行。updatecontact会调用getcontactinfo来获取联系人的信息,getcontactinfo会调用getcontactinfoforself(),getcontactinfoforphonenumber,getcontactinfoforemailaddress()来获取具体的联系人信息。其中如果这个号码是手机联系人自己本身,就获取本机的相关信息;如果号码是一个email地址或者一个短号码,或者字符号码,那么就把号码作为一个email地址来查询,也就是说把它作为联系人的email字段匹配来查询;其他情况,也就是号码就是一个电话号码,把它与联系人的电话号码字段匹配查询。updatecontact在查询完成后,会调用接口updatelistener.onupdate(),以告诉监听者,联系人已更新。因为联系人的获取过程中都是异步的,所以才会在更新完成后调用接口来通知。

内部的cache的数据结构是一个hashmap<string,arraylist<contact>>,key是以contact内部的数据来生成的。invalidatecache时并不会移除mcontactshash内部的数据,而是把其标识为stale,当下次get这个contact时就会调用updatecontact()来更新这个contact。