Intent控件主要用于页面之间的跳转,并且可能伴随数据的传递。
1. 无数据传递
1. 显式Intent
示例代码(可用在onClick()方法中,通过点击来实现跳转):
(PS: 此处为FirstActivity类向SecondActivity类跳转)
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
startActivity(intent); //启动活动
2. 隐式Intent
只有 action 和 category 中的内容同时能够匹配上 Intent 中指定的 action 和 category 时,这个活动才能响应该 Intent。
示例代码:
Intent intent = new Intent("com.example.activitytest.ACTION_START");
intent.addCategory( "com.example.activitytest.MY_CATEGORY"); //可以调用 Intent 中的 addCategory()方法来添加一个 category
startActivity(intent);
注意:隐式Intent需要在AndroidManifest中配置activity、intent-filter、action 、category ,例如:
<activity android:name= ".SecondActivity">
<intent-filter >
<action android:name= "com.example.activitytest.ACTION_START" />
<category android:name= "android.intent.category.DEFAULT" /> --默认的category
<category android:name= "com.example.activitytest.MY_CATEGORY" /> --自定义的 category
</intent-filter >
</activity >
注:
1. 每个 Intent 中只能指定一个 action,但却能指定多个 category。
2. android.intent.category.DEFAULT是一种默认的 category,在调用startActivity()方法的时候会自动将这个 category 添加到 Intent 中。因此,无需再写intent.addCategory( "com.example.activitytest.MY_CATEGORY");
3. 其他隐式Intent
1. 打开网页
调用系统浏览器打开某网页。
示例代码(点击后调用系统浏览器打开百度主页):
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.baidu.com"));
startActivity(intent);
此外,还可以在 intent-filter 标签中再配置一个 data 标签,用于更精确地指定当前活动能够响应什么类型的数据。代码示例:
<activity android:name=".ThirdActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="http"/> --此处为 http 协议
</intent-filter>
</activity>
注:
1. Intent.ACTION_VIEW:Android 系统的内置动作,其常量值为 android.intent.action.VIEW。
2. Uri.parse()方法:将一个网址字符串解析成一个 Uri 对象。
3. setData()方法:接收一个 Uri 对象,主要用于指定当前 Intent 正在操作的数据,而这些数据通常都是以字符串的形式传入到 Uri.parse()方法中解析产生的。
4. 在 data 标签中通过 android:scheme 指定了数据的协议是 http 协议,这样 ThirdActivity 就和浏览器一样,能够响应一个打开网页的 Intent 了(data标签还可其他内容)。
如图所示:
2. 其他
除 http 协议外,我们还可以指定很多其他协议,比如 geo 表示显示地理位置、 tel 表示拨打电话。例如,拨打电话:
示例代码(点击后会启动拨号程序并显示10010):
Intent intent = new Intent(Intent.ACTION_DIAL);
intent.setData(Uri. parse("tel:10010"));
startActivity(intent);
注:Intent.ACTION_DIAL:Android 系统的内置动作。
2. 有数据传递
1. 发送数据
即向下一个活动传递数据。
示例代码:
Intent intent = new Intent(FirstActivity. this, SecondActivity.class);
intent.putExtra( "extra_data", "Hello, SecondActivity!"); //putExtra(键,值)
startActivity(intent);
2. 接收数据
即接收并显示从上一个活动接收的数据。
示例代码:
Intent intent = getIntent();
String data = intent.getStringExtra("extra_data");
Log.i("tag" , data);
Toast.makeText(SecondActivity.this , data, Toast.LENGTH_LONG).show(); //勿忘show出来!
注:由于此处传递的是字符串,因此用getStringExtra方法获取数据;若为整型,则用getIntExtra方法;以此类推。
3. 返回数据
即返回数据给上一个活动。
1) 请求方
startActivityForResult方法期望在活动销毁时能返回一个结果给上一个活动(即请求数据)。
示例代码:
Intent intent = new Intent(Intent.ACTION_VIEW);
startActivityForResult(intent, requestCode); //参数(Intent, requestCode), requestCode要求唯一值
onActivityResult方法得到返回的数据。
示例代码:
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch(requestCode) { //也可用if语句判断接收
case requestCode:
if(resultCode == RESULT_OK) {
String returnedData = data.getStringExtra("data_return");
Log.d("FirstActivity", returnedData);
}
break;
default:
}
}
2) 发送方
返回数据。
示例代码:
Intent intent = new Intent(); //该Intent仅仅是用于传递数据
intent.putExtra("data_return", "Hello FirstActivity!");
setResult(RESULT_OK, intent);
finish();//该类被销毁之后会回调上一个活动的 onActivityResult()方法
Q: 若用户按下Back返回键,数据如何返回?
A: 若按下Back键,会去执行onBackPressed()方法中的代码,将要返回的数据添加到该方法即可。
public void onBackPressed() {
Intent intent = new Intent(); //该Intent仅仅是用于传递数据
intent.putExtra("data_return", "Hello FirstActivity!");
setResult(RESULT_OK, intent);
finish();
}