Intent伝達オブジェクトのいくつかの方法


オリジナル記事、転載は明記してくださいhttp://blog.csdn.net/leejizhou/article/details/51105060李済洲のブログ
Intentの使い方はよく知っていると思います.IntentはActivity、Serviceなどを起動するために使用できます.また、以下のコードなど、Intentを通じてデータを伝達することもできます.
                Intent intent=new Intent(MainActivity.this,OtherActivity.class);
                intent.putExtra("name","lijizhou");
                intent.putExtra("age",22);
                startActivity(intent);

putExtraは多くのJavaデータ型を伝えることができますが、まだ限られています.カスタムオブジェクトを伝えたいときは手がつけられないことに気づきます.SO、本編では、Intentを利用してオブジェクトを伝えるいくつかの実装方法を紹介します.AndroidではIntentオブジェクトを渡すには2つの方法があります.1つはSerializableインタフェースを通じてオブジェクトを渡すことです.1つは、Parcelableインタフェースを実装することによってオブジェクトを伝達することである.SerializableはJavaが提供するシーケンス化インタフェースであり、ParcelableのAndroidチームが設計したもので、両者にはそれぞれメリットとデメリットがある.
Serializableの使い方について説明します
Serializableはシーケンス化の意味で、1つのオブジェクトを格納可能または転送可能な状態に変換し、オブジェクトをSerializableシーケンス化した後にIntentでActivity間の転送を行うことができます.
例えば、以下のようなSerObjectクラスは、SerializableインタフェースであるSerObjectを実現する.java
public class SerObject implements Serializable {
    private static final long serialVersionUID=1L;
    private String name;
    private String age;
    public String getAge() {
        return age;
    }
    public void setAge(String age) {
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

}

このserialVersionUIDは、シーケンス化と逆シーケンス化でバージョンの互換性を保つ役割を果たしています.指定していない場合は、実行時にもデフォルトで生成されます.逆シーケンス化を行う場合は、現在のクラスのserialVersionUIDと同じデータだけが正常に逆シーケンス化されます.serialVersionUIDを指定しない場合は、一般的に問題はありません.しかし、現在のクラスが変更された場合、例えばメンバー変数が削除された場合、現在のクラスのserialVersionUIDも変更され、その後、データを逆シーケンス化するとエラーが発生します.ここでは1 L、LをLongデータ型と指定します.
次にオブジェクトの転送を行い,Intentでオブジェクトデータを携帯することでActivity 2を起動する.
                SerObject obj=new SerObject();
                obj.setName("Serializable");
                obj.setAge("22");
                Intent mIntent = new Intent(MainActivity.this,Activity2.class);
                mIntent.putExtra("Ser",obj);
                startActivity(mIntent);

そしてActivity 2でデータを読み出して印刷
            SerObject serObject = (SerObject)getIntent().getSerializableExtra("Ser");
            Log.i("log",serObject.getName()+"----"+serObject.getAge());

LogによりActivity 2への転送に成功していることがわかる
这里写图片描述
Serializableの使用は非常に簡単で、以下にParcelableのインタフェースがどのようにParcelableを実現するシーケンス化原理は1つのオブジェクトを分解することであり、分解後の各部分はIntentがサポートするデータ型であるため、オブジェクトを伝達する機能を実現した.
例えば次のParObjectクラス
public class ParObject implements Parcelable {
    private String name;
    private String age;

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getAge() {
        return age;
    }
    public void setAge(String age) {
        this.age = age;
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {

        dest.writeString(name);
        dest.writeString(age);
    }

    protected ParObject(Parcel in) {
        name = in.readString();
        age = in.readString();
    }
    public ParObject(){

    }
    public static final Creator CREATOR = new Creator() {
        @Override
        public ParObject createFromParcel(Parcel in) {
            return new ParObject(in);
        }

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


}

Parcelableによる実装は複雑であることが分かるが,Parcelableインタフェースを実装するとwriteToParcelとdescribeContentsメソッドを書き換える必要があり,describeContentsメソッドは直接0を返すとよいが,writeToParcelメソッドではParcelオブジェクトを呼び出してデータ書き込みを行う必要がある.writeString(name)は、nameが文字列タイプであればwriteString、IntタイプであればwriteIntなどを呼び出し、上記のコードを参照することに注意してください.
そしてこのクラスでCREATORという定数を実現し、ここでParcelableを作成する.Creatorインタフェースの実装では、汎用型をParObject(上のコードを参照)として指定し、createFromParcelとnewArrayの2つのメソッドを書き換え、createFromParcelで先ほどwriteToParcelで書き込まれたデータをParcelで読み取り、ParObjectオブジェクトに戻る.ここでreadはwriteの場合と同じ順序であることに注意してください.newArrayメソッドは,new 1つのParObjectクラスの配列であり,sizeを配列サイズとすればOKである.
これでParcelableのインタフェースが実現すればOKですが、欠点はデータの書き込みや読み取りなどの方法で手動で実現する必要があることです.あなたが見ている頭が大きくなったと信じています.もちろんAndroid Studioという強力なツールを忘れてはいけません.Javaクラスを作成してParcelableを実装すると、後続のwriteToParcel createFromParcel newArrayなどの煩雑なコードが自動的に実装されます.
クラス実装Parcelableは、次にクラス名のAlt+enterにポイントします.
Intent传递对象的几种方式_第1张图片
次のオブジェクトの伝達はSerializableと似ています
                ParObject obj=new ParObject();
                obj.setName("Parcelable");
                obj.setAge("22");
                Intent mIntent = new Intent(MainActivity.this,Activity2.class);
                mIntent.putExtra("Par",obj);
                startActivity(mIntent);

そしてActivity 2で受信して印刷
            ParObject parObject = (ParObject)getIntent().getParcelableExtra("Par");
            Log.i("log",parObject.getName()+"----"+parObject.getAge());

オブジェクト転送成功这里写图片描述
OkはIntentでオブジェクトを渡す2つの方法で紹介しました.SerializableとParcelableはそれぞれメリットとデメリットがあり、Serializableコードは簡単ですが、オーバーヘッドが大きく、androidアプリの性能に一定の影響を与えるので、Parcelableの使用は面倒ですが、効率が高く、androidが推奨するシーケンス化方式でもあります.まとめ:メモリの中のシーケンス化例えばIntentは推薦Parcelableを伝達して、設備に記憶してあるいはネットの伝送を行って推薦Serializableを推薦して、みんなを歓迎して下で伝言を残します
PSは後で私のブログにアクセスして直接ブラウザでwww.lijizhouを入力することができます.comは自動的にCSDNにジャンプします
本編の博文のソースコードは住所をダウンロードしますhttp://download.csdn.net/detail/leejizhou/9485885