Android
 Computer >> コンピューター >  >> プログラミング >> Android

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 AndroidのSerializableを使ってアクティビティ間でデータ(オブジェクト)を受け渡す方法」アイコンをクリックします。デバイス一覧から自分のモバイル端末を選択すると、端末の画面にアプリが表示されます。

AndroidのSerializableを使ってアクティビティ間でデータ(オブジェクト)を受け渡す方法


AndroidのSerializableを使ってアクティビティ間でデータ(オブジェクト)を受け渡す方法

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

AndroidのSerializableを使ってアクティビティ間でデータ(オブジェクト)を受け渡す方法

上記の出力結果のように、MainActivityで入力した情報がSecondActivityへ正しく引き継がれていることが確認できます。

まとめ

Serializableを実装したクラスのオブジェクトは、BundleのputSerializable()でIntentに格納し、getSerializableExtra()で受け取るだけで、アクティビティ間の受け渡しが実現できます。Parcelableと比べると実装がシンプルなので、小規模なデータ受け渡しには非常に便利な手法です。

  1. UbuntuでADBを使ってAndroidのデータをバックアップ・復元する完全ガイド

    Androidのアプリデータやテキストメッセージなどをバックアップするのは、非常に面倒な作業で、場合によっては費用もかかります。Playストアにはデータのバックアップをうたうアプリが数多く存在しますが、性能にムラがあったり、高額だったりすることも少なくありません。実は、もっと優れた方法があり、しかもそのすべてをパソコン上で完結できるのです。 Androidには開発者向けツール一式が標準で用意されています。多数のツールが含まれていますが、中でも特に重要なのがADB(Android Debug Bridge)です。このツールを使えば、Androidデバイスへ直接コマンドラインからアクセスできます

  2. Androidのデータバインディング入門:Data Binding Libraryでレイアウトとデータを結びつける方法

    データバインディングとは、アプリが扱う「データ」と、画面上の視覚的なUI要素を結びつける(バインドする)ための手法です。この仕組みを使うと、UI側の値が更新されるたびに、裏側で保持しているデータも自動的に更新されます。 決して目新しい概念ではなく、AngularJS、React、Vueなど、多くのフロントエンドフレームワークがすでにこの仕組みを設計に取り入れています。 しかし本記事で注目するのはフロントエンドフレームワークではなく、モバイル開発です。GoogleはAndroid向けにData Binding Libraryを提供しており、これはAndroid Jetpackの一部として位置づけ