学习Android官方文档(四)--Intent

预备知识:Uri

这部分参考Uri详解,感谢博主

1、Uri与URI的异同

(1)所属的包不同。URI位置在java.net.URI,显然是Java提供的一个类。而Uri位置在android.net.Uri,是由Android提供的一个类。初步可以判断,Uri是URI的“扩展”以适应Android系统的需要。

(2)作用的不同。URI类代表了一个URI(这个URI不是类,而是其本来的意义:通用资源标志符——Uniform Resource Identifier)实例。Uri类是一个不可改变的URI引用,包括一个URI和一些碎片,URI跟在“#”后面。建立并且转换URI引用。而且Uri类对无效的行为不敏感,对于无效的输入没有定义相应的行为,如果没有另外制定,它将返回垃圾而不是抛出一个异常。

总结:Uri是Android开发的,扩展了Java中URI的一些功能来特定的适用于Android开发,所以大家在开发时,只使用Android 提供的Uri即可。

2、Uri组成

(1)[scheme:]scheme-specific-part[#fragment]

(2)[scheme:][//authority][path][?query][#fragment]

(3)[scheme:][//host:port][path][?query][#fragment]

在android中,除了scheme、authority是必须要有的,其它的几个path、query、fragment,它们每一个可以选择性的要或不要,但顺序不能变

3、通过“content://”类型的Uri查询数据

这里用到了Android四大组建中ContentProvider的知识---ContentResolver。

(1)ConentResolver.query(uri , projection , selection , selectionArgs , sortOrder)

1)uri:可以理解为SQL语句的表名

2)projection:理解为SQL语句的列名,搜索哪些列

3)selection:理解为SQL语句的where条件

4)selectionArgs:配合第三个参数使用,当第三个参数中使用了占位符(?)

5)sortOrder:排序规则

(2)上面函数返回一个游标Cursor。下面介绍游标的使用。

若使用游标访问数据,首先使用cursor.moveToFirst()或者cursor.moveTo(int offset)找到一条数据。

然后可以访问某一条数据的某一个字段。使用cursor.getColumnIndex(String columnName)查询某字段的index。

使用cursor.getSting(int index)获取某字段信息。


----------------------------------------------------分割线-------------------------------------------------------


一、使用Intent访问其他Activity

一些通用的使用请参考Android API指南--通用Intent,超级详细。下面详细介绍几个。

1、访问相机拍照并获取照片

(1)将照片保存到外部存储器

重点在于启动相机之前,设置照片的保存路径。

往Intent中放入参数MediaStore.EXTRA_OUTPUT,是一个Uri。而Uri的获取通过文件路径。

当拍照返回后,直接对文件操作就可以(因为已经知道文件的路径了)。当然要判断一下是否拍照了(根据resultCode)

(2)不保存照片,直接使用

这种方法的重点在于拍照后的数据处理。。启动相机时不需要传入任何参数。

照片数据的获取是从Intent的Extra中获取“data”数据,就是一个Bitmap,可以随便使用。

2、访问流文件,图片、文档、音乐、视频等

重点:

(1)使用Intent.ACTIONGET_CONTENT操作。

(2)设置type,image/jpg、image/png、audio/x-mpeg(mp3)、video/mp4等等,如果想匹配多种类型,也可以使用通配符*。

(3)Extra(必须):

EXTRA_ALLOW_MULTIPLE(boolean,声明用户是否可以一次选择多个文件)

EXTRA_LOCAL_ONLY(boolean,声明是否返回的文件必须直接存在于设备上,而不是需要从远程服务下载)

(4)category(可选):CATEGORY_OPENABLE(只返回可通过openFileDescriptor()以文件流形式表示的“可打开”文件)

处理返回数据--通过Uri:

(1)一般会让你从图库或者文件管理器中选择,个人发现,从图库选择返回content://类型的Uri,从文件管理器选择返回file://类型的Uri

(2)如果用户只选择一项,您就可以从getData()检索该项目。如果用户选择多项,则getData()返回 null,此时您必须改为从getClipData()返回的ClipData对象检索每个项目。

(3)ClipData对象,他有很多条数据(类似List),使用getItemAt(int index)得到Item对象,Item可以get到Text,HtmlText,Intent和Uri。

3、使用ACTION.PICK访问图库

Intent(Intent.ACTION_PICK , MediaStore.Images.media.EXTERNAL_CONTENT_URI),也可以添加多选Extra,这种方法是直接跳转到图库,上面会选择是图库或文件管理器或其他。下面是处理得到的图片或其他类型的

特别注意要加入读写(此时仅仅是读)外部存储器的权限,MediaStore.Images.Media.DATA('_data')这个字段中保存的是文件路径。


二、使用Intent发送(分享)数据

1、分享文字

2、分享二进制(流文件)

你也可以分享多条数据,传入一个ArrayList<Uri>即可


三、Activity接受处理Intent数据

如果想让别的应用启动你的Activity,就是分享一些东西,可以这样做

1、在Mainifest.xml文件<activity>标签中添加<intent-filter>标签,消息的传递是通过Intent。

2、<intent-filter>添加三种标签

1)<action>,在name属性中,声明接受的 Intent 操作。一般是android.intent.action.SEND或android.intent.action.SEND_MULTIPLE;

2)<category>,为了接收隐式 Intent,必须CATEGORY_DEFAULT类别包括在 Intent 过滤器中;

3)<data>,使用一个或多个指定数据 URI 各个方面(scheme、host、port、path等)和 MIME 类型的属性,声明接受的数据类型。您可以指定下列属性

:如果您无需声明关于数据的具体信息Uri,您应只指定android:mimeType属性声明您的 Activity 处理的数据类型,比如text/plain或image/jpeg。

3、处理消息

在onCreate()或onStart()方法中getIntent()可以获取到传入的Intent,如果接受多种消息类型,可以通过getType()进行区分。

官方推荐通过getStringExtra(Intent.EXTRA_TEXT)获取String、getParcelableExtra(Intent.EXTRA_STREAM)获取一个Uri和getParcelableArrayListExtra(Intent.EXTRA_STREAM)获取多个ArrayList<Uri>。当然也可以通过getData()和getClipData()。

4、返回处理结果

----------------------------------------------------分割线-------------------------------------------------------


其他:判断Intent能否被解析

也就是看看你手机上是否安装了相应的软件能打开你的Intent请求。

三个方法:

(1)Package.resolveActivity(Intent intent , int flags),是一个抽象方法,我猜测是调用Native层方法。

(2)Intent.resolveActivity(Package pm),分析源码得知是调用了Package的方法。返回一个ComponentName。

(3)Package.queryIntentActivities(Intent intent , int flags),返回List,即能启动该Intent的Activity集合

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 195,783评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,360评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 142,942评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,507评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,324评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,299评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,685评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,358评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,652评论 1 293
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,704评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,465评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,318评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,711评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,991评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,265评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,661评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,864评论 2 335

推荐阅读更多精彩内容

  • Intent 是一个消息传递对象,您可以使用它从其他应用组件请求操作。尽管 Intent 可以通过多种方式促进组件...
    牧童遥指2000阅读 5,043评论 0 12
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,121评论 25 707
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,331评论 0 17
  • 注:本文完全拷贝自https://developer.android.com/guide/components/i...
    RxCode阅读 1,690评论 1 13
  • 我将于茫茫人海中访我唯一灵魂之伴侣,得之,我幸,不得,我命。——徐志摩 现在才觉得,生命中能遇见那样一个明白自己的...
    傻小肆阅读 110评论 0 0