使用Intent实现Activity之间的跳转和数据传递

一、Intent显示跳转

//显示Intent跳转Activity
Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
startActivity(intent);

第一个参数类型为context,是一个作为上下文的环境参数。第二个参数类型为class,是我们要打开的目的Activity。

二、Intent隐式跳转

1.首先使用隐式跳转的目的Activity需要在AndroidManifest.xml文件中配置它的intent-filter。



    
        

        
        
    

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 CREATOR = new Creator() {
    //重写解包方法,返回对象
    @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:虽然第二种方法要稍微多写点代码,但是更省内存。

你可能感兴趣的:(Android)