Intent是Android中的重要组件,能够被认为是不一样组件之间通讯的“媒介”或者“信使”。使用它能够启动Activity,Service还能够发起一个广播(Broadcast)。Intent对象由Action、Data、Category、Component和Extra组成。下面就以上属性进行分析说明。android
1. Component浏览器
在使用Intent显式的启动目标组件时,须要指定组件的名称(ComponentName)。Intent的组件名称对象由ComponentName类来封装。代码以下:安全
-
- ComponentName cn = new ComponentName(MainActivity.this, "com.amaker.ch06.app1.MyActivity");
-
- Intent intent = new Intent();
-
- intent.setComponent(cn);
-
- startActivity(intent);
|
同时,在目标组件中,能够得到传过来的Intent的属性。以下:
app
-
- Intent intent = this.getIntent();
-
- ComponentName cn = intent.getComponent();
-
- String packageName = cn.getPackageName();
-
- String className = cn.getClassName();
-
- tv = (TextView)findViewById(R.id.TextView01);
-
- tv.setText("组件包名称:"+packageName+"\n"+"组件类名称:"+className);
|
除了使用setComponent() 以外,还可使用setClass(),setClassName()来显式指定目标组件。
2. Actionide
Action规定了Intent要完成的动做,是一个字符串常量。使用setAction()来设置Action属性,使用getAction()来得到Action属性。既可使用系统内置的Action,也能够本身定义。
自定义Action:
测试
- public static final String MY_ACTION="com.amaker.ch07.app.MY_ACTION";
- ......
- Intent intent = new Intent();
-
- intent.setAction(MY_ACTION);
-
- startActivity(intent);
|
对于使用自定义的Action的隐式发送组件的过程当中,须要在目标组件的AndroidManifest.xml中声明过滤器规则,将Action加入其中。以下:
- <intent-filter>
- <action android:name="com.amaker.ch06.app.MY_ACTION" />
- <category android:name="android.intent.category.DEFAULT" />
- </intent-filter>
|
访问系统的Action方法同上,区别在于无需自定义Action字符串,直接使用系统内部的就能够,此处再也不赘述。
3. Intent的Data和Type属性this
不一样的动做伴随着不一样种类的数据规格。setData()方法指定数据只能为一个URI,setType()指定它只能是一个MIME类型, 而setDataAndType()指定它同时为URI和MIME类型。URI经过getData()读取,类型则经过getType()。
当匹配一个意图到一个能处理数据的组件时,除了它的URI外,一般须要知道数据类型(它的MIME类型)。 好比,一个能显示图片的组件不该该被要求去播放一个声音文件。以下:google
- <data android:type="video/mpeg" android:scheme="http" . . . />
- <data android:type="audio/mpeg" android:scheme="http" . . . />
|
下面代码是开启打电话界面的程序片断:
- data="content://contacts/people/1";
- uri=Uri.parse(data);
- intent=new Intent();
- intent.setData(uri);
- intent.setAction(Intent.ACTION_VIEW);
- startActivity(intent);
|
下面的代码是Type类型的数据的访问:spa
- Intent intent=new Intent();
- intent.setType("vnd.android.cursor.item/phone");
- intent.setAction(Intent.ACTION_GET_CONTENT);
- startActivity(intent);
- break;
|
4. Categoryxml
该属性是一个执行Action的附件信息。能够看做是设置一些特性的设置。
常量
|
含义
|
CATEGORY_BROWSABLE
|
目标活动能够被浏览器安全的唤起来显示被一个连接所引用的数据-好比,一张图片或一条e-mail消息。
|
CATEGORY_GADGET
|
这个活动能够被嵌入到充当配件宿主的另外的活动里面。
|
CATEGORY_HOME
|
这个活动将显示桌面,也就是用户开机后看到的第一个屏幕或者按HOME键时看到的屏幕。
|
CATEGORY_LAUNCHER
|
这个活动能够是一个任务的初始活动并被列在应用程序启动器的顶层。
|
CATEGORY_PREFERENCE
|
目标活动是一个选择面板。
|
5. Extra属性
该属性是添加一些组件的附加信息。代码以下:
- Uri uri = Uri.parse("smsto://10086");
- Intent intent = new Intent(Intent.ACTION_SENDTO, uri);
- intent.putExtra("sms_body", "测试短信");
- startActivity(Intent.createChooser(intent, "发送短信"));
|
以上程序片是发送短信的页面出现,在其中的联系人和文本信息框中出现的是10086和“测试短信”。另外,使用Extra属性也能够向自定的其余组件发送数据。在目标组件中能够接收。代码以下:
- Intent intent=getIntent();
- int user=intent.getIntExtra("userId",0);
|
6. Intent Filter
在不指定目标组件名称的时候,须要使用隐式寻找目标组件的方法。,这就须要经过Intent Filter来实现。目标Intent在AndroidManifest.xml中的Intent Filter标签中指定Action,Data和Category。而后源Activity经过查找已经注册在AndroidManifest.xml中的全部Intent,最终找到匹配的Intent。声明方法以下:
- <activity android:name="TestActivity" >
- <intent-filter>
- <action android:name="com.amaker.ch06.app.TEST_ACTION1"/>
- <action android:name="com.amaker.ch06.app.TEST_ACTION2"/>
- <action android:name="com.amaker.ch06.app.TEST_ACTION3"/>
-
- <action android:name="android.intent.action.VIEW"/>
-
- //Type和data属性都在这个标签中设置。URI被拆分红两个部分,scheme和path。
- <data android:scheme="content" android:path="com.amaker.ch07.app/abc"/>
- <data android:scheme="http" android:path="www.google.com" />
- //这行必须添加
- <category android:name="android.intent.category.DEFAULT"/>
- <category android:name="android.intent.category.BROWSABLE" />
- <category android:name="com.amaker.ch07.app.CATEGORY1"/>
-
- </intent-filter>
- </activity>
-
|
在过滤器中,以下几点须要注意: a. 若是Intent指定了Action,则目标组件中的过滤器Action列表中必须包含这个Action,不然不能匹配。若是Intent没有指定,则自动经过。 b. android.intent.category.DEFAULT属性是启动Activity默认的属性,这个必须添加。 c. 若是有多个Intent过滤规则相同,那么会自动提示使用哪一个。 d. 若是一个组件没有任何的意图过滤器,那它只能接收显式意图。一个带过滤器的组件能够同时接收显式和隐式意图。