intent详解(一)

摘录自:http://blog.csdn.net/harvic880925/article/details/38399723

前言:通过重新翻看Android入门书籍,才发现原来自己露掉了那么多基础知道。原以为有了C的基础,快速开发应该是没有问题的了,但没有遇到问题的时候还是海搜,只知道这么写能完成这个功能,但为什么要这么写还是不太清楚,看来还是要好好把基础打一打,把android基础看完以后,再看看JAVA的基础知识。关于这个问题,写两篇,这篇基础知识讲解,下一篇代码实战。

相关文章:

《intent详解(二)》

一、Intent是什么

1、定义

Intent被译作意图,其实还是很能传神的,Intent期望做到的,就是把实现者和调用者完全解耦,调用者专心将以意图描述清晰,发送出去,就可以梦想成真,达到目的。

这个解释还是有点不太好理解,下面还有一个:Intent是一种运行时绑定(run-time binding)机制,它能在程序运行过程中连接两个不同的组件。通过Intent,你的程序可以向Android表达某种请求或者意愿,Android会根据意愿的内容选择适当的组件来完成请求。比如,有一个Activity希望打开网页浏览器查看某一网页的内容,那么这个Activity只需要发出WEB_SEARCH_ACTION给Android,Android就会根据Intent的请求内容,查询各组件注册时声明的IntentFilter,找到网页浏览器的Activity来浏览网页。 这个解释好像理解起来就容易好多,我们通过intent传入某种意图,而android就会根据这种意图,自动寻找合适的activity来启动,如果有多个条件符合的activity,就以列表的方式让用户手动选择一个。

2、显示Intent与隐式Intent

这两个概念刚开始不太好理解,先看两个通过intent启动activity的代码:

例一:

[java] view plain copy

  1. Intent intent = new Intent();
  2. intent.setClass(Context packageContext, OtherActivity.class);
  3. startActivity(intent);

例二:

[java] view plain copy

  1. Intent intent = new Intent();
  2. intent.setAction(Intent.ACTION_NEW);
  3. startActivity(intent);

从这两段代码中可以明显看出,同样是startActivity,但第一个明确指出是启动OtherActivity,而在第二个例子中,并没有明确指出要启动哪个activity!

这两种书写方式就分别是显示Intent(例一)、隐式Intent(例二);

  • 显式intent是指明确指出此intent是启动哪个activity.
  • 隐式intent是指并没有指出要启动哪个activity,而要系统自动去判断并启动匹配的activity.

3、显式Intent小结

有两种方式来显示的指示要启动的Activity:

方式一:(通过setClassName)

[java] view plain copy

  1. Intent intent = new Intent();
  2. //表示希望启动com.example.test_permission包中的com.example.test_permission.MainActivity
  3. intent.setClassName("com.example.test_permission", "com.example.test_permission.MainActivity");
  4. startActivity(intent);

方式二:(通过SetClass)

[java] view plain copy

  1. Intent intent = new Intent();
  2. intent.setClass(Context packageContext, OtherActivity.class);
  3. startActivity(intent);

同样,setClass(Context packageContext, OtherActivity.class);是指启动packageContext包里的OtherActivity.class类;

二、针对隐式intent,Activity的匹配原则

上面我们讲了隐式intent是要靠系统自动去匹配并启动某个activity的。那系统是怎样匹配activity的呢,系统是怎样知道这个actitiy就是某个intent想要的呢。

某个activity能不能被某个intent激活,要看这个activity是不是符合这个intent的要求,而某个activity能被哪个intent激活是有定义的,定义就在AndroidManifest.xml

打开AndroidManifest.xml,找到任意一个activity,一般都能看到一段代码,举个例子,我随便复制一个,如下:

[html] view plain copy

  1. <activity
  2. android:name=".MainActivity"
  3. android:label="@string/app_name" >
  4. <intent-filter>
  5. <action android:name="android.intent.action.MAIN" />
  6. <category android:name="android.intent.category.LAUNCHER" />
  7. </intent-filter>
  8. </activity>

看这里有一对标签<intent-filter>……</intent-filter>
在这个标签里定义的所有东东都是用来定义该activity可以被哪些intent激活的,如果匹配,就会被激活!!!!!

在<intent-filter>里有以下几个属性可以让intent来匹配:Action、Category、Data;下面逐一介绍:

1、Action:该activity可以执行的动作

该标识用来说明这个activity可以执行哪些动作,所以当隐式intent传递过来action时,如果跟这里<intent-filter>所列出的任意一个匹配的话,就说明这个activity是可以完成这个intent的意图的,可以将它激活!!!!

常用的Action如下所示:

[html] view plain copy

  1. ACTION_CALL activity 启动一个电话.
  2. ACTION_EDIT activity 显示用户编辑的数据.
  3. ACTION_MAIN activity 作为Task中第一个Activity启动
  4. ACTION_SYNC activity 同步手机与数据服务器上的数据.
  5. ACTION_BATTERY_LOW broadcast receiver 电池电量过低警告.
  6. ACTION_HEADSET_PLUG broadcast receiver 插拔耳机警告
  7. ACTION_SCREEN_ON broadcast receiver 屏幕变亮警告.
  8. ACTION_TIMEZONE_CHANGED broadcast receiver 改变时区警告.

两条原则:

  • 一条<intent-filter>元素至少应该包含一个<action>,否则任何Intent请求都不能和该<intent-filter>匹配。
  • 如果Intent请求的Action和<intent-filter>中个任意一条<action>匹配,那么该Intent就可以激活该activity(前提是除了action的其它项也要通过)。

两条注意:

如果Intent请求或<intent-filter>中没有说明具体的Action类型,那么会出现下面两种情况。

  • 如果<intent-filter>中没有包含任何Action类型,那么无论什么Intent请求都无法和这条<intent-filter>匹配。
  • 反之,如果Intent请求中没有设定Action类型,那么只要<intent-filter>中包含有Action类型,这个Intent请求就将顺利地通过<intent-filter>的行为测试。

2、Category:于指定当前动作(Action)被执行的环境

即这个activity在哪个环境中才能被激活。不属于这个环境的,不能被激活。

常用的Category属性如下所示:

[html] view plain copy

  1. CATEGORY_DEFAULT:Android系统中默认的执行方式,按照普通Activity的执行方式执行。表示所有intent都可以激活它 
  2. CATEGORY_HOME:设置该组件为Home Activity。
  3. CATEGORY_PREFERENCE:设置该组件为Preference。 
  4. CATEGORY_LAUNCHER:设置该组件为在当前应用程序启动器中优先级最高的Activity,通常为入口ACTION_MAIN配合使用。 
  5. CATEGORY_BROWSABLE:设置该组件可以使用浏览器启动。表示该activity只能用来浏览网页。 
  6. CATEGORY_GADGET:设置该组件可以内嵌到另外的Activity中。

注意:

如果该activity想要通过隐式intent方式激活,那么不能没有任何category设置,至少包含一个android.intent.category.DEFAULT

3、Data  执行时要操作的数据

在目标<data/>标签中包含了以下几种子元素,他们定义了url的匹配规则:

  • android:scheme 匹配url中的前缀,除了“http”、“https”、“tel”...之外,我们可以定义自己的前缀
  • android:host 匹配url中的主机名部分,如“google.com”,如果定义为“*”则表示任意主机名
  • android:port 匹配url中的端口
  • android:path 匹配url中的路径

在XML中声明可以操作的data域应该是这样的:

[html] view plain copy

  1. <activity android:name=".TargetActivity">
  2. <intent-filter>
  3. <action android:name="com.scott.intent.action.TARGET"/>
  4. <category android:name="android.intent.category.DEFAULT"/>
  5. <data android:scheme="scott" android:host="com.scott.intent.data" android:port="7788" android:path="/target"/>
  6. </intent-filter>
  7. </activity>

注意:

这个标识比较特殊,它定义了执行此Activity时所需要的数据,也就是说,这些数据是必须的!!!!!所有如果其它条件都足以激活该Activity,但intent却没有传进来指定类型的Data时,就不能激活该activity!!!!

三、Intent隐式传递方法

上面我们讲了一个Activity能被某隐式Intent唤醒的原则,只有这些全部匹配的intent才能唤醒这个Activity,下面我们就讲讲怎么向隐式intent传递这些参数,以便与activity匹配将向唤醒。

1、Action

使用Intent的一个构造方法即可实现传递Action参数:

[java] view plain copy

  1. public Intent(String action) {
  2. mAction = action;
  3. }

对于有如下声明的Activity:

[html] view plain copy

  1. <activity android:name=".TargetActivity">
  2. <intent-filter>
  3. <action android:name="com.scott.intent.action.TARGET"/>
  4. <category android:name="android.intent.category.DEFAULT"/>
  5. </intent-filter>
  6. </activity>

要激活这个Activity,就需要如下这样构造Intent:(直接向intent中传递action的name值)

[java] view plain copy

  1. public void gotoTargetActivity(View view) {
  2. Intent intent = new Intent("com.scott.intent.action.TARGET");
  3. startActivity(intent);
  4. }

这样就可以启动我们上面的这个activity了。

注意这里再次提醒,一个activity可以有多个action,只要有一个匹配就可以被启动。同样,如果仅指定某个action,而多个activity都具有这个action的话,系统会列出列表供用户选择执行哪一个activity.

2、Category

一个intent对象可以有任意个category。intent类定义了许多category常数.

  • addCategory()方法为一个intent对象增加一个category,
  • removeCategory删除一个category,
  • getCategories()获取intent所有的category.

3、Data

有两种传递data的方式:

第一种:利用构造函数:

[java] view plain copy

  1. public Intent(String action, Uri uri) {
  2. mAction = action;
  3. mData = uri;
  4. }

第二种:利用Intent::SetData(URI uri)

[java] view plain copy

  1. Intent intent = new Intent("com.scott.intent.action.name");
  2. intent.setData(Uri.parse("scheme://host:port/parth"));
  3. startActivity(intent);

举个例子:(改动下上面的action的例子)

[html] view plain copy

  1. <activity android:name=".TargetActivity">
  2. <intent-filter>
  3. <action android:name="com.scott.intent.action.TARGET"/>
  4. <category android:name="android.intent.category.DEFAULT"/>
  5. <data android:scheme="scott" android:host="com.scott.intent.data" android:port="7788" android:path="/target"/>
  6. </intent-filter>
  7. </activity>

这个时候如果要启动这个TargetActivity只指定action就不够了,我们需要为其设置data值,如下:

[java] view plain copy

  1. Intent intent = new Intent("com.scott.intent.action.TARGET");
  2. intent.setData(Uri.parse("scott://com.scott.intent.data:7788/target"));
  3. startActivity(intent);

此时,url中的每个部分和TargetActivity配置信息中全部一致才能跳转成功,否则就被系统拒绝。

注意:

不过有时候对path限定死了也不太好,比如我们有这样的url:(scott://com.scott.intent.data:7788/target/hello)(scott://com.scott.intent.data:7788/target/hi)

这个时候该怎么办呢?我们需要使用另外一个元素:android:pathPrefix,表示路径前缀。
我们把android:path="/target"修改为android:pathPrefix="/target",然后就可以满足以上的要求了。

4、Extras

这个参数不参与匹配activity,而仅作为额外数据传送到另一个activity中,接收的activity可以将其取出来。这些信息并不是激活这个activity所必须的。也就是说激活某个activity与否只上action、data、catagory有关,与extras无关。而extras用来传递附加信息,诸如用户名,用户密码什么的。

可通过putXX()和getXX()方法存取信息;也可以通过创建Bundle对象,再通过putExtras()和getExtras()方法来存取。

通过bundle对象传递

发送方

[java] view plain copy

  1. Intent intent = new Intent("com.scott.intent.action.TARGET");
  2. Bundle bundle = new Bundle();
  3. bundle.putInt("id", 0);
  4. bundle.putString("name", "scott");
  5. intent.putExtras(bundle);
  6. startActivity(intent);

接收方:

[java] view plain copy

  1. Bundle bundle = intent.getExtras();
  2. int id = bundle.getInt("id");
  3. String name = bundle.getString("name");

 

更多参数传递方法见《通过Intent传递类对象》

5、附《Intent调用常见系统组件方法》

[java] view plain copy

  1. // 调用浏览器
  2. Uri webViewUri = Uri.parse("http://blog.csdn.net/zuolongsnail");
  3. Intent intent = new Intent(Intent.ACTION_VIEW, webViewUri);
  4. // 调用地图
  5. Uri mapUri = Uri.parse("geo:100,100");
  6. Intent intent = new Intent(Intent.ACTION_VIEW, mapUri);
  7. // 播放mp3
  8. Uri playUri = Uri.parse("file:///sdcard/test.mp3");
  9. Intent intent = new Intent(Intent.ACTION_VIEW, playUri);
  10. intent.setDataAndType(playUri, "audio/mp3");
  11. // 调用拨打电话
  12. Uri dialUri = Uri.parse("tel:10086");
  13. Intent intent = new Intent(Intent.ACTION_DIAL, dialUri);
  14. // 直接拨打电话,需要加上权限<uses-permission id="android.permission.CALL_PHONE" />
  15. Uri callUri = Uri.parse("tel:10086");
  16. Intent intent = new Intent(Intent.ACTION_CALL, callUri);
  17. // 调用发邮件(这里要事先配置好的系统Email,否则是调不出发邮件界面的)
  18. Uri emailUri = Uri.parse("mailto:[email protected]");
  19. Intent intent = new Intent(Intent.ACTION_SENDTO, emailUri);
  20. // 直接发邮件
  21. Intent intent = new Intent(Intent.ACTION_SEND);
  22. String[] tos = { "[email protected]" };
  23. String[] ccs = { "[email protected]" };
  24. intent.putExtra(Intent.EXTRA_EMAIL, tos);
  25. intent.putExtra(Intent.EXTRA_CC, ccs);
  26. intent.putExtra(Intent.EXTRA_TEXT, "the email text");
  27. intent.putExtra(Intent.EXTRA_SUBJECT, "subject");
  28. intent.setType("text/plain");
  29. Intent.createChooser(intent, "Choose Email Client");
  30. // 发短信
  31. Intent intent = new Intent(Intent.ACTION_VIEW);
  32. intent.putExtra("sms_body", "the sms text");
  33. intent.setType("vnd.android-dir/mms-sms");
  34. // 直接发短信
  35. Uri smsToUri = Uri.parse("smsto:10086");
  36. Intent intent = new Intent(Intent.ACTION_SENDTO, smsToUri);
  37. intent.putExtra("sms_body", "the sms text");
  38. // 发彩信
  39. Uri mmsUri = Uri.parse("content://media/external/images/media/23");
  40. Intent intent = new Intent(Intent.ACTION_SEND);
  41. intent.putExtra("sms_body", "the sms text");
  42. intent.putExtra(Intent.EXTRA_STREAM, mmsUri);
  43. intent.setType("image/png");
  44. // 卸载应用
  45. Uri uninstallUri = Uri.fromParts("package", "com.app.test", null);
  46. Intent intent = new Intent(Intent.ACTION_DELETE, uninstallUri);
  47. // 安装应用
  48. Intent intent = new Intent(Intent.ACTION_VIEW);
  49. intent.setDataAndType(Uri.fromFile(new File("/sdcard/test.apk"), "application/vnd.android.package-archive");
  50. // 在Android Market中查找应用
  51. Uri uri = Uri.parse("market://search?q=愤怒的小鸟");
  52. Intent intent = new Intent(Intent.ACTION_VIEW, uri);
时间: 2024-10-17 07:58:58

intent详解(一)的相关文章

[Android] Intent详解

[转]http://www.cnblogs.com/engine1984/p/4146621.html [正文] Intent组件虽然不是四大组件,但却是连接四大组件的桥梁,学习好这个知识,也非常的重要. 一.什么是Intent 1.Intent的概念: Android中提供了Intent机制来协助应用间的交互与通讯,或者采用更准确的说法是,Intent不仅可用于应用程序之间,也可用于应用程序内部的activity, service和broadcast receiver之间的交互.Intent这

Intent详解

Intent组件虽然不是四大组件,但却是连接四大组件的桥梁,学习好这个知识,也非常的重要. 一.什么是Intent 1.Intent的概念: Android中提供了Intent机制来协助应用间的交互与通讯,或者采用更准确的说法是,Intent不仅可用于应用程序之间,也可用于应用程序内部的activity, service和broadcast receiver之间的交互.Intent这个英语单词的本意是“目的.意向.意图”. Intent是一种运行时绑定(runtime binding)机制,它能

Android组件系列----Intent详解

[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/3959204.html 联系方式:[email protected] [正文] Intent组件虽然不是四大组件,但却是连接四大组件的桥梁,学习好这个知识,也非常的重要. 一.什么是Intent 1.Intent的概念: Android中提供了Intent机制来协助应用间的交互与通讯,或者采用更准确

Android中Intent详解(二)之使用Intent广播事件及Broadcast Receiver简介

通过第一篇的讲解,我们已经看到了如何使用Intent来启动新的应用程序组件,但是实际上他们也可以使用sendBroadcast方法来在组件间匿名的广播消息. 作为一个系统级别的消息传递机制,Intent可以在进程之间发送结构化的消息.因此,通过实现Broadcast Receiver来监听和响应应用程序内的这些Broadcast Intent. 通过使用Intent来广播一个事件,可以在不修改原始的应用程序的情况下,让我们开发人员对事件做出反应.Android大量使用了Broadcast Rec

Activity Intent详解

1.Intent简介 Intent代表了Android应用的启动"意图",Android应用将会根据Intent来启动指定组件,至于到底启动哪个组件,则取决于Intent的各个属性.下面就来介绍一下Intent的各种发展,以及Android如何根据不同属性来启动相应的组件.Intent是由Component.Action.Data.Category.Extra及Flag六部分组成的,接下来将分别对其进行详细介绍. (1)Component name 组件名称实际上就是一个Compone

Android中的Intent详解

前言: 每个应用程序都有若干个Activity组成,每一个Activity都是一个应用程序与用户进行交互的窗口,呈现不同的交互界面.因为每一个Acticity的任务不一样,所以经常互在各个Activity之间进行跳转,在Android中这个动作是靠Intent来完成的.你通过startActivity()方法发送一个Intent给系统,系统会根据这个Intent帮助你找到对应的Activity,即使这个Activity在其他的应用中,也可以用这种方法启动它. Intent的定义: Intent是

Android中Intent详解(一)

Intent是一种消息传递机制,它可以在应用程序内使用,也可以在应用程序间使用,主要用途分为: 1.使用类名显示的启动一个特定的Activity或Service 2.启动Activity或Service来执行一个动作的Intent,通常需要使用特定的数据,或者对特定的数据执行动作 3.广播某个事件已经发生 Intent最常见的一个用法是显示的(通过指定要装载的类)或隐式的(通过请求对一条数据执行某个动作)启动新的activity,在后一种情况下,动作不一定由调用应用程序中的Activty执行.

intent详解(收集)

Intent用法实例 1.无参数Activity跳转 Intent it = new Intent(Activity.Main.this, Activity2.class); startActivity(it); 2.向下一个Activity传递数据(使用Bundle和Intent.putExtras) Intent it = new Intent(Activity.Main.this, Activity2.class); Bundle bundle=new Bundle(); bundle.p

Android_Intent详解

androidactionjavaschemefilterstring 目录(?)[+] 目录 Intent 详解... 1 一. Intent 作用... 1 二. Intent的构成... 1 三. intent的解析... 2 1.动作测试... 2 2.类别测试... 3 3.数据测试... 3 4.简单例子说明... 3 三.Intent的构造函数... 4 5. 总结说明... 5 实 例... 7 Intent 详解 一. Intent 作用 Intent 是一个将要执行的动作的抽