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

 更新时间:2013年05月22日 11:08:22   作者:  
本篇文章是对Android中的联系人管理进行了详细的分析介绍,需要的朋友参考下

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。

相关文章

  • Android实现图片异步加载并缓存到本地

    Android实现图片异步加载并缓存到本地

    这篇文章主要介绍了Android实现图片异步加载并缓存到本地的相关资料,需要的朋友可以参考下
    2016-02-02
  • Android实现检测实体按键事件并屏蔽

    Android实现检测实体按键事件并屏蔽

    这篇文章主要介绍了Android实现检测实体按键事件并屏蔽 ,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • Android的Launcher启动器中添加快捷方式及小部件实例

    Android的Launcher启动器中添加快捷方式及小部件实例

    这篇文章主要介绍了在Android的Launcher启动器中添加快捷方式及窗口小部件的方法,包括在自己的应用程序中添加窗口小部件AppWidget的例子,需要的朋友可以参考下
    2016-02-02
  • Android使用SoundPool实现播放音频

    Android使用SoundPool实现播放音频

    这篇文章主要为大家详细介绍了Android使用SoundPool实现播放音频,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-05-05
  • Android开发准确获取手机IP地址的两种方式

    Android开发准确获取手机IP地址的两种方式

    这篇文章主要介绍了Android开发准确获取手机IP地址的两种方式,需要的朋友可以参考下
    2020-03-03
  • android设备间实现无线投屏的示例代码

    android设备间实现无线投屏的示例代码

    Android提供了MediaProjection来实现录屏,通过MediaProjection可以获取当前屏幕的视频流,而视频流需要通过编解码来压缩进行传输,通过MediaCodec可实现视频的编码和解码,这篇文章主要介绍了android设备间实现无线投屏,需要的朋友可以参考下
    2022-06-06
  • 关于androidstuio导入系统源码的问题

    关于androidstuio导入系统源码的问题

    小编最近在做系统源码导出来的小项目,在导入androidstudio过程中遇到过一些问题,本文以Schedule power on off为例给大家详细介绍,需要的朋友参考下吧
    2021-06-06
  • Flutter加载图片流程之ImageCache源码示例解析

    Flutter加载图片流程之ImageCache源码示例解析

    这篇文章主要为大家介绍了Flutter加载图片流程之ImageCache源码解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • android ListView深入理解

    android ListView深入理解

    在android开发中ListView是比较常用的组件,它以列表的形式展示具体内容,并且能够根据数据的长度自适应显示。抽空把对ListView的使用做了整理,需要的朋友可以参考下
    2012-11-11
  • Android中二维码的扫描和生成(使用zxing库)

    Android中二维码的扫描和生成(使用zxing库)

    ZXing是一个开放源码的,用Java实现的多种格式的1D/2D条码图像处理库,它包含了联系到其他语言的端口,下面这篇文章主要给大家介绍了关于Android中二维码扫描和生成的相关资料,主要使用的zxing库,需要的朋友可以参考下
    2022-09-09

最新评论