activity跳转
显式跳转
Intent intent = new Intent(this, SecondActivity.class);
startActivity(intent);
显式跳转的特点是,intent中包含要跳转过去的组件的.class。
通常用于app内部的跳转。
隐式跳转
Intent intent = new Intent();
intent.setAction("com.example.Login");
intent.addCategory(Intent.CATEGORY_DEFAULT);
startActivity(intent);
隐式跳转的特点是,intent内并未制定要跳转过去的组件,而是通过设定action和category来由系统判断跳转的位置。
<activity android:name=".ThirdActivity">
<intent-filter>
<action android:name="com.example.Login"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
在manifest文件中,可以为某个活动配置特定的action和category,来实现跳转到该活动。需要注意,只有action和category都匹配上才能正确识别。
action是必须要赋值的,category如果不填写的话会自动填充一个默认值。
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://baidu.com"));
startActivity(intent);
通过以上代码可以跳转到默认浏览器。可见隐式跳转常用于app外部的跳转。
跳转时传数据
向下一个activity传数据
Intent intent = new Intent();
intent.setAction("com.example.Login");
intent.putExtra("account", accountText);
intent.putExtra("password", passwordText);
intent.addCategory(Intent.CATEGORY_DEFAULT);
startActivity(intent);
intent里面有一个bundle成员变量,我们向里面设置数据即可。
向上一个activity传数据
活动a跳转到活动b,且活动a需要接收活动b返回时传的数据,a和b都要做以下改进:
活动a:
Intent intent = new Intent(this, SecondActivity.class);
intent.putExtra("account", accountText);
intent.putExtra("password", passwordText);
startActivityForResult(intent, 111);
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
super.onActivityResult(requestCode, resultCode, intent);
switch (requestCode) {
case 111:
if (resultCode == RESULT_OK) {
String response = intent.getStringExtra("back");
Toast.makeText(this, response, Toast.LENGTH_SHORT).show();
}
break;
default:
}
}
活动b:
@Override
public void onBackPressed() {
backAndSendMessage();
}
private void backAndSendMessage() {
Intent intent = new Intent();
intent.putExtra("back", "back to main activity!");
setResult(RESULT_OK, intent);
finish();
}
在代码中111是活动a传入的请求码,活动b返回后的请求码就是该值。
活动b返回后将数据赋值到intent里,随后活动a会调用onActivityResult方法。首先通过请求码判断数据来自于活动b,再根据intent里的响应码判断逻辑分类,最后从intent的bundle里取出数据。