Android
中Intent
的使用
Intent
是Android
程序中各组件之间进行交互的一种重要方式,它不仅可以指明当前组件想要执行的动作,还可以在不同组件之间传递数据。Intent
一般可被用于启动活动、启动服务以及发送广播等场景
一、 Intent
用于启动活动或者服务
Intent可以分为显式Intent和隐式Intent两种
显式Intent
Intent
有多个构造函数的重载,其中一个是Intent (Context packageContext,Class>cls)
,这个构造函数接收两个参数,第一个参数是Context要求提供一个启动活动的上下文,第二个参数Class则是想要启动的目标活动
Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
隐式Intent
用法一(启动本程序中的活动)
相对于显式Intent
,隐式Intent则包含了许多,它并不明确指出我们想要启动哪一个活动,而是制定了一些更为抽象的action
和category
等信息,然后交给系统去分析这个Intent
,并帮我们找到合适的活动,并启动它。
首先我们要在AndroidManifest
中添加如下代码
<intent-filter>
<action android:name="com.example.activitytest.ACTION_START"/>
<category android:name="android.intent.category.DEFAULT"/>
intent-filter>
com.example.activitytest//是当前Activity所在的文件夹的名称
当和中的内容同时能够匹配上Intent
中指定的action
和category
时,活动才能相应该Intent
然后在onclick()
方法中添加
Intent intent=new Intent("com.examole.activitytest.ACTION_START");
startActivity(intent);
这里运用Intent
的另一个构造函数,直接将action
的字符串穿了进去,表明我们想要启动能够响应com.examole.activitytest.ACTION_START
这个action
的活动,而category="android.intent.category.DEFAULT"
是一种默认的category
,在调用startActivity(intent);
时会将此category
添加到Intent
中。
隐式Intent
的用法二(启动别的程序中的活动)
使用隐式Intent,我们不仅可以启动自己程序内的活动,还可以启动其他程序的活动
Intent intent=new Intent(Intent.ACTION_VIEW)
intent.setData(Uri.parse("http://www.baidu.com"))
startActivity(intent)
这里我们指定Intent
的action
是Intent.ACTION_VIEW
这是Android系统内置的动作,其常量值为android.intent.action.VIEW
。然后通过Uri.parse()方法,将一个网址字符串解析为Uri对象,然后再通过intent.setData()方法将这个Uri对象传递进去。
* setData()
方法接收一个Uri对象,主要用于当前Intent正在操作的数据。而这些数据通常都是以字符串的形式传入到Uri.parse()方法中解析产生的。
隐式Intent
的用法三(使得当前的活动能够响应一个打开网页的Intent
)
在
标签中再配置一个
标签,用于更精确地指定当前活动能够响应什么类型的数据。
标签中主要配置以下内容:
android :scheme
。用于指定数据的协议部分,如http
部分
android :host
。用于指定数据的主机名部分。如www.baidu.com
android port
。用于指定数据的端口部分,一般紧随在主机名之后。
android path
。用于指定主机名和端口之后的部分,如一段网址中跟在域名之后的内容。
android mimeType
。用于指定可以处理数据的类型,允许使用通配符的方式进行指定。
只有
标签中指定的内容和Intent
中携带的Data
完全一致时,当前活动才能相应该Intent
。
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:scheme="http"/>
intent-filter>
Androidmanifest
中的代码使得当前活动成为一个可以响应一个打开网页的Intent
了。
隐式Intent
的用法四(打开拨号界面,并附有号码)
Intent intent =new Intent(Intent.ACTION_DIAL)
intent.setData(Uri.parse("tel:10086"))
startActivity(intent)
二、 Intent
用于传递数据
Intent
在活动之间传递数据的使用方法
—-向下一个活动传递数据
FirstActivity
中的代码:
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String data="Hello World";
Toast.makeText(FirstActivity.this, "进入第二个活动中!",
Toast.LENGTH_SHORT).show();
Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
intent.putExtra("extra_data",data);
startActivity(intent);
}
});
SecondActivity
中的代码
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.second_activity);
Intent intent=getIntent();
String data=intent.getStringExtra("extra_data");
if(data==null)
Toast.makeText(SecondActivity.this,"数据传递失败!",Toast.LENGTH_SHORT).show();
else
Toast.makeText(SecondActivity.this,data,
Toast.LENGTH_SHORT).show();
}
—-向上一个活动传递数据
一般情况下,我们需要返回上一个活动时,只需要按一下Back键就可以销毁当前活动,并返回上一个活动,并没有一个用于启动活动的Intent
来传递数据。Activity中有一个startActivityForResult()
方法也是用来启动活动的,但这个方法期望在活动销毁的时候能够返回一个结果给上一个活动。
FirstActivity
中的代码:
button1.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
Intent intent=new Intent("comyhyhte.example.lx.androidtest.ACTION_START");
intent.addCategory("comyhyhte.example.lx.androidtest.MY_CATEGORY");
startActivityForResult(intent,1);
}
});
SecondActivity
中的代码
finish.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
Intent intent=new Intent();
intent.putExtra("data_return","之前的活动已经被销毁了!");
setResult(RESULT_OK,intent);
finish();
}
});
由于我们在FirstActivity
中使用了startActivityForResult()方法来启动SecondActivity
,所以在SecondActivity
被销毁之后会回调FirstActivity
中的onActivityResult()
方法
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode){
case 1:
if(resultCode==RESULT_OK) {
String returnData = data.getStringExtra("data_return");
Toast.makeText(FirstActivity.this,returnData,Toast.LENGTH_SHORT).show();
}
break;
default:
}
}
onActivityResult()
方法中有三个参数,第一个参数是requestCode
即我们在启动活动时的请求码,第二个参数是resultCode
即我们在返回数据时传入的处理结果。第三个参数是data
即携带着返回数据的Intent。由于在一个活动中可能会通过startActivityForResult()
启动许多不同的活动,而这些活动在被销毁时,都会回调onActivityResult()
方法,因此我们首先要做的是通过检查requestCode
的值来判断数据来源,然后在通过resultCode
判断处理结果是否成功,最后从data中取值,并将所取值显示出来。
此时你可能会有疑惑,用户要是在销毁SecondActivity
时并不是点击按钮finish而是点击Back键来销毁活动的,那么就不能做到将数据传递给上一个活动了,事实是这样的,但是我们可以对程序做稍微的修改,就可以再次将数据传递给上一个活动。
在SecondActivity
中重写onBackPressed()
方法就可以了,代码如下:
public void onBackPressed() {
Intent intent=new Intent();
intent.putExtra("data_return","之前的活动已经被销毁了!");
setResult(RESULT_OK,intent);
finish();
}