[セットトップ][Androidベース]AndroidでIntent伝達オブジェクトをどのように使用するか

6565 ワード

アクティビティの開始、ブロードキャストの送信、サービスの開始など、Intentを利用することができます.上記の操作を行うと、Intentに追加データを追加することができます.例えば、次のコード:MainActivity
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
intent.putExtra("name", "xiaoming");
intent.putExtra("age", 17);
startActivity(intent);

SecondActivityでは、次の値が得られます.
getIntent().getStringExtra("name");
getIntent().getIntExtra("age", 0);

ここではIntentを利用していくつかの値を伝達するだけで、どのようにオブジェクトを伝達しますか?
Serializable方式とParcelable方式の2つの方式があります.
Serializableは、1つのオブジェクトを格納可能または転送可能な状態に変換することを意味するシーケンス化されたものである.シーケンス化されたオブジェクトは、ネットワーク上で転送したり、ローカルに保存したりすることができます.シーケンス化方法は簡単で,クラスにSerializableというインタフェースを実装させるだけでよい.たとえば、type、sexの2つのフィールドを含むAnimalクラスです.コードは次のとおりです.
public class Animal implements Serializable {
    private String type;
    private String sex;
    public String getType()
    {
        return type;
    }
    public void setType(String type)
    {
        this.type = type;
    }
    public Stirng getSex()
    {
        return sex;
    }
    public void setSex(String sex)
    {
        this.sex = sex;
    }
}

MainActivty.java
Animal animal = new Animal();
animal.setType("panda");
animal.setSex("male");
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
intent,putExtra("animal_panda", animal);
startActivity(intent);

SecondActivity.java
Animal animal = (Animal)getIntent().getSerializableExtra(animal_panda);

ここではgetSerializableExtra()メソッドを呼び出してパラメータによって伝達されたシーケンス化オブジェクトを取得し,次にPerson対の退職に下方転換することで,Intentを用いてオブジェクトを伝達する機能を実現することに成功した.
Serializableに加えて、Parcelableを用いても同様の効果が得られるが、オブジェクトをシーケンス化するのとは異なり、Parcelable方式の実現原理は1つの完全なオブジェクトを分解することであり、分解後の各部分はIntentがサポートするデータ型であり、オブジェクトを伝達する機能を実現する.
public class Animal implements Serializable {
    private String type;
    private String sex;
    public String getType()
    {
        return type;
    }
    public void setType(String type)
    {
        this.type = type;
    }
    public Stirng getSex()
    {
        return sex;
    }
    public void setSex(String sex)
    {
        this.sex = sex;
    }
    @Override
    public int describeContents()
    {
        return 0;
    }
    @Override
    public void writeToParcel(Parcel dest, int flags)
    {
        dest.writeString(type);
        dest.writeString(sex);
    }
    public static final Parcelable.Creator<Animal> CREATOR = new Parcelable.Creator<Animal>()
    {
        @Override
        public Animal createFromParcel(Parcel source)
        {
            Animal animal = new Animal();
            animal.type = source.readStirng();
            animal.sex = source.readString();
            return animal;
        }
        @Override 
        public Aniaml[] newArray(int size)
        {
            return new Animal[size];
        }
    }
}

SecondActivity.java
Animal animal = (Animal)getIntent.getParcelableExtra(animal-panda);

存在すなわち理由として,Parcelable方式は複雑であるが効率的であり,一般的にはParcelable方式を用いてIntent伝達の機能を実現することが推奨される.