引言

上篇我们介绍了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给短信程序。下面介绍如何一步一步实现类似的功能,而且是在之前中发送SMS的例子(TextMessage)基础上加上从通讯录中选择联系人的功能。

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

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

====================================contact.xml

<?xml version

<LinearLayout

android:layout_height

<ListView

android:layout_height

=================================== listitemlayout

<?xml version

<LinearLayout

android:orientation="vertical"

android:layout_height

<TextView android:id="@+id/itemTextView"

android:layout_height

android:textSize="16px"

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

<Button

android:layout_height="wrap_content"

记得还有在values/strings.xml中相应的加入<string 。

STEP2、添加Button的点击事件

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

btnContact = (Button) findViewById(R.id.

btnContact.setOnClickListener(new View.OnClickListener() {

public void onClick(View v) {

// TODO Auto-generated method stub

Intent intent = new

ContactsContract.Contacts.

startActivityForResult(intent,

STEP3、添加通讯录活动

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

import android.app.Activity;

import android.content.Intent;

import android.database.Cursor;

import android.os.Bundle;

import android.provider.ContactsContract;

import android.view.View;

import android.widget.AdapterView;

import android.widget.ListView;

import android.widget.SimpleCursorAdapter;

import android.widget.AdapterView.OnItemClickListener;

public class ContactPick extends Activity {

/** Called when the activity is first created. */

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.

Intent orgIntent=getIntent();

Uri queryUri=orgIntent.getData();

final Cursor c = managedQuery(queryUri,

String[] fromColumns=new String[]{ContactsContract.Contacts.

int[] toLayoutIDs = new

SimpleCursorAdapter adapter = new SimpleCursorAdapter(

R.layout.listitemlayout, c, fromColumns, toLayoutIDs);

ListView lv = (ListView) findViewById(R.id.

lv.setAdapter(adapter);

lv.setOnItemClickListener(new OnItemClickListener() {

public void onItemClick(AdapterView<?> parent, View view,

c.moveToPosition(pos);

int rowId = c.getInt(c.getColumnIndexOrThrow(ContactsContract.Contacts.

Uri outURI = Uri.parse(ContactsContract.Contacts.

Intent outData =

outData.setData(outURI);

setResult(Activity.

}

STEP4、解析通讯录返回的数据

从通讯录活动返回之后,我们从返回的Intent中提取数据并填充到填写电话号码的EditView中。代码主要如下:

public void onActivityResult(int reqCode, int resCode, Intent data) {

super.onActivityResult(reqCode, resCode, data);

switch (reqCode) {

case

if (resCode == Activity.

String name;

Uri contactData = data.getData();

Cursor c = managedQuery(contactData, null, null

c.moveToFirst();

name = c.getString(c.getColumnIndex(ContactsContract.Contacts.

tv = (TextView)findViewById(R.id.

tv.setText(name);

}

STEP5、在清单文件AndroidManifest.xml中注册通讯录活动和读取Contact数据库的权限

主要工作基本做完了,现在我们只需要注册通讯录活动和读取Contact数据的权限了。完整的清单文件代码如下:

<?xml version

<activity android:name=".TextMessage"

<action android:name

<category android:name

<activity android:name=".ContactPick"

<action android:name

<category android:name

<uses-permission android:name

<uses-permission android:name

注意通讯录活动的Intent Filters,它的action是android.intent.action.PICK;category是android.intent.category.DEFAULT。现在我们分析一下这个Intent Filter:

<action android:name:使用户能够可以在通讯录列表中选择一个,然后将选择的联系人的 URL返回给调用者。 <category android:name:这是默认的category,如果不知道category系统会自动加上。这个属性是让使其能够被像Context.startActivity()等找到。要说明的的是,如果列举了多个category,这个活动仅会去处理那些Intent中都包含了所有列举的category的组件。

我们还可以在清单文件中看到TextMessage活动的Intent Filter:

<action android:name

<category android:name

它指TextMessage活动定是真个程序的入口并且TextMessage会列举在Launcher即启动列表中。

程序运行结果如下图所示:

图1、主界面

图2、点击contact按钮之后

图3、选择一个联系人之后

总结

我们用发短信中选择联系人的例子说明Intent和Intent Filter,这里体现了两个活动之间如何通过Intent和Intent Filter来交互,这也是我们在编写Android应用程序的时候经常遇到了。本文除了上述的主要内容之外,还涉及别的知识点,下面列举几个个人认为比较有用的知识点:

Cursor类它跟我们平时用的数据库中的游标类似,它提供了对从数据库返回的结果的随机读写操作。如我们例子中用到的,通过managedQuery方法 查询数据库并返回结果,然后利用Cursor对它进行操作。下面介绍Cursor类的几个方法(我们例子中用到的,更多的方法请自行查阅相关资料): public abstract int getColumnIndexOrThrow (String columnName):返回给定列名的索引(注意:从0开始的),或者当列名不存在时抛出llegalArgumentException异常; public abstract boolean moveToFirst ():移动到第一行。如果Cursor为空,则返回FALSE public abstract boolean moveToPosition (int position):将游标移动到一个指定的位置,它的范围在-1 <= position <= count。如果position位置不可达,返回FALSE managedQuery方法:根据指定的URI路径信息返回包含特定数据的Cursor对象,应用这个方法可以使Activity接管返回数据对象的生命周期。参数:
URI: Content Provider 需要返回的资源索引
Projection: 用于标识有哪些columns需要包含在返回数据中
Selection: 作为查询符合条件的过滤参数,类似于SQL语句中Where之后的条件判断
SelectionArgs: 同上
SortOrder: 用于对返回信息进行排序 SimpleCursorAdapter允许你绑定一个游标的列到ListView上,并使用自定义的layout显示每个项目。SimpleCursorAdapter的创建,需要传入当前的上下文、一个layout资源,一个游标和两个数组:一个包含使用的列的名字,另一个(相同大小)数组包含View中的资源ID,用于显示相应列的数据值。

本系列的其它文章:


作者:吴秦
出处:http://www.cnblogs.com/skynet/
本文基于署名 2.5 中国大陆许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名吴秦(包含链接).

Add your comment 8 条回复向楼主请教一个问题,如果我想将通讯录里面的各个联系人调换顺序,应该怎么处理? 呵呵 专门申请个账号来支持楼主 谢谢楼主写了这么多好文章 这个系列很不错,可惜楼主没有后续更新了啊~~ 楼主,不知道你能否看到,我一直在看你这个系列的教程,写的比较仔细,但是这一片当中有一行代码:startActivityForResult(intent,PICK_CONTACT);中的PICK_CONTACT这个常量需要自己定义吗?Eclipse不识别,是不是应该添加什么引用,希望作者能指点下。谢谢了 引用神经病:楼主,不知道你能否看到,我一直在看你这个系列的教程,写的比较仔细,但是这一片当中有一行代码:startActivityForResult(intent,PICK_CONTACT);中的PICK_CONTACT这个常量需要自己定义吗?Eclipse不识别,是不是应该添加什么引用,希望作者能指点下。谢谢了

自己定义的,int常量, 例如,final int REQUESTCODE=1

Copyright ©2011 吴秦




更多相关文章

  1. Android练手小项目(KTReader)基于mvp架构(二)
  2. android Content Provider的使用
  3. SQlite字段类型升级
  4. Android(安卓)TTS学习——TTS初体验
  5. Android(安卓)4.0.3 联系人(通讯录)应用源码学习
  6. 在android中使用OrmLite数据库框架
  7. Android中文件读写操作
  8. Android移动存储
  9. Android用SharedPreferences记住用户名

随机推荐

  1. Linux下mysql 8.0安装教程
  2. CentOS 6、7下mysql 5.7 详细安装教程
  3. linux下mysql忘记密码的解决方法
  4. CentOS 7下mysql 5.7 安装教程
  5. MySQL错误代码1862 your password has ex
  6. CentOS 7安装MySQL的详细步骤
  7. MySQL 5.7.22 二进制包安装及免安装版Win
  8. MySQL中因字段字符集不同导致索引不能命
  9. mysql 8.0.12安装配置方法图文教程(Window
  10. mysql 8.0.12 安装配置方法并修改密码