天天看點

Android 中通過Intent傳遞類對象,通過實作Serializable和Parcelable接口兩種方式傳遞對象

方式一:通過實作Serializable接口傳遞對象

用一個小的Demo去了解,通過實作Serializable接口傳遞對象。

效果圖:

Android 中通過Intent傳遞類對象,通過實作Serializable和Parcelable接口兩種方式傳遞對象

具體講解在代碼注釋中已經寫出

先建立一個對象:

package com.example.daydemo.bean;

import java.io.Serializable;
//必須實作Serializable接口,此對象才有傳遞的資格
public class Person implements Serializable {
    private String name;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

           

第一個界面MainActivity代碼如下:

package com.example.daydemo;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

import com.example.daydemo.bean.Person;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private Button btn;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btn=findViewById(R.id.btn);

        btn.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        Intent intent = new Intent(this,MainActivity2.class);
        Person person = new Person();
        person.setName("Android");
        person.setAge(30);
        intent.putExtra("person",person);
        startActivity(intent);
    }
}
           

第二個界面MainActivity2,接收MainActivity傳遞過來的對象,代碼如下:

public class MainActivity2 extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);

        //接收MainActivity傳過來的對象
        Intent intent = getIntent();
        Person person = (Person) intent.getSerializableExtra("person");
        Toast.makeText(this, "姓名:"+person.getName()
                +" 年齡:"+person.getAge()
                , Toast.LENGTH_SHORT).show();
    }
}
           

方式二:通過實作Parcelable接口傳遞對象

第一步依然是建立一個對象:

package com.example.daydemo.bean;

import android.os.Parcel;
import android.os.Parcelable;
//此對象實作Parcelable接口,就具備傳遞的資格
public class Student implements Parcelable {
    //自定義成員變量
    private String name;
    private int age;

    public Student() {
    }
    //TODO 注意:讀取,和寫入的順序,必須一緻,否則會報錯
    //從Parcel對象中讀取出來,指派給name,age
    public Student(Parcel in) {
        name = in.readString();
        age = in.readInt();
    }

    //把屬性寫入到Parcel對象裡面去
    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(name);
        dest.writeInt(age);
    }

    //系統擴充用的,忽略
    @Override
    public int describeContents() {
        return 0;
    }

    public static final Creator<Student> CREATOR = new Creator<Student>() {
        //建立Student對象,并且把Parcel建構好,傳遞給我們的Student(成員資料就可以從Parcel對象擷取了)
        @Override
        public Student createFromParcel(Parcel in) {
            return new Student(in);
        }

        @Override
        public Student[] newArray(int size) {
            return new Student[size];
        }
    };

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
           

接下來的步驟跟方式一是一樣的

FirstActivity代碼如下:

public class FirstActivity extends AppCompatActivity implements View.OnClickListener {

    private Button btn;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_first);

        btn=findViewById(R.id.btn);

        btn.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        Intent intent = new Intent(this,SecondActivity.class);
        Student student = new Student();
        student.setName("程式員");
        student.setAge(18);
        intent.putExtra("student",student);
        startActivity(intent);
    }
}
           

第二個頁面SeconActivity代碼如下:

public class SecondActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);

        Intent intent = getIntent();
        Student student = intent.getParcelableExtra("student");
        Toast.makeText(this, "姓名:"+student.getName()
                +" 年齡:"+student.getAge(), Toast.LENGTH_SHORT).show();
    }
}
           

效果跟方式一是一樣的,就不再放圖了。

這兩種方式推薦使用Parcelable接口,傳遞對象。

因為這個是支援,相容安卓虛拟機的,比Serializable性能高很多。

如果是JVM平台,做Java開發,可以選擇使用這個方式Serializable。