zoukankan      html  css  js  c++  java
  • Android系统应用Mms之短信会话列表加载流程一

    1. ConversationList短息会话列表界面
    1. 开始进行加载
    ConversationList: 
    protected void onStart(){
        ...
        // 进行异步查询
        startAsyncQuery();
    }
    
    private void startAsyncQuery() {
        ...
        // 加载消息
        mLoaderFragment.reLoadMessage(THREAD_LIST_QUERY_TOKEN, // token: 1701
                                      Conversation.sAllThreadsUri,// 查询的Uri: content://mms-sms/conversations&simple=true
                                      Conversation.ALL_THREADS_PROJECTION,// 查询的字段
                                      null, null, 
                                      Conversations.DEFAULT_SORT_ORDER);
        ...
    }
    
    2. 进入到MessageLoaderFragment, 进行加载
    MessageLoaderFragment:
    public void reLoadMessage(int loadId, Uri uri, String[] projection,
                String selection, String[] selectionArgs, String orderBy) {
        ...
        // 进行异步加载
        getLoaderManager().restartLoader(loadId, null, mMessageLoaderListener);        
    }
    
    3. 进入到MmsSmsProvider中执行查询流程
    MmsSmsProvider:
    public Cursor query(Uri uri, String[] projection,
                String selection, String[] selectionArgs, String sortOrder) {
        ...
        switch(URI_MATCHER.match(uri)) {
            ...
            case URI_CONVERSATIONS:
                String simple = uri.getQueryParameter("simple");
                if ((simple != null) && simple.equals("true")) {
                    String threadType = uri.getQueryParameter("thread_type"); // 获取会话类型
                    if (!TextUtils.isEmpty(threadType)) {
                        selection = concatSelections(selection, Threads.TYPE + "=" + threadType);
                    }
                    // 获取简单会话
                    cursor = getSimpleConversations(projection, selection, selectionArgs, sortOrder);
                } else {
                    cursor = getConversations(projection, selection, sortOrder);
                }
                break;        
            ...
        }
        ...
        return cursor;    
    }
    
    private Cursor getSimpleConversations(String[] projection, String selection,
                String[] selectionArgs, String sortOrder) {
        // 到此处已完成会话的查询, 接下来看数据的填充
        return mOpenHelper.getReadableDatabase().query(TABLE_THREADS, // threads数据库 
                                                       projection, selection, 
                                                       selectionArgs, null, null,
                                                       " date DESC");        
    }
    
    4. 数据加载完成后回调到MessageLoaderFragment$LoaderManager.LoaderCallbacks<Cursor>中
    MessageLoaderFragment$LoaderManager.LoaderCallbacks<Cursor>:
    public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
        ...
        // 数据加载完成回调到ConversationList中
        mListener.onMessageLoaded(data, loader);
    }
    
    5. 数据回调到ConversationList$MessageLoaderFragmentListener中
    ConversationList$MessageLoaderFragmentListener:
    public void onMessageLoaded(Cursor cursor, Loader<Cursor> loader) {
        // 更新UI
        mListAdapter.changeCursor(cursor);
        ... 
    }
    
    短信会话列表加载涉及到的数据库:
    MmsSmsDatabaseHelper: 
    数据库名: MmsSmsProvider:
    static final String TABLE_THREADS = "threads"
    数据库的创建:
    private void createCommonTables(SQLiteDatabase db) {
        ...
        db.execSQL("CREATE TABLE threads (" +
                   Threads._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +// id
                   Threads.DATE + " INTEGER DEFAULT 0," + // 时间
                   Threads.MESSAGE_COUNT + " INTEGER DEFAULT 0," + // 消息数量
                   Threads.RECIPIENT_IDS + " TEXT," + // 接受者ID
                   Threads.SNIPPET + " TEXT," + // 片段
                   Threads.SNIPPET_CHARSET + " INTEGER DEFAULT 0," + // 片段编码
                   Threads.READ + " INTEGER DEFAULT 1," + // 是否已读
                   Threads.TYPE + " INTEGER DEFAULT 0," + // 类型
                   Threads.ERROR + " INTEGER DEFAULT 0," + // 是否有错
                   Threads.HAS_ATTACHMENT + " INTEGER DEFAULT 0," + // 是否有附件
                   Threads.RECIPIENT_ADDRESSES + " TEXT, " + // 接受者地址
                   Threads.RECIPIENT_NAMES + " TEXT ); "); // 接受者姓名    
    }

  • 相关阅读:
    前端试题-正则中test, exec, match的区别
    前端试题-什么是css sprite?优缺点?
    有哪些软件堪称「神器」,却不被大众所知?(转)
    gif,png,jpg的区别
    前端试题-两列等高布局
    20160109小问题
    动画效果之运动
    用JS控制下拉菜单效果
    获取当前时间getDate()注意点
    全心加入web前端开发,向上吧!
  • 原文地址:https://www.cnblogs.com/firmly-believe/p/10719261.html
Copyright © 2011-2022 走看看