Intent实现Activity的跳转
Android中提供了Intent机制来协助应用间的交互与通讯,Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将 Intent传递给调用的组件,并完成组件的调用。
Intent不仅可用于应用程序之间,也可用于应用程序内部的Activity/Service/BroadcastReceiver之间的交互。也可以说---- Intent是同一个或不同的应用中的组件之间的消息传递的媒介。因此,Intent在这里起着一个媒体中介的作用,专门提供组件互相调用的相关信息,实现调用者与被调用者之间的解耦。
简而言之:Intent用来激活组件;携带信息。
在SDK中给出了Intent作用的表现形式为:
通过Context.startActivity() orActivity.startActivityForResult() 启动一个Activity;
通过 Context.startService() 启动一个服务,或者通过Context.bindService() 和后台服务交互;
Context.sendBroadcast(),Context.sendOrderedBroadcast(),
Context.sendStickyBroadcast()) 发给broadcast receivers。
Activity的跳转
Activity的跳转需要创建Intent对象,通过设置intent对象的参数指定要跳转Activity。Activity跳转一共有两类:一类为显式意图;一类为隐式意图。
通过设置Activity的包名和类名实现跳转,称为显式意图
通过指定动作实现跳转,称为隐式意图
显式意图
- 同一应用中,指定目标Activity的字节码和当前的上下文
不同应用中,指定目标Activity所在的应用的包名和目标Activity的包名加类名
跳转至同一应用下的另一个Activity,直接指定该Activity的字节码即可 /** * 跳转至SecondActivity * 在本应用中跳转 * 显示跳转:直接指定目标Activity的包名和类名 * @param v */ //显式启动SecondActivity public void click1(View v){ //这个是显式意图 Intent intent = new Intent(); //设置上下文和目标Activity的字节码 intent.setClass(this, SecondActivity.class); startActivity(intent); }
跳转至其他应用中的Activity,需要指定该应用的包名和该Activity的类名
/** * 显式启动拨号器 */ 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); }
备注:获取拨号器的包名和类名,只需要打开Logcat并打开模拟器,点击拨号器,在Logcat中找到拨号器的包名和类名即可。
隐式意图
要让一个Activity可以被隐式启动,那么要在清单文件中对跳转到的Activity(也就是TwoActivity)进行配置。在清单文件的activity节点中设置intent-filter子节点,并配置action和category。(如果不配置的话,只能被显式启动,如果配置了后,也可以被隐式启动)
<activity
android:name="com.example.TwoActivity" >
<intent-filter >
<action android:name="a.b.c"/>
<data android:scheme="example"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
o action 指定动作:可以自定义,可以使用系统自带的。
o data 指定数据:操作什么内容。操作数据的前缀必须是example
o category 类别:是为某一种类定义的,一般使用默认类别即可
隐式意图跳转至指定SecondActivity
/**
* 隐式启动SecondActivity
*/
public void click3(View v){
Intent intent = new Intent();
//匹配action为a.b.c的Activity
intent.setAction("a.b.c");
//匹配scheme example是清单文件的前缀, 123是数据,可以自定义
intent.setData(Uri.parse("example:123"));
//如果没有设置Category的匹配,那么自动匹配CATEGORY_DEFAULT
// intent.addCategory(Intent.CATEGORY_DEFAULT);
startActivity(intent);
}
备注:当启动Activity的时候,系统会在所有清单文件中寻找与我们创建的intent匹配的intent-filter,找到则启动,找不到则抛异常
隐式意图跳转至指定的系统中的Activity
示例1:隐式跳转至打电话Activity
/**
* 隐式跳转至打电话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:跳转拨号器界面
/**
* 隐式启动拨号器
*/
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,操作如下:
<activity
android:name="com.example.TwoActivity" >
<intent-filter >
<action android:name="a.b.c"/>
<data android:scheme="example" android:mimeType="text/name"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
在代码中就需要指定mimeType
public void click5(View v){
Intent intent = new Intent();
intent.setAction("a.b.c");
//匹配mimetype
// intent.setType("text/name");
//匹配scheme
// intent.setData(Uri.parse("example:测试"));
intent.setDataAndType(Uri.parse("example:测试"), "text/name");
startActivity(intent);
}
备注:setType和setData 不能共存,所以要使用共存的setDataAndType方法。
案例:跳转到浏览器怎么做呢?
/**
* 显式跳转至浏览器
*/
public void click6(View v){
Intent intent = new Intent();
intent.setClassName("com.android.browser", "com.android.browser.BrowserActivity");
startActivity(intent);
}
/**
* 隐式跳转至浏览器
*/
public void click7(View v){
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.baidu.com"));
startActivity(intent);
}
当多个浏览器的时候,在显式的时候,直接启动了,只能启动一个浏览器;在隐式的时候,可以让选择。
应用场景
1、启动同一应用中的Activity,用显式
2、启动不同应用中的Activity,用隐式
显式启动效率高于隐式
如果系统找到了多个intent-filter与程序员创建的intent匹配,那么就会弹出对话框,列举所有匹配的Activity,让用户选择。比如:手机上安装多个浏览器时候。