zoukankan      html  css  js  c++  java
  • 搜索和选择联系人

    相关类
    packages/apps/Contacts/src/com/android/contacts/activities/ActionBarAdapter.java
    packages/apps/Contacts/src/com/android/contacts/list/ContactEntryListFragment.java
    packages/providers/ContactsProvider/src/com/android/providers/contacts/NameNormalizer.java

    搜索和选择联系人模式切换流程
    搜索联系人和选择联系人都在ActionBarAdapter类中发起

    ActionBarAdapter.Listener中定义了onAction()和onUpButtonPressed()方法进行搜索和选择联系人的监听

    ActionBarAdapter.Listener.Action中定义了对联系人列表的一系列操作模式

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    public interface Listener {
    public abstract class Action {
    //当搜文本索框文字发生改变,触发此Action,根据输入文字进行联系人查询筛选
    public static final int CHANGE_SEARCH_QUERY = 0;
    //开启搜索联系人模式,调整界面,显示搜索框和搜索界面,进入搜索模式
    public static final int START_SEARCH_MODE = 1;
    //开启选择联系人模式,调整界面,显示选择框组件,进入选择模式
    public static final int START_SELECTION_MODE = 2;
    //关闭搜索或选择模式,恢复界面到联系人列表
    public static final int STOP_SEARCH_AND_SELECTION_MODE = 3;
    //关闭搜索或选择模式,运行tab按钮动画
    public static final int BEGIN_STOPPING_SEARCH_AND_SELECTION_MODE = 4;
    }
    //发送启动模式Action,启动搜索或选择模式
    void onAction(int action);
    //返回按钮监听,取消搜索或选择模式
    void onUpButtonPressed();
    }
    搜索联系人主要是CHANGE_SEARCH_QUERY动作发起,由代码调用跟到ContactEntryListFragment类中的setQueryString()方法,在此处设置全局查询关键词,并调用了reloadData()方法进行数据搜索

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    // TODO: the paramter delaySelection is not in use, and let's remove it.
    public void setQueryString(String queryString, boolean delaySelection) {
    if (!TextUtils.equals(mQueryString, queryString)) {
    ......
    if (mAdapter != null) {
    //设置搜索关键词
    mAdapter.setQueryString(queryString);
    //启动加载器开始加载联系人数据
    reloadData();
    }
    }
    }
    搜索联系人ContactsProvider调用流程
    加载器调用ContactsProvider搜索联系人调用使用了ContactsProvider2.query()方法,使用的Uri是Contacts.ENTERPRISE_CONTENT_FILTER_URI

    创建联系人的时候在contacts2.db数据库中的name_lookup表中存储了normallized_name列,该列中的数据来源是NameNormalize.normalize()对displayname的转换

    搜索联系人时主要通过normallized_name列数据进行模糊匹配,此方法中的转换算法和匹配算法可自行研究

    1
    2
    3
    4
    5
    6
    7
    8
    /**
    * Converts the supplied name to a string that can be used to perform approximate matching
    * of names. It ignores non-letter, non-digit characters, and removes accents.
    */
    public static String normalize(String name) {
    CollationKey key = getCompressingCollator().getCollationKey(lettersAndDigitsOnly(name));
    return Hex.encodeHex(key.toByteArray(http://www.amjmh.com), true);
    }
    SIM卡联系人操作
    相关类
    frameworks/opt/telephony/src/java/com/android/internal/telephony/IccProvider.java
    frameworks/opt/telephony/src/java/com/android/internal/telephony/uicc/UiccController.java
    ————————————————

  • 相关阅读:
    Myeclipse安装svn插件
    Hudson+Maven+Svn搭建持续集成环境
    svn merge和branch分析
    Linux下安装subversion1.6.5和apache2
    C语言中,为什么字符串可以赋值给字符指针变量
    Loadrunner C 编程_1
    oracle解决多表关联分组查询问题
    学习英语
    使用 JMeter 完成常用的压力测试 [转]
    Jmeter零起点学习
  • 原文地址:https://www.cnblogs.com/ly570/p/11414324.html
Copyright © 2011-2022 走看看