intent与anctivity详解

上传人:第*** 文档编号:30552256 上传时间:2018-01-30 格式:DOC 页数:15 大小:46KB
返回 下载 相关 举报
intent与anctivity详解_第1页
第1页 / 共15页
intent与anctivity详解_第2页
第2页 / 共15页
intent与anctivity详解_第3页
第3页 / 共15页
intent与anctivity详解_第4页
第4页 / 共15页
intent与anctivity详解_第5页
第5页 / 共15页
点击查看更多>>
资源描述

《intent与anctivity详解》由会员分享,可在线阅读,更多相关《intent与anctivity详解(15页珍藏版)》请在金锄头文库上搜索。

1、 Intent 与 anctivity 详解隐式启动 Activity 的 intent 到底发给哪个 activity,需要进行三个匹配,一个是 action,一个是 category,一个是 data,可以是全部或部分匹配同样适用于 Service 和 BroadcastReceiver,下面是以 Activity 为例MainActivity.java -主 ActivityTestActivity.java -需要隐式启动的 Activity(1) 根据 Action 和 Category 来进行匹配在 MainActivity.java 里启动它:intent.setAction(

2、cc.android/myaction.leo);/不加下面这行也行,因为 intent 的这个属性默认值即系 Intent.CATEGORY_DEFAULTintent.addCategory(Intent.CATEGORY_DEFAULT);startActivity( intent );总结:a.在某个 Activity 里用 startActivity()方法发送一个 intent,这个 intent 设定了一些条件,比如用方法 setAction(),addCategory()设定了两个属性,发送了这个 intent 之后,android 会去系统里保存的 MainManifest.

3、xml 清单(假设这个系统存放全部 apk 清单的文件为 MainManifest.xml)里查找符合这两个属性的 activity,然后启动它。查找过程是怎样的呢?我猜测:在安装某个 apk 的时候,android 系统会把这个 apk 的清单文件里内容复制一份至系统的某个清单文件里(假如这个系统存放全部 apk 清单的文件为 MainManifest.xml)当某个 Activity 用 startActivity(intentOther)方法向系统发送了一个 intent(假如为 intentOther),那么 android 系统会去查找这个 MainManifest.xml 里注册的

4、属性,查找到符合这个 intentOther 的就启动这个 Activity,如果有多个这样的 Activity 符合条件的话,就跳出一个对话框让用户选择究竟要启动哪一个上面那个自定义的 Action 字符串(cc.android/myaction.leo,当然也可以写成这样cc.android.myaction.leo,同时 AndroidManifest.xml 里也要写成这样)是系统唯一的,所以系统很容易就能匹配到。b.任何一个需要隐式启动的 Activity 都必须要有这项:例外情况是:android.intent.category.MAIN 和 android.intent.cate

5、gory.LAUNCHER 的 filter 中没有必要加入 android.intent.category.DEFAULT,当然加入也没有问题c.假如有两个 Activity,它们的在 AndroidManifest.xml 里配置如下:在 MainActivity.java 里发送一个 intent:intent.setAction( hello.leo.liao);/不加下面这行也行,因为 intent 的这个属性默认值即系 Intent.CATEGORY_DEFAULTintent.addCategory(Intent.CATEGORY_DEFAULT);startActivity(

6、intent );这样的话,android 系统会跳出一个对话框让你选择启动哪一个 Activity(MyActivityOne 还是 MyActivityTwo)如果把上面的 intent.setAction( hello.leo.liao);改为 intent.setAction( hello.leo.leo);的话,就自动匹配到 MyActivityOne就是说如果 category 和 action 都相同的话,会跳出一个对话框让用户选择要启动哪一个activity;如果 category 相同,而 action 不相同,就可以匹配到相应的 activityd.单单靠添加 addCat

7、egory 属性不能匹配,如 :Intent intent = new Intent();intent.addCategory(Intent.CATEGORY_DEFAULT);intent.addCategory(android.intent.category.hello);startActivity(intent);e.当匹配不上任何 Activity 的话,会发生异常,跳出对话框: 很抱歉.某某应用程序意外停止,请重试。f.Service 和 BroadcastReceiver 同理(2) 根据 Action 和 Data 匹配/Uri uri = Uri.parse(x-id:/ ur

8、i = Uri.parse(x-id);/这个不行/Uri uri = Uri.parse(x-id:/);这个可以Uri uri = Uri.parse(x-id:);/这个可以Intent in = new Intent();in.setAction(android.intent.action.leo);/去掉这行不行,单靠 data 不能匹配in.addCategory(Intent.CATEGORY_DEFAULT);/可以去掉这行,因为 intent 的默认 category值即系 Intent.CATEGORY_DEFAULTin.setData(uri);/去掉这行不行start

9、Activity(in);总结:如果在 AndroidManifest.xml 里面指定了这行,那么,需要匹配到它的话,在代码里必须要设置 intent 的 data,如上面的 in.setData(uri)Data 的语法:Uri 的格式:scheme:/host:port/path or pathPrefix or pathPattern如果 scheme 没有指定,那其它的属性均无效;如果 host 没有指定,那么 port,path,pathPrefix,pathPattern 均无效;如果在 manifest 里这样写:那么 Uri uri = Uri.parse(something

10、:/); 才可以匹配再如:等同于这样写:那么 Uri uri = Uri.parse(something:/:80); 才可以匹配不知为何,下面这个不行:Uri uri = Uri.parse(content:/com.example.project:200/folder/subfolder/etc)下面这样也不行Uri uri = Uri.parse(content:/com.example.project:200/folder)可以有多个 data,只需匹配其中一个即可Intent in = new Intent();in.setAction(android.intent.action.l

11、eo);in.addCategory(Intent.CATEGORY_DEFAULT);in.setData(Uri.parse(something:);/或者用这个亦可 in.setData(Uri.parse(x-id:);startActivity(in);(3) 根据 action 和 data 的 mimeType 属性匹配在 java 代码里这样写就可以匹配到这个 activity:Intent in = new Intent();in.setAction(android.intent.action.VIEW);in.addCategory(Intent.CATEGORY_DEFA

12、ULT);/可去掉,因为 Category 默认值即系Intent.CATEGORY_DEFAULTin.setType(vnd.android.cursor.dir/vnd.google.note);startActivity(in);单靠 data 的 mimeType 属性不能匹配,就算这个 mimeType 是唯一的也不行(比如in.setType(leo.android.cursor.dir/vnd.google.leo);),需要有一个 action 配合可以有多个 mimeType,在 java 代码里只需匹配其中一个即可:这样可以启动 MyActivityTwo 这个 Acti

13、vity:Intent in = new Intent();in.setAction(android.intent.action.VIEW);in.addCategory(Intent.CATEGORY_DEFAULT);/可去掉,因为 Category 默认值即系Intent.CATEGORY_DEFAULTin.setType(leo.android.cursor.dir/vnd.google.liao);startActivity(in);或者这样也可以启动 MyActivityTwo 这个 Activity:Intent in = new Intent();in.setAction(a

14、ndroid.intent.action.VIEW);in.addCategory(Intent.CATEGORY_DEFAULT);/可去掉,因为 Category 默认值即系Intent.CATEGORY_DEFAULTin.setType(leo.android.cursor.dir/vnd.google.leo);startActivity(in);scheme 和 mimeType 只能有其中一个 ,下面这样通不过AndroidManifest.xml 里:或java 代码里:匹配不上:Intent in = new Intent();in.setAction(android.int

15、ent.action.VIEW);Uri uri = Uri.parse(something:/:80);in.setData(uri);in.setType(leo.android.cursor.dir/vnd.google.leo);startActivity(in);这样还是匹配不上:Intent in = new Intent();in.setAction(android.intent.action.VIEW);/ Uri uri = Uri.parse(something:/:80);/ in.setData(uri);in.setType(leo.android.cursor.dir/vnd.google.leo);startActivity(in);这样还是匹配不上:Intent in = new Intent();in.setAction(android.intent.action.VIEW);Uri uri = Uri.parse(something:/:80);in.setData(uri);/ in.setType(leo.android.c

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 其它办公文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号