一、Intent显示跳转
//显示Intent跳转Activity
Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
startActivity(intent);
第一个参数类型为context,是一个作为上下文的环境参数。第二个参数类型为class,是我们要打开的目的Activity。
二、Intent隐式跳转
1.首先使用隐式跳转的目的Activity需要在AndroidManifest.xml文件中配置它的intent-filter。
<!-- 使用隐式跳转时需要配置action标签和category标签来进行筛选(action和category可以自定义,category可以有多个) -->
<activity
android:name=".ThirdActivity"
android:label="@string/third_activity_name">
<intent-filter>
<action android:name="com.xxxx.xxxx.activitytest.ACTION_START" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="com.xxxx.xxxx.activitytest.CATEGORY_THIRD" />
</intent-filter>
</activity>
2.然后,不同于显示Intent的是,传参为String类型的Action和Category
//隐式Intent跳转Activity
Intent intent = new Intent("com.xxxx.xxxx.activitytest.ACTION_START");
intent.addCategory("com.xxxx.xxxx.activitytest.CATEGORY_THIRD");
startActivity(intent);
三、让Intent携带数据进行传递
1.先编辑A活动向B活动发送数据
private static final int THIRDACTIVITY = 3;
//传递数据(键值对)
intent.putExtra("openLog","hello,third activity!");
//startActivity(intent);
//如果我们需要获取新打开的活动关闭时返回的信息,那么就使用startActivityForResult方法
//第一个参数是intent,第二个参数是请求码,用于区分该活动打开不同的活动页面,从而判断返回来的数据来源
startActivityForResult(intent,THIRDACTIVITY);
2.再编辑B活动处理获取的数据
Intent intent = getIntent();
//获取上一个活动传递来的数据(键值对)
String openLog = intent.getStringExtra("openLog");
Log.d(TAG, "onCreate:"+openLog);
3.再编辑B活动关闭时返回的数据
//因为在关闭该活动时要返回数据,所以重写onBackPressd方法
@Override
public void onBackPressed() {
//新建一个intent对象用于封装返回的数据
Intent intent = new Intent();
intent.putExtra("data_return","hello,first activity!");
//向上一个活动返回处理结果和intent
setResult(RESULT_OK,intent);
finish();
}
PS:这里调用finish()方法之后,该活动即被销毁。
4.最后来到A活动处理返回的数据
//重写此方法来处理返回的数据
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
//通过请求码来判断数据来源于哪个活动
switch (requestCode){
case THIRDACTIVITY:
if(resultCode==RESULT_OK){
String returnedData = data.getStringExtra("data_return");
Log.d(TAG, "onActivityResult: "+returnedData);
}
break;
default:
}
}
四、使用Intent传递对象(Serializable)
1.让需要传递的对象实现Serializable接口
public class User implements Serializable
2.通过bundle捆绑的形式将对象绑定在intent上
//传递数据(对象)
User user = new User("ein",22);
Bundle bundle = new Bundle();
//键值对的形式,第一个参数类型为String,第二个参数类型为Serializable
bundle.putSerializable("userInfo",user);
intent.putExtra("userData",bundle);
3.解析对象数据时,先获取intent上的bundle,再从bundle中获取对象
//获取上一个活动传递来的对象
Bundle bundle = intent.getBundleExtra("userData");
User user = (User) bundle.get("userInfo");
Log.d(TAG, "name: "+user.getName()+" age:"+user.getAge());
PS:注意键值对的key要一一对应。
五、使用Intent传递对象(Parcelable)
1.让需要传递的对象实现Parcelable接口
public class Manager implements Parcelable
2.重写两个方法,并添加一个成员CREATOR
@Override
public int describeContents() {
return 0;
}
//重写打包方法
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
dest.writeInt(age);
}
//添加一个静态成员CREATOR
public static final Parcelable.Creator<Manager> CREATOR = new Creator<Manager>() {
//重写解包方法,返回对象
@Override
public Manager createFromParcel(Parcel source) {
return new Manager(source.readString(), source.readInt());
}
//重写返回对象数组的方法
@Override
public Manager[] newArray(int size) {
return new Manager[size];
}
};
3.通过bundle捆绑的形式将对象绑定在intent上
//传递数据(对象)
Manager manager = new Manager("einn",23);
Bundle bundle = new Bundle();
//键值对的形式,第一个参数类型为String,第二个参数类型为Parcelable
bundle.putParcelable("managerInfo",manager);
intent.putExtra("userData",bundle);
4.解析对象数据时,先获取intent上的bundle,再从bundle中获取对象
//获取上一个活动传递来的对象
Bundle bundle = intent.getBundleExtra("userData");
Manager manager = (Manager) bundle.get("managerInfo");
Log.d(TAG, "name: "+manager.getName()+" age:"+manager.getAge());
PS:虽然第二种方法要稍微多写点代码,但是更省内存。