Intent是Android中的一种机制,用于在应用程序之间传递数据和控制行为。它可以用于Activity、Service和BroadcastReceiver之间的交互。Intent起着一个媒体中介的作用,专门提供组件互相调用的相关信息,实现调用者与被调用者之间的解耦。
Intent可以用来激活组件;携带信息。在SDK中给出了Intent作用的表现形式为:通过Context.startActivity() orActivity.startActivityForResult() 启动一个Activity; 通过 Context.startService() 启动一个服务,或者通过Context.bindService() 和后台服务交互; Context.sendBroadcast(),Context.sendOrderedBroadcast(), Context.sendStickyBroadcast()) 发给broadcast receivers。
Activity的跳转需要创建Intent对象,通过设置intent对象的参数指定要跳转Activity。Activity跳转一共有两类:一类为显式意图;一类为隐式意图。通过设置Activity的包名和类名实现跳转,称为显式意图;通过指定动作实现跳转,称为隐式意图。
```java
跳转至同一应用下的另一个Activity,直接指定该Activity的字节码即可
/**
* 跳转至SecondActivity
* 在本应用中跳转
*/
// 显示跳转:直接指定目标Activity的包名和类名
public void click1(View v){
// 这个是显式意图
Intent intent = new Intent();
// 设置上下文和目标Activity的字节码
intent.setClass(this, SecondActivity.class);
startActivity(intent);
}
/**
* 显式启动拨号器
*/
public void click2(View v){
Intent intent = new Intent();
// arg0:目标Activity所在的应用的包名
// arg1:目标Activity的类名,注意要带上包名
intent.setClassName("com.android.dialer", "com.android.dialer.DialtactsActivity");
intent.setData(Uri.parse("tel:10086"));
startActivity(intent);
}
```
这段代码是一个隐式意图跳转至指定SecondActivity的方法。其中,intent-filter用于匹配动作、数据和类别,而startActivity()方法则用于启动Activity。
具体来说,intent-filter中的action属性指定了动作类型,可以自定义或使用系统自带的动作;data属性指定了操作的数据内容,操作数据的前缀必须是example;category属性为某一种类定义,一般使用默认类别即可。
在click3()方法中,通过创建Intent对象并设置相应的属性来实现隐式意图跳转至指定SecondActivity。最后调用startActivity()方法启动Activity即可。
隐式意图跳转至指定系统中的Activity示例1:隐式跳转至打电话Activity
```java
/**
* 隐式跳转至打电话Activity
*/
public void click4(View v) {
//创建意图,这个是隐式意图
Intent intent = new Intent();
//设置动作
intent.setAction(Intent.ACTION_CALL);
intent.setData(Uri.parse("tel:110"));
//启动Activity
startActivity(intent);
}
```
电话源码中的filter示例2:跳转拨号器界面
```java
/**
* 隐式启动拨号器
*/
public void click3(View v) {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_DIAL);
intent.setData(Uri.parse("tel:76115230"));
startActivity(intent);
}
```
在清单文件中定义data的时候,添加了android:mimeType的操作示例:
```xml
android:name="com.example.TwoActivity">
```
您可以使用setType()方法来指定MIME类型。setType()方法的参数是一个字符串,表示MIME类型。例如,如果您想要将一个文件作为文本文件打开,您可以使用以下代码:
```java
intent.setType("text/plain");
startActivity(intent);
```
但是,setType()方法不能与setData()方法共存。因此,如果您想要同时指定MIME类型和数据,请使用setDataAndType()方法。setDataAndType()方法的两个参数都是Uri对象。例如,如果您想要将一个文件作为文本文件打开,并将其数据设置为该文件的内容,您可以使用以下代码:
```java
intent.setDataAndType(Uri.fromFile(new File("example.txt")), "text/plain");
startActivity(intent);
```
启动同一应用中的Activity,通常采用显式启动方式。当需要激活应用内的某个Activity时,通过Intent对象指定该Activity的类名,并调用startActivity()方法来实现。这种方式的优点是明确指定了要启动的Activity,启动效率高。
启动不同应用中的Activity,通常采用隐式启动方式。当需要从一个应用中启动另一个应用的Activity时,通过Intent对象设置action、data等属性,让系统根据这些属性自动匹配合适的Activity。如果系统找到了多个intent-filter与程序员创建的intent匹配,那么就会弹出对话框,列举所有匹配的Activity,让用户选择。比如:在手机上安装多个浏览器的情况下,用户可以通过点击浏览器图标直接进入对应的浏览器界面。