AndroidのSerializableを使ってアクティビティ間でデータ(オブジェクト)を受け渡す方法
シリアライズ(Serialization)を利用すると、オブジェクトの状態や配列を2つのアクティビティ間で簡単に受け渡すことができます。実際のコードに入る前に、まず「シリアライズとは何か」「AndroidのIntentとどう連携するのか」を理解しておきましょう。
シリアライズとは?
Serializableはマーカーインターフェースです。このインターフェースを実装することで、オブジェクトの状態をバイトストリームへ変換できます。バイトストリームはプラットフォームに依存しないため、JVMはもちろん、他のプラットフォーム上でも問題なく動作します。
以下では、UserinfoというカスタムオブジェクトをMainActivityからSecondActivityへ送信する具体例を、手順を追って解説します。
手順1:新規プロジェクトの作成
Android Studioを開き、「File」→「New Project」を選択して、必要な情報を入力し新しいプロジェクトを作成します。
手順2:レイアウトファイル(activity_main.xml)の編集
res/layout/activity_main.xmlに以下のコードを追加します。名前と電話番号を入力する2つのEditTextと、データ送信用のButtonを配置しています。
<?xml version = "1.0" encoding = "utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android = "https://schemas.android.com/apk/res/android" xmlns:tools = "https://schemas.android.com/tools" android:layout_width = "match_parent"
android:layout_height = "match_parent">
<LinearLayout
android:layout_width = "match_parent"
android:layout_height = "wrap_content"
android:gravity = "center_horizontal"
android:orientation = "vertical">
<EditText
android:id = "@+id/name"
android:layout_width = "match_parent"
android:layout_height = "wrap_content"
android:ems = "10"
android:hint = "Enter a name"
android:inputType = "text" />
<EditText
android:id = "@+id/phone"
android:layout_width = "match_parent"
android:layout_height = "wrap_content"
android:ems = "10"
android:hint = "Enter a Phone number"
android:inputType = "number"/>
<Button
android:layout_width = "wrap_content"
android:layout_height = "wrap_content"
android:text = "Send data"
android:id = "@+id/send"/>
</LinearLayout>
</android.support.constraint.ConstraintLayout>
手順3:MainActivity.javaの実装
次に、メインアクティビティであるMainActivity.javaを以下のように編集します。入力チェックを行い、問題がなければUserinfoオブジェクトに値をセットしてBundle経由で次の画面へ渡します。
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
EditText name;
EditText phone;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
name = findViewById(R.id.name);
phone = findViewById(R.id.phone);
Button send = findViewById(R.id.send);
send.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (TextUtils.isEmpty(name.getText().toString()) && TextUtils.isEmpty(phone.getText().toString())) {
Toast.makeText(MainActivity.this,"Something is wrong kindly check",Toast.LENGTH_LONG).show();
}else{
sendUserData(name.getText().toString(),phone.getText().toString());
}
}
});
}
private void sendUserData(String username, String userPhone) {
Userinfo userinfo = new Userinfo();
userinfo.setName(username);
userinfo.setPhone(userPhone);
Intent send = new Intent(MainActivity.this,SecondActivity.class);
Bundle b = new Bundle();
b.putSerializable("serialzable",userinfo);
send.putExtras(b);
startActivity(send);
}
}
ポイントは b.putSerializable("serialzable", userinfo) の部分です。Bundleに対してputSerializable()メソッドを使うことで、Serializableを実装したオブジェクトをそのまま格納できます。
手順4:SecondActivity.javaの実装
遷移先となるSecondActivity.javaです。ここでは、Intentから getSerializableExtra() を使ってオブジェクトを取り出し、画面に表示します。
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
public class SecondActivity extends AppCompatActivity {
Userinfo userinfo;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
TextView data = findViewById(R.id.data);
userinfo = (Userinfo) getIntent().getSerializableExtra("serialzable");
String name = userinfo.getName();
String phone = userinfo.getPhone();
data.setText("Your entered name is "+name+" number is "+phone);
}
@Override
protected void onPause() {
super.onPause();
userinfo = null;
}
}
手順5:SerializableなUserinfoクラスの作成
最後に、アクティビティ間で受け渡すUserinfoオブジェクトを定義します。java.io.Serializableインターフェースを実装することで、このクラスはシリアライズ可能になります。
import java.io.Serializable;
class Userinfo implements Serializable {
String name;
String phone;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
}
アプリの実行と動作確認
それでは、アプリを実行してみましょう。実機のAndroidスマートフォンをパソコンに接続しているものとして説明します。Android Studioからプロジェクト内のいずれかのアクティビティファイルを開き、ツールバーの「Run
」アイコンをクリックします。デバイス一覧から自分のモバイル端末を選択すると、端末の画面にアプリが表示されます。


ここで「Send data」ボタンをタップすると、SecondActivityへ遷移します。

上記の出力結果のように、MainActivityで入力した情報がSecondActivityへ正しく引き継がれていることが確認できます。
まとめ
Serializableを実装したクラスのオブジェクトは、BundleのputSerializable()でIntentに格納し、getSerializableExtra()で受け取るだけで、アクティビティ間の受け渡しが実現できます。Parcelableと比べると実装がシンプルなので、小規模なデータ受け渡しには非常に便利な手法です。
-
UbuntuでADBを使ってAndroidのデータをバックアップ・復元する完全ガイド
Androidのアプリデータやテキストメッセージなどをバックアップするのは、非常に面倒な作業で、場合によっては費用もかかります。Playストアにはデータのバックアップをうたうアプリが数多く存在しますが、性能にムラがあったり、高額だったりすることも少なくありません。実は、もっと優れた方法があり、しかもそのすべてをパソコン上で完結できるのです。 Androidには開発者向けツール一式が標準で用意されています。多数のツールが含まれていますが、中でも特に重要なのがADB(Android Debug Bridge)です。このツールを使えば、Androidデバイスへ直接コマンドラインからアクセスできます
-
Androidのデータバインディング入門:Data Binding Libraryでレイアウトとデータを結びつける方法
データバインディングとは、アプリが扱う「データ」と、画面上の視覚的なUI要素を結びつける(バインドする)ための手法です。この仕組みを使うと、UI側の値が更新されるたびに、裏側で保持しているデータも自動的に更新されます。 決して目新しい概念ではなく、AngularJS、React、Vueなど、多くのフロントエンドフレームワークがすでにこの仕組みを設計に取り入れています。 しかし本記事で注目するのはフロントエンドフレームワークではなく、モバイル開発です。GoogleはAndroid向けにData Binding Libraryを提供しており、これはAndroid Jetpackの一部として位置づけ