第二天:Intent学习记录详解
1、什么是Intent
首先,Intent翻译作意图,对于 初次接触,我们可以理解做发起请求让其他组件或活动执行某一动作。Intent是Android应用程序中组件与组件(活动和活动之间通信的中间桥梁);不仅可以指定组件的特定动作执行,还可以在不同Activity之间传递数据。一般情况下,Intent用于启动活动、启动服务以及发送广播。
1.1、Intent有显示和隐式之分,下面 我们先介绍一下显示Intent的用法
Intent intent=new Intent();//先创建一个Intent对象
//指定Intent要执行的动作
intent.setClass(MainActivity.this,SecondActivity.class);
//启动Intent
startActivity(intent);
Intent有多个构造函数,我们选择最基本的来说,Intent(Context packageContent ,class<?>cls);
该构造方法接受两个参数,其中Context packageContent 是为其指定当前启动活动的上下文对象,我们一般就选择当前活动的上下文对象MainActivity.this;另外接收的第二个参数是class<?>cls;该参数是我们要跳转的目标活动(SecondActivity)。
这样理解来看,我们“意图”就体现的很明确了。最后我们通过startActivity()这一方法来启动intent.此方法接收我们创建的intent对象作为启动的参数。、
2、隐式Intent
相比于显式Intent,隐式Intent则更加丰富含蓄。他的意图并不明确指定我们要启动的Activity,而是在Activity的清单配置文件中进行声明响应:
在AndroidMainfest文件下,通过在Activity的标签下配置<intent-filter>的内容,可以指定当前活动能够响应的action和category。在AndroidMainfest.xml文件下,我们添加上如下代码
<activity android:name=".SecondActivity ">
<intent-filter>
<action android:name="com.example.activitytest.ACTION._START"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</actiivity>
只有<action>和<category>中的内容能够完全匹配上intent中指定的action和category时,这个活动才能够响应该intent.所以在FirstActivity中我们这样写:
button1.setOnClickListener(newView.OnClickListener() {
@Override
public voidonClick(View view) {
Intent intent=new Intent("com.example.activitytest.ACTION._START");
startActivity(intent);
}
});
在这个activity中我们创建了一个新的Intent。并把我们在AndroidMianfes 中的SecondActivity的action:(com.example.activitytest.ACTION._START)传入作为启动Intent的参数。
另外由于我们的category声明了是Default属性,所以在intent中,我们不需要改动,而是在StratActivity()函数的回调中,intent直接载入category就行。
同时,我们也是可以自己定义category的,如下:
button1.setOnClickListener(newView.OnClickListener() {
@Override
public voidonClick(View view) {
Intent intent=new Intent("com.example.activitytest.ACTION._START");
intent.addCategory("com.example.activitytest.MY_CATEGORY");
startActivity(intent);
}
});
此时需要注意的是:我们必须在清单文件中为其声明注册这个category
<category android:name="com.example.activitytest.MY_CATEGORY"/>
3、intent的更多用法:
显示网页
Intent it = new Intent(Intent.ACTION_VIEW);
intent.setData( Uri.parse("http://www.baidu.com"));
startActivity(intent);
为了让程序知道这是一个Http请求,我们需要在 清单文件声明data的数据协议
<data android:scheme="http"/>
打开拨号界面
Intent intent =new Intent(Intent.ACTION_DIAL);
intent.setData(Uri.parse("tel:10086"));
startActivity(intent);
直接调用拨打电话
Intent intent =new Intent(Intent.ACTION_CALL);
intent.setData(Uri.parse("tel:10086"));
startActivity(intent);
//要使用这个必须在配置文件中加入相应的permission
调用发送短信的程序
Intent it = new Intent(Intent.ACTION_VIEW);
it.putExtra("sms_body", "The SMS text");
it.setType("vnd.android-dir/mms-sms");
startActivity(it);
发送短信
Uri uri = Uri.parse("smsto:0800000123");
Intent it = new Intent(Intent.ACTION_SENDTO, uri);
it.putExtra("sms_body", "The SMS text");
startActivity(it);
下一节我们继续Intent的启动活动传递数据