Intent相当于组件之间通信的桥梁,使用它可以给其他的Activity和Service组建传递数据。Intent有显隐式之分,显式的Intent是根据组建的名称直接启动要启动的组建,如Service或者Activity,隐式的Intent通过配置的action, category, data来找到匹配的组件并启动。
一、显示Intent
两种载入的方式:
1、Intent intent = new Intent(MainActivity.this, NotificationActivity.class);
startActivity(intent);
2、也可以直接调用setComponent(ComponentName)或者setClass(Context, Class)方法来指定目标组件:
<span style="white-space:pre"> </span>Intent intent = new Intent();
intent.setClass(MainActivity.this, NotificationActivity.class);
startActivity(intent);
或者
<pre name="code" class="java"> //包名和class名
ComponentName componentName = new ComponentName("com.android", "com.android.activity.NotificationActivity");
Intent intent = new Intent();
intent.setComponent(componentName);
startActivity(intent);
二、隐式Intent
隐式Intent常用于调用系统组件,如打电话程序、发短信、打开浏览器、使用地图、安装程序、播放音频、发送短信和彩信、发送邮件等。
1、打开Web浏览器
<span style="white-space:pre"> </span>//调用系统组件,调用web浏览器
Uri uri = Uri.parse("http://www.baidu.com");
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);
2、显示地图。如果设备中已经安装了地图程序,就可以通过Intent启动,并且可以将屏幕移动到指定的经纬度位置:
Uri uri = Uri.parse("geo:118.797684,32.062792");
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);
3、调用拨号界面
//调用拨号界面
Uri uri = Uri.parse("tel:10086");
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);
4、直接拨打电话
<span style="white-space:pre"> </span>//直接拨打电话[需添加打电话权限:android.permission.CALL_PHONE]
Uri uri = Uri.parse("tel:10086");
Intent intent = new Intent(Intent.ACTION_CALL, uri);
startActivity(intent);
6、安装程序
<span style="white-space:pre"> </span>//首先准备a.apk文件到sdcard根目录,本段代码就会搜索到a.apk,然后让用户安装
Intent intent = new Intent();
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setAction(android.content.Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(new File("/sdcard/a.apk")), "application/vnd.android.package-archive");
startActivity(intent);
7、卸载程序
<span style="white-space:pre"> </span>//卸载程序
Uri uri = Uri.parse("package:com.android");
Intent intent = new Intent(Intent.ACTION_DELETE, uri);
startActivity(intent);
三、Intent对象包含的内容
1.componentName(组件名称),指定Intent的目标组件的类名称。组件名称是可选的,如果填写,Intent对象会发送给指定组件名称的组件,否则也可以通过其他Intent信息定位到适合的组件。组件名称是个ComponentName类型的对象。
2.action(动作),指定Intent的执行动作,比如调用拨打电话组件。
| |||||||||||
Intent.ACTION_VIEW android.intent.action.VIEW 用于显示用户的数据。 比较通用,会根据用户的数据类型打开相应的Activity。 比如 tel:13400010001打开拨号程序,http://www.g.cn则会打开浏览器等。 |
3.data(数据),起到表示数据和数据MIME类型的作用。不同的action是和不同的data类型配套的,通过设置data的Uri来获得。
4.category(类别),被执行动作的附加信息。例如应用的启动Activity在intent-filter中设置category。
5.extras(附加信息),为处理Intent组件提供附加的信息。可通过putXX()和getXX()方法存取信息;也可以通过创建Bundle对象,再通过putExtras()和getExtras()方法来存取。
6.flags(标记),指示Android如何启动目标Activity,设置方法为调用Intent的setFlags方法。
常用的Flags参数有: FLAG_ACTIVITY_NEW_TASK:根据Activity Affinity判断是否需要创建新的Task,然后再创建新的Activit实例放进去。 FLAG_ACTIVITY_CLEAR_TOP FLAG_ACTIVITY_NO_HISTORY FLAG_ACTIVITY_SINGLE_TOP
四、Activity的四种加载模式 Activity有四种加载模式:standard, singleTop, singleTask和singleInstance。在AndroidManifest.xml文件中配置android:launchMode的属性,如: android:launchMode="singleTask"。 1、standard 是默认的加载模式,不需要配置launchMode。该加载模式每次 都会创建新的实例。 2、singleTop 不是每次都会创建Activity实例,如果创建Intent的时候栈顶已经有要创建的Activity的实例,则直接将Intent发送给它,不会再创建新的实例。 3、singleTask 和 singleInstance 模式都只创建一个实例,需要Activity的时候,系统会检查栈里面是否已将存在Activity的实例,如果有,就直接Intent发送给它。 4、singleInstance 创建的Activity总是在顶部的栈顶,该Activity独占一格Task,其他的Activity不能存在于该Task中,然而一个singleInstance创建的Activity可以有其他的Activity在它上面叠加。以singleInstance模式启动一个新的Activity,新的Activity都会到新的Task里运行,如同加了FLAG_ACTIVITY_NEW_TASK参数。而除了singleInstance,另外三种模式则可以同其他Activity共存一个Task中。