引言

上篇我们介绍了Intents和Intent Filters的理论部分,主要是介绍了:activities、services、broadcast receivers三种组件的Intent机制两种Intent(显式和隐式)及它们如何去匹配目的组件、Intent对象包含哪些信息、Intent Filters的action & category & data。

Intent的重要性,我不再着重介绍了,但我还是要说:Intent能够使应用程序突破沙盒与外界交流,者这使得Android的世界变得丰富多彩!本篇将用实例来介绍,如何应用Intent,而且继续用SMS方面的例子来阐述。本文的主要内容如下:

  • 例子(需求)描述
  • STEP1、添加用于显示通讯录的布局文件
  • STEP2、添加Button的点击事件
  • STEP3、添加通讯录活动
  • STEP4、解析通讯录返回的数据
  • STEP5、在清单文件AndroidManifest.xml中注册通讯录活动和读取Contact数据库的权限
  • 总结

例子(需求)描述

用手机发过SMS的人都知道:

  • 用户可以先编辑短信,然后再去通讯录中选择相应的人并发生给他。
  • 用户可以在短信内容中插入通讯录中联系人的号码。

我们的这个例子就是要说明如何实现这个功能。要实现这个功能,即是创建一个新的Activity选择(ACTION_PICK)通讯录中的数据,它会显示通讯录中的所有联系人并让用户选择,然后关闭并返回一个联系人的URI给短信程序。下面介绍如何一步一步实现类似的功能,而且是在之前Android 开发之旅:短信的收发及在android模拟器之间实践(一)中发送SMS的例子(TextMessage)基础上加上从通讯录中选择联系人的功能。

STEP1、添加用于显示通讯录的布局文件

我们用一个ListView来显示整个通讯录,其中用TextView显示每一记录。它们的xml文件分别为contact.xml、listitemlayout,如下所示:

====================================contact.xml 
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<ListView android:id="@+id/contactListView"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
</LinearLayout> 
===================================
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView android:id="@+id/itemTextView" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:padding="10px"
android:textSize="16px" android:textColor="#FFF" />
</LinearLayout>

为了能够打开通讯录,我们还需要在TextMessage程序中加入一个Button btnContact,通过点击btnContact激活显示通讯录的活动。这只需在main.xml文件中加入如下代码:

<Button android:layout_width="wrap_content"
android:layout_height="wrap_content" android:text="@string/btnContact"

 

android:id="@+id/btnContact"
       />

 

记得还有在values/strings.xml中相应的加入<string name="btnContact">contact</string>。

STEP2、添加Button的点击事件

在上面准备工作做完之后,我们需要监听btnContact的点击事件,当用户点击btnContact时,跳转显示通讯录界面,当用户选择一个联系人之后,返回SMS程序的主界面。这里就要用到了伟大的Intent啦

btnContactbtnContact);
btnContact.setOnClickListener(new View.OnClickListener() {
@Override
publicvoid onClick(View v) {
// TODO Auto-generated method stub
newACTION_PICK,
CONTENT_URI);
PICK_CONTACT);
    }
 
});

STEP3、添加通讯录活动

添加一个类文件,类名为ContactPick(表示通讯录活动名)继承Activity。它的主要功能就是获取从SMS主程序传递来的Intent并提取数据;然后去查询通讯录数据库,取出数据并填充到STEP1中定义的ListView;最后,还需要添加当用户选择一个联系人的事件onItemClick,将结果返回给SMS主程序,这里也用到了我们伟大的Intent!代码如下:

package skynet.com.cnblogs.www;
 
import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
importandroid.widget.SimpleCursorAdapter;
import android.widget.AdapterView.OnItemClickListener;
 
publicclassextends Activity {
/** Called when the activity is first created. */
@Override
publicvoid onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
main);
 
        Intent orgIntent=getIntent();
        Uri queryUri=orgIntent.getData();        
final Cursor c = managedQuery(queryUri,
null, 
null,
null,
null);
        
newDISPLAY_NAME};
int[] toLayoutIDs = newint[] { R.id.itemTextView };
SimpleCursorAdapter adapter = newSimpleCursorAdapter(this,
listitemlayout, c, fromColumns, toLayoutIDs);
contactListView);
        lv.setAdapter(adapter);
new OnItemClickListener() {
@Override
publicvoidint pos,
long id) {
                c.moveToPosition(pos);    
int_ID));
                Uri outURI = Uri.parse(ContactsContract.Contacts.CONTENT_URI.toString() + rowId);
new Intent();
                outData.setData(outURI);
RESULT_OK,outData);
                finish();
            }
        });
    }
}