《2022年Android_Intent_数据存取_ContentProvider .pdf》由会员分享,可在线阅读,更多相关《2022年Android_Intent_数据存取_ContentProvider .pdf(21页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、Android 组件之间的信使Intent 一、Intent 作用Intent ?nt ?nt是一个将要执行的动作的抽象的描述,一般来说是作为参数来使用,由 Intent 来协助完成在android 三大核心组件之间的通讯。Activity :使用Context.startActivity(Intent)或 Activity.startActivityForRestult(Intent,int)去启动一个活动或使一个已存在的活动去做新的事情。Service:使用 Context.startService(Intent) 去初始化一个service 或传递一个新的指令给正在 运 行 的servi
2、ce 。 类 似 的 , 一 个intent可 以 传 递 给Context.bindService(Intent, ServiceConnection, int)去建立调用组件和目标服务之间的连接。Broadcast Receiver:一个 intent 对象传递给任何广播方法(如Context.sendBroadcast(),Context.sendOrderedBroadcast() , Context.sendStickyBroadcast()) ,都将传递到所有感兴趣的广播接收者。所以可以看出来, intent 主要是用来启动其他的activity 或者 service,所以可以将i
3、ntent理解成 activity 之间的粘合剂,是Android 组件之间的信使。二、Intent的构成要在不同的activity 之间传递数据,就要在intent 中包含相应的东西,一般来说数据中最基本的应该包括:Action 用来指明要实施的动作是什么,比如说ACTION_VIEW , ACTION_EDIT等。具体的可以查阅android-sdk/docs/reference/android/content/Intent.html中的Android.content.intent类,里面的constants 中定义了所有的action。一个 intent 对象的动作通过setAction
4、()方法设置(或在创建对象时设置),通过getAction()方法读取。比如:Intent i= new Intent( Intent.ACTION_SHUTDOWN); sendBroadcast( i ); 实现关机Data 要实施的具体的数据,一般由一个Uri 变量来表示,URI:通用资源标志符(Uniform Resource Identifier, 简称 URI)一般情况下数据类型能够从URI 中推测, 特别是 content:URIs,它表示位于设备上的数据且被内容提供者(content provider )控制。但是类型也能够显示地设置,setData()方法指定数据的URI,s
5、etType()指定 MIME 类型, setDataAndType()指定数据的URI 和 MIME 类型。通过 getData()读取 URI,getType()读取类型。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 21 页 - - - - - - - - - 比如显示拨号界面:Uri uri =Uri.parse(tel:10086); Intent it = new Intent(Intent.ACTION_DIAL,uri); startActivity(i
6、t);除了 Action 和 data 这两个最基本的元素外,intent 还包括一些其他的元素:Category(类别) : 这个选项指定了将要执行的这个action 的其他一些额外的信息, 例如LAUNCHER_CATEGORY 表示 Intent 的接受者应该在Launcher 中作为顶级应用出现;而 ALTERNATIVE_CATEGORY表示当前的Intent 是一系列的可选动作中的一个,这些动作可以在同一块数据上执行。具体同样可以参考Android.content.intent类。addCategory()方法添加一个种类到Intent 对象中,removeCategory()方法
7、删除一个之前添加的种类, getCategories()方法获取Intent 对象中的所有种类。比如打开计算器界面:Intent it = new Intent(Intent. ACTION_MAIN); it.addCategory(Intent.CATEGORY_APP_CALCULATOR); startActivity(it); Type(数据类型) : 显式指定Intent 的数据类型( MIME ) 。一般 Intent 的数据类型能够根据数据本身进行判定,但是通过设置这个属性,可以强制采用显式指定的类型而不再进行推导。setType(String type) getType()
8、比如:Intent it = newIntent(Intent.ACTION_VIEW); it.putExtra(sms_body, TheSMS text); it.setType(vnd.android-dir/mms-sms); startActivity(it);component(组件): 指定 Intent 的的目标组件的类名称。通常Android 会根据 Intent 中包含的其它属性的信息,比如action、data/type 、category 进行查找,最终找到一个与之匹配的目标组件。但是,如果component 这个属性有指定的话,将直接使用它指定的组件,而不再执行上述
9、查找过程。指定了这个属性以后,Intent 的其它所有属性都是可选的。setComponent(ComponentName component) getComponent() Intent 分成两类Explicit Intents (显性 intent ) :指定 component 运行指定组件。Implicit Intents (隐性 intent ) :指定 action,data,category, type, 来由系统决定调用某个组件的类。比如:Intent i = new Intent();名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - -
10、 - - - - - 名师精心整理 - - - - - - - 第 2 页,共 21 页 - - - - - - - - - ComponentName cn = newComponentName(com.yellowbook.android2,com.yellowbook.android2.AndroidSearch);/ 组件包名称,组件类名称i.setComponent(cn);i.setAction(android.intent.action.MAIN);startActivityForResult(i, RESULT_OK); extras (附加信息) ,是其它所有附加信息的集合。
11、使用 extras 可以为组件提供扩展信息,比如,如果要执行“发送电子邮件”这个动作,可以将电子邮件的标题、正文等保存在 extras 里,传给电子邮件发送组件。putExtra(String name, 各式各样的value) getExtras() 综上可以看出,action、 data/type 、category 和 extras 一起形成了一种语言,这种语言可以是 android 可以表达出诸如“给张三打电话”之类的短语组合。三、intent的解析活动、服务、广播接收者为了告知系统能够处理哪些隐式intent ,它们可以有一个或多个 intent 过滤器。每个过滤器描述组件的一种能力
12、,即乐意接收的一组intent 。实际上,它筛掉不想要的intents,也仅仅是不想要的隐式intents 。一个显式 intent 总是能够传递到它的目标组件,不管它包含什么;不考虑过滤器。但是一个隐式intent ,仅当它能够通过组件的过滤器之一才能够传递给它。一个组件的能够做的每一工作有独立的过滤器。例如, 记事本中的NoteEditer 活动有两个过滤器, 一个是启动一个指定的记录,用户可以查看和编辑;另一个是启动一个新的、空的记录,用户能够填充并保存。一个 intent 过滤器是一个IntentFilter类的实例。 因为 Android 系统在启动一个组件之前必须知道它的能力,但是
13、 intent 过滤器通常不在java 代码中设置, 而是在应用程序的清单文件( AndroidManifest.xml )中以 元素设置。但有一个例外,广播接收者的过滤器通过调用Context.registerReceiver() 动态地注册,它直接创建一个IntentFilter 对象。一个过滤器有对应于Intent 对象的动作、数据、种类的字段。过滤器要检测隐式intent的所有这三个字段,其中任何一个失败,Android 系统都不会传递intent 给组件。然而,因为一个组件可以有多个intent 过滤器, 一个 intent 通不过组件的过滤器检测,其它的过滤器可能通过检测。1.动作
14、测试Java代码 元素中可以包括子元素,比如: 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 21 页 - - - - - - - - - 一条 元素至少应该包含一个,否则任何Intent 请求都不能和该 匹配。如果Intent 请求的 Action 和 中个某一条 匹配,那么该 Intent 就通过了这条 的动作测试。 如果 Intent 请求或 中没有说明具体的Action 类型,那么会出现下面两种情况。(1) 如果 中没有包含任何Action 类型,那么无论什么I
15、ntent 请求都无法和这条 匹配 ; (2) 反之, 如果 Intent 请求中没有设定Action 类型, 那么只要 中包含有Action 类型,这个Intent 请求就将顺利地通过 的行为测试。 2.类别测试 元素可以包含子元素,比如: . . . 只有当 Intent 请求中所有的Category 与组件中某一个Intent-Filter 的完全匹配时,才会让该Intent 请求通过测试,Intent-Filter 中多余的 声明并不会导致匹配失败。一个没有指定任何类别测试的Intent-Filter仅仅只会匹配没有设置类别的Intent 请求。 3.数据测试数据在 中的描述如下: J
16、ava代码 . . . 每个 元素指定一个URI和数据类型(MIME 类型)。它有四个属性schemeskim、host、port 、path 对应于 URI 的每个部分:scheme:/host:port/path 例如,下面的URI:content:/com.example.project:200/folder/subfolder/etc scheme 是 content ,host 是com.example.project ,port 是 200,path 是folder/subfolder/etc 。host 和 port 一起构成 URI 的凭据 (authority ) ,如果 h
17、ost 没有指定, port 也被忽略。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 21 页 - - - - - - - - - 这四个属性都是可选的,但它们之间并不都是完全独立的。要让 authority 有意义, scheme必须也要指定。要让path 有意义, scheme 和 authority 也都必须要指定。当比较 intent 对象和过滤器的URI 时,仅仅比较过滤器中出现的URI属性。例如,如果一个过滤器仅指定了scheme,所有有此scheme 的
18、URIs 都匹配过滤器;如果一个过滤器指定了 scheme 和 authority ,但没有指定path,所有匹配scheme 和 authority 的 URIs都通过检测,而不管它们的path;如果四个属性都指定了,要都匹配才能算是匹配。然而,过滤器中的 path 可以包含通配符来要求匹配path 中的一部分。元素的 type 属性指定数据的MIME 类型。 Intent 对象和过滤器都可以用* 通配符匹配子类型字段,例如text/*,audio/* 表示任何子类型。数据检测既要检测URI,也要检测数据类型。规则如下:一个 Intent 对象既不包含URI,也不包含数据类型:仅当过滤器也不
19、指定任何URIs和数据类型时,才不能通过检测;否则都能通过。一个 Intent 对象包含URI,但不包含数据类型:仅当过滤器也不指定数据类型,同时它们的 URI 匹配,才能通过检测。例如,mailto: 和 tel:都不指定实际数据。一个 Intent 对象包含数据类型,但不包含URI:仅当过滤也只包含数据类型且与Intent相同,才通过检测。一个 Intent 对象既包含URI,也包含数据类型(或数据类型能够从URI 推断出):数据类型部分,只有与过滤器中之一匹配才算通过;URI 部分,它的URI要出现在过滤器中,或者它有 content: 或 file: URI,又或者过滤器没有指定URI
20、。换句话说,如果它的过滤器仅列出了数据类型,组件假定支持content: 和 file: 。如果一个Intent 能够通过不止一个活动或服务的过滤器,用户可能会被问那个组件被激活。如果没有目标找到,会产生一个异常。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 21 页 - - - - - - - - - 三、 Intent的构造函数一公共构造函数:1、Int ent() 空构造函数2、Int ent(Intent o) 拷贝构造函数3、Int ent(String ac
21、tion) 指定 action类型的构造函数4、Int ent(String action, Uri uri) 指定 Action类型和 Uri 的构造函数, URI 主要是结合程序之间的数据共享Cont entProvider 5、Int ent(Context packageContext, Class cls) 传入组件的构造函数,也就是上文提到的6、Int ent(String action, Uri uri, Context packageContext, Class cls) 前两种结合体Intent有六种构造函数, 3、4、5 是最常用的,并不是其他没用!Intent(Strin
22、g action, Uri uri) 的 action就是对应在 AndroidMainfest.xml中的 action节点的 name 属性值。在Intent类中定义了很多的Action和 Category常量。二示例代码: Intent intent = new Intent(Intent.ACTION_EDIT, null); start Activity(intent); 示例代码是用了第四种构造函数,只是uri 参数为 null 。执行此代码的时候,系统就会在程序主配置文件AndroidMainfest.xml中寻找对应的 Activity, 如果对应为多个 activity具有此
23、时就会弹出一个dailog选择 Activit y,如下图:三、利用 Intent在 Activity之间传递数据深入浅出 _Google_Android.pdf 里面讲了一个 BMI 的例子Intent it= new Intent();it.setClass(Bmi.this, Report.class);Bundle bundle = new Bundle();名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 21 页 - - - - - - - - - bundle
24、.putString(KEY_HEIGHT, field_height.getText().toString();bundle.putString(KEY_WEIGHT, field_weight.getText().toString();it.putExtras(bundle); startActivity(it);Bundle bunde = this.getIntent().getExtras();double height = Double.parseDouble(bunde.getString(KEY_HEIGHT)/100;double weight = Double.parseD
25、ouble(bunde.getString(KEY_WEIGHT); 5. 一些 intent 实例1. 从 google 搜索内容Intent intent = new Intent(); intent.setAction(Intent.ACTION_WEB_SEARCH);intent.putExtra(SearchManager.QUERY,searchString)startActivity(intent);2.浏览网页Uri uri =Uri.parse(http:/);Intent it = new Intent(Intent.ACTION_VIEW,uri);startActiv
26、ity(it);3.显示地图Uri uri = Uri.parse(geo:38.899533,-77.036476);Intent it = newIntent(Intent.Action_VIEW,uri);startActivity(it);名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 21 页 - - - - - - - - - 4.路径规划Uri uri =Uri.parse(http:/ startLng&daddr=endLat endLng&hl=en)
27、;Intent it = newIntent(Intent.ACTION_VIEW,URI);startActivity(it);5.拨打电话Uri uri =Uri.parse(tel:xxxxxx);Intent it = new Intent(Intent.ACTION_DIAL,uri); startActivity(it);6.调用发短信的程序Intent it = newIntent(Intent.ACTION_VIEW); it.putExtra(sms_body, TheSMS text); it.setType(vnd.android-dir/mms-sms); startA
28、ctivity(it);7.发送短信Uri uri =Uri.parse(smsto:0800000123); Intent it = newIntent(Intent.ACTION_SENDTO, uri); it.putExtra(sms_body, TheSMS text); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 21 页 - - - - - - - - - startActivity(it);String body=this is sms demo;In
29、tent mmsintent = newIntent(Intent.ACTION_SENDTO, Uri.fromParts(smsto, number, null);mmsintent.putExtra(Messaging.KEY_ACTION_SENDTO_MESSAGE_BODY,body);mmsintent.putExtra(Messaging.KEY_ACTION_SENDTO_COMPOSE_MODE,true);mmsintent.putExtra(Messaging.KEY_ACTION_SENDTO_EXIT_ON_SENT,true);startActivity(mmsi
30、ntent);8.发送彩信Uri uri =Uri.parse(content:/media/external/images/media/23); Intent it = newIntent(Intent.ACTION_SEND); it.putExtra(sms_body,some text); it.putExtra(Intent.EXTRA_STREAM, uri); it.setType(image/png); startActivity(it); StringBuilder sb = new StringBuilder();sb.append(file:/);sb.append(fd
31、.getAbsoluteFile();Intent intent = newIntent(Intent.ACTION_SENDTO, Uri.fromParts(mmsto, number, null);/ Below extra datas are all optional.名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 21 页 - - - - - - - - - intent.putExtra(Messaging.KEY_ACTION_SENDTO_MESSAGE_
32、SUBJECT,subject);intent.putExtra(Messaging.KEY_ACTION_SENDTO_MESSAGE_BODY,body);intent.putExtra(Messaging.KEY_ACTION_SENDTO_CONTENT_URI,sb.toString();intent.putExtra(Messaging.KEY_ACTION_SENDTO_COMPOSE_MODE,composeMode); intent.putExtra(Messaging.KEY_ACTION_SENDTO_EXIT_ON_SENT,exitOnSent);startActiv
33、ity(intent);9.发送 Email Uri uri =Uri.parse(mailto:);Intent it = newIntent(Intent.ACTION_SENDTO, uri);startActivity(it);Intent it = new Intent(Intent.ACTION_SEND); it.putExtra(Intent.EXTRA_EMAIL,); it.putExtra(Intent.EXTRA_TEXT, Theemail body text); it.setType(text/plain); startActivity(Intent.createC
34、hooser(it,Choose Email Client); Intent it=new Intent(Intent.ACTION_SEND); String tos=; Stringccs=; it.putExtra(Intent.EXTRA_EMAIL, tos); it.putExtra(Intent.EXTRA_CC, ccs); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 21 页 - - - - - - - - - it.putExtra(Intent
35、.EXTRA_TEXT, Theemail body text); it.putExtra(Intent.EXTRA_SUBJECT, Theemail subject text); it.setType(message/rfc822); startActivity(Intent.createChooser(it,Choose Email Client); Intent it = newIntent(Intent.ACTION_SEND); it.putExtra(Intent.EXTRA_SUBJECT, Theemail subject text); it.putExtra(Intent.
36、EXTRA_STREAM,file:/sdcard/mysong.mp3); sendIntent.setType(audio/mp3); startActivity(Intent.createChooser(it,Choose Email Client); 10.播放多媒体Intent it = new Intent(Intent.ACTION_VIEW);Uri uri =Uri.parse(file:/sdcard/song.mp3);it.setDataAndType(uri,audio/mp3);startActivity(it);Uri uri =Uri.withAppendedP
37、ath(MediaStore.Audio.Media.INTERNAL_CONTENT_URI,1); Intent it = new Intent(Intent.ACTION_VIEW,uri); startActivity(it);名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 21 页 - - - - - - - - - 11.uninstall apk Uri uri =Uri.fromParts(package, strPackageName, null);
38、Intent it = newIntent(Intent.ACTION_DELETE, uri); startActivity(it);12.install apk Uri installUri = Uri.fromParts(package,xxx, null);returnIt = newIntent(Intent.ACTION_PACKAGE_ADDED, installUri);13. 打开照相机Intent i = new Intent(Intent.ACTION_CAMERA_BUTTON, null);this.sendBroadcast(i);long dateTaken =
39、System.currentTimeMillis();String name = createName(dateTaken) + .jpg;fileName = folder + name; ContentValues values = new ContentValues();values.put(Images.Media.TITLE, fileName);values.put(_data, fileName);values.put(Images.Media.PICASA_ID, fileName);values.put(Images.Media.DISPLAY_NAME, fileName)
40、;values.put(Images.Media.DESCRIPTION, fileName);名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 12 页,共 21 页 - - - - - - - - - values.put(Images.ImageColumns.BUCKET_DISPLAY_NAME, fileName);Uri photoUri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONT
41、ENT_URI,values);Intent inttPhoto = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);inttPhoto.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);startActivityForResult(inttPhoto, 10);14.从 gallery 选取图片Intent i = new Intent();i.setType(image/*); i.setAction(Intent.ACTION_GET_CONTENT);startActivityForResult(i, 11)
42、;15. 打开录音机Intent mi = new Intent(Media.RECORD_SOUND_ACTION);startActivity(mi);16.显示应用详细列表Uri uri =Uri.parse(market:/details?id=app_id); Intent it = new Intent(Intent.ACTION_VIEW,uri); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 13 页,共 21 页 - - - - - - - - - startA
43、ctivity(it); /where app_id is the application ID, findthe ID /by clicking on your application on Markethome /page, and notice the ID from the addressbar 刚才找 app id 未果,结果发现用package name 也可以Uri uri =Uri.parse(market:/details?id=);这个简单多了17 寻找应用Uri uri =Uri.parse(market:/search?q=pname:pkg_name); Intent
44、 it = new Intent(Intent.ACTION_VIEW,uri); startActivity(it);/where pkg_name is the full package pathfor an application 18 打开联系人列表 Intent i = new Intent();i.setAction(Intent.ACTION_GET_CONTENT);i.setType(vnd.android.cursor.item/phone);startActivityForResult(i, REQUEST_TEXT);名师资料总结 - - -精品资料欢迎下载 - - -
45、 - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 14 页,共 21 页 - - - - - - - - - Uri uri = Uri.parse(content:/contacts/people);Intent it = new Intent(Intent.ACTION_PICK, uri);startActivityForResult(it, REQUEST_TEXT);19 打开另一程序Intent i = new Intent();ComponentName cn = newComponentName(com.yellowbo
46、ok.android2,com.yellowbook.android2.AndroidSearch);i.setComponent(cn);i.setAction(android.intent.action.MAIN);startActivityForResult(i, RESULT_OK); 20.调用系统编辑添加联系人(高版本SDK 有效):Intent it = newIntent(Intent.ACTION_INSERT_OR_EDIT);it.setType(vnd.android.cursor.item/contact);/it.setType(Contacts.CONTENT_I
47、TEM_TYPE);it.putExtra(name,myName);it.putExtra(android.provider.Contacts.Intents.Insert.COMPANY, organization); it.putExtra(android.provider.Contacts.Intents.Insert.EMAIL,email);名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 15 页,共 21 页 - - - - - - - - - it.putExtra(
48、android.provider.Contacts.Intents.Insert.PHONE,homePhone); it.putExtra(android.provider.Contacts.Intents.Insert.SECONDARY_PHONE, mobilePhone);it.putExtra( android.provider.Contacts.Intents.Insert.TERTIARY_PHONE, workPhone);it.putExtra(android.provider.Contacts.Intents.Insert.JOB_TITLE,title); startA
49、ctivity(it);21.调用系统编辑添加联系人(全有效):Intent intent = newIntent(Intent.ACTION_INSERT_OR_EDIT);intent.setType(People.CONTENT_ITEM_TYPE);intent.putExtra(Contacts.Intents.Insert.NAME,My Name);intent.putExtra(Contacts.Intents.Insert.PHONE, +1234567890);intent.putExtra(Contacts.Intents.Insert.PHONE_TYPE,Contac
50、ts.PhonesColumns.TYPE_MOBILE);intent.putExtra(Contacts.Intents.Insert.EMAIL, ); intent.putExtra(Contacts.Intents.Insert.EMAIL_TYPE, Contacts.ContactMethodsColumns.TYPE_WORK);startActivity(intent);。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 16 页,共 21 页 - - - - - -