在Android中提供了Intent机制来协助应用间的交互与通讯,Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将 Intent传递给调用的组件,并完成组件的调用。Intent不仅可用于应用程序之间,也可用于应用程序内部的Activity/Service/ Broadcast Receiver之间的交互
工作原理:你的程序向Android发送一个Inent请求,Android会根据Intent的内容查询各组件注册时声明的IntentFilter来响应。
详细表现分为二类:显式(Explicit intent)和隐式(Implicit intent)
显式意图:明确指出了目标组件名称的定包名和类名:
①如果需要打开的activity在本应用程序中,可以通过构造方法传入Component
显式:Intent intent = new Intent(this, SecondActivity.class);
隐式:Intent intent = new Intent(对应的action);
startActivity(intent);
②如果不在本应用程序中可以通过指定包名和包名对应的类名
Intent intent = new Intent();
intent.setClsssName(包名,包名+类名);
startActivity(intent);
显式意图的缺陷:如果应用程序升级,包名改变,容易造成2个应用程序的耦合(显示意图的应用依赖于要打开的应用名)
隐式意图:好处组件间解耦合
原理:隐式不明确指定启动哪个Activity,而是设置Action、Data、Category,让系统来筛选出合适的Activity。筛选的条件是根据应用程序注册的<intent-filter>
intentfilter中的内容:
1 action:要执行的动作
2 catergory:(必须):动作类型,一般是默认的,如果是导航\机顶盒则另选
3 data:执行动作要操作的数据
- <intent-filter . . . >
- <data android:type="video/mpeg" android:scheme="http" . . . />
- <data android:type="audio/mpeg" android:scheme="http" . . . />
- </intent-filter>
①指定操作数据类型<data:android:mimeType="text/plain"/>如text/plain ;video/3gpp
这时,需要在intent中设定对应的数据类型:intent.setType("text/plain");不然不能通过测试
②指定前缀<data:android:scheme="http"/> 可以写入要拨打的电话,访问的网址等,如:intent.setData(uri.parse("http://www.baidu.com"));
5、extras:(附件信息):附件信息。可用于打开新的界面传递参数
拨号界面注册的intent-filter
拨打普通电话和网络电话
例:利用隐式意图拨打电话/网络电话
Intent intent = new Intent();//意图
intent.setAction(Intent.ACTION_CALL);<pre name="code" class="java"><span style="white-space:pre"> </span>//设置动作intent.setData(Uri.parse("tel:"+110));//tel为参数前缀,如果sip则是拨打网络电话
startActivity(intent);
使用Intent来传递数据
mainActivity
- Intent intent = new Intent(IntentDemo.this, Other.class);
- // 在Intent中传递数据
- intent.putExtra("name", "AHuier");
- intent.putExtra("age", 22);
- intent.putExtra("address", "XiaMen");
- // 启动Intent
- startActivity(intent);
- Intent intent = getIntent();
- int age = intent.getIntExtra("age", 0);
- String name = intent.getStringExtra("name");
- String address = intent.getStringExtra("address");