Android开发Intents和Intent filters实例.docx
- 文档编号:14864174
- 上传时间:2023-06-28
- 格式:DOCX
- 页数:14
- 大小:138.26KB
Android开发Intents和Intent filters实例.docx
《Android开发Intents和Intent filters实例.docx》由会员分享,可在线阅读,更多相关《Android开发Intents和Intent filters实例.docx(14页珍藏版)》请在冰点文库上搜索。
Android开发Intents和Intentfilters实例
引言
上篇我们介绍了Intents和IntentFilters的理论部分,主要是介绍了:
activities、services、broadcastreceivers三种组件的Intent机制两种Intent(显式和隐式)及它们如何去匹配目的组件、Intent对象包含哪些信息、IntentFilters的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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
xmlversion="1.0"encoding="utf-8"?
>
android=" android: orientation="vertical" android: layout_width="fill_parent" android: layout_height="fill_parent" > id="@+id/contactListView" android: layout_width="fill_parent" android: layout_height="wrap_content" /> ===================================listitemlayout 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 xmlversion="1.0"encoding="utf-8"? > android=" android: orientation="vertical"android: layout_width="fill_parent" android: layout_height="fill_parent"> id="@+id/itemTextView"android: layout_width="wrap_content" android: layout_height="wrap_content"android: padding="10px" android: textSize="16px"android: textColor="#FFF"/> 为了能够打开通讯录,我们还需要在TextMessage程序中加入一个ButtonbtnContact,通过点击btnContact激活显示通讯录的活动。 这只需在main.xml文件中加入如下代码: 1 2 3 4 layout_width="wrap_content" android: layout_height="wrap_content"android: text="@string/btnContact" android: id="@+id/btnContact" /> 记得还有在values/strings.xml中相应的加入contact。 STEP2、添加Button的点击事件 在上面准备工作做完之后,我们需要监听btnContact的点击事件,当用户点击btnContact时,跳转显示通讯录界面,当用户选择一个联系人之后,返回SMS程序的主界面。 这里就要用到了伟大的Intent啦! btnContact=(Button)findViewById(R.id.btnContact); btnContact.setOnClickListener(newView.OnClickListener(){ @Override publicvoidonClick(Viewv){ //TODOAuto-generatedmethodstub Intentintent=newIntent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI); startActivityForResult(intent,PICK_CONTACT); } }); STEP3、添加通讯录活动 添加一个类文件,类名为ContactPick(表示通讯录活动名)继承Activity。 它的主要功能就是获取从SMS主程序传递来的Intent并提取数据;然后去查询通讯录数据库,取出数据并填充到STEP1中定义的ListView;最后,还需要添加当用户选择一个联系人的事件onItemClick,将结果返回给SMS主程序,这里也用到了我们伟大的Intent啦! 代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 packageblogs.www; importandroid.app.Activity; importandroid.content.Intent; importandroid.database.Cursor; import.Uri; importandroid.os.Bundle; importandroid.provider.ContactsContract; importandroid.view.View; importandroid.widget.AdapterView; importandroid.widget.ListView; importandroid.widget.SimpleCursorAdapter; importandroid.widget.AdapterView.OnItemClickListener; publicclassContactPickextendsActivity{ /**Calledwhentheactivityisfirstcreated.*/ @Override publicvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); IntentorgIntent=getIntent(); UriqueryUri=orgIntent.getData(); finalCursorc=managedQuery(queryUri, null, null, null, null); String[]fromColumns=newString[]{ContactsContract.Contacts.DISPLAY_NAME}; int[]toLayoutIDs=newint[]{R.id.itemTextView}; SimpleCursorAdapteradapter=newSimpleCursorAdapter(this, R.layout.listitemlayout,c,fromColumns,toLayoutIDs); ListViewlv=(ListView)findViewById(R.id.contactListView); lv.setAdapter(adapter); lv.setOnItemClickListener(newOnItemClickListener(){ @Override publicvoidonItemClick(AdapterView >parent,Viewview,intpos, longid){ c.moveToPosition(pos); introwId=c.getInt(c.getColumnIndexOrThrow(ContactsContract.Contacts._ID)); UrioutURI=Uri.parse(ContactsContract.Contacts.CONTENT_URI.toString()+rowId); IntentoutData=newIntent(); outData.setData(outURI); setResult(Activity.RESULT_OK,outData); finish(); } }); } } STEP4、解析通讯录返回的数据 从通讯录活动返回之后,我们从返回的Intent中提取数据并填充到填写电话号码的EditView中。 代码主要如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 @Override publicvoidonActivityResult(intreqCode,intresCode,Intentdata){ super.onActivityResult(reqCode,resCode,data); switch(reqCode){ case(PICK_CONTACT): { if(resCode==Activity.RESULT_OK){ Stringname; UricontactData=data.getData(); Cursorc=managedQuery(contactData,null,null,null,null); c.moveToFirst(); name=c.getString(c.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); TextViewtv; tv=(TextView)findViewById(R.id.edtPhoneNo); tv.setText(name); } break; } } } STEP5、在清单文件AndroidManifest.xml中注册通讯录活动和读取Contact数据库的权限 主要工作基本做完了,现在我们只需要注册通讯录活动和读取Contact数据的权限了。 完整的清单文件代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 xmlversion="1.0"encoding="utf-8"? > android=" package="blogs.www"android: versionCode="1" android: versionName="1.0"> name=".TextMessage"android: label="@string/app_name"> name="android.intent.action.MAIN"/> name="android.intent.category.LAUNCHER"/> name=".ContactPick"android: label="@string/app_name"> name="android.intent.action.PICK"/> name="android.intent.category.DEFAULT"/> name="android.permission.SEND_SMS"/> name="android.permission.READ_CONTACTS"/> 注意通讯录活动的IntentFilters,它的action是android.intent.action.PICK;category是android.intent.category.DEFAULT。 现在我们分析一下这个IntentFilter: “android.intent.action.PICK”/>: 使用户能够可以在通讯录列表中选择一个,然后将选择的联系人的URL返回给调用者。 “android.intent.category.DEFAULT”/>: 这是默认的category,如果不知道category系统会自动加上。 这个属性是让使其能够被像Context.startActivity()等找到。 要说明的的是,如果列举了多个category,这个活动仅会去处理那些Intent中都包含了所有列举的category的组件。 我们还可以在清单文件中看到TextMessage活动的IntentFilter: “android.intent.action.MAIN”/> “android.intent.category.LAUNCHER”/> 它指TextMessage活动定是真个程序的入口并且TextMessage会列举在Launcher即启动列表中。 程序运行结果如下图所示: 主界面 图2、点击contact按钮之后 图3、选择一个联系人之后 总结 我们用发短信中选择联系人的例子说明Intent和IntentFilter,这里体现了两个活动之间如何通过Intent和IntentFilter来交互,这也是我们在编写Android应用程序的时候经常遇到了。 本文除了上述的主要内容之外,还涉及别的知识点,下面列举几个个人认为比较有用的知识点: Cursor类它跟我们平时用的数据库中的游标类似,它提供了对从数据库返回的结果的随机读写操作。 如我们例子中用到的,通过managedQuery方法查询数据库并返回结果,然后利用Cursor对它进行操作。 下面介绍Cursor类的几个方法(我们例子中用到的,更多的方法请自行查阅相关资料): publicabstractintgetColumnIndexOrThrow(StringcolumnName): 返回给定列名的索引(注意: 从0开始的),或者当列名不存在时抛出llegalArgumentException异常; publicabstractbooleanmoveToFirst(): 移动到第一行。 如果Cursor为空,则返回FALSE publicabstractbooleanmoveToPosition(intposition): 将游标移动到一个指定的位置,它的范围在-1<=position<=count。 如果position位置不可达,返回FALSE managedQuery方法: 根据指定的URI路径信息返回包含特定数据的Cursor对象,应用这个方法可以使Activity接管返回数据对象的生命周期。 参数: URI: ContentProvider需要返回的资源索引 Projection: 用于标识有哪些columns需要包含在返回数据中 Selection: 作为查询符合条件的过滤参数,类似于SQL语句中Where之后的条件判断 SelectionArgs: 同上 SortOrder: 用于对返回信息进行排序 SimpleCursorAdapter允许你绑定一个游标的列到ListView上,并使用自定义的layout显示每个项目。 SimpleCursorAdapter的创建,需要传入当前的上下文、一个layout资源,一个游标和两个数组: 一个包含使用的列的名字,另一个(相同大小)数组包含View中的资源ID,用于显示相应列的数据值。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Android开发Intents和Intent filters实例 Android 开发 Intents Intent filters 实例