【Kotlin/Android Studio】Intentとは?Activity間のデータの受け渡し
この記事からわかること
- Android Studio/KotlinでIntentクラスの実装方法
- Intentの種類
- 明示的インテント(Explicit Intent)と暗黙的インテント(Implicit Intent)の違い
- Activity間でデータを受け渡す方法
- 格納できるデータ型
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
参考文献:公式リファレンス:Intent
参考文献:公式リファレンス:Intent And Intent filter
環境
- Android Studio:Flamingo
- Kotlin:1.8.20
Intentクラスとは?
public class Intent
extends Object implements Parcelable, Cloneable
AndroidのIntentクラスとは異なるコンポーネント間(ActivityやServiceなど)でActivity間の移動やデータの受け渡し、アクションの実行(地図の表示、写真を撮るなど)、ブロードキャストメッセージの送信などを可能にする役割を持つメッセージングオブジェクトです。
基本的な役割は以下の3つのようです。
アクティビティを開始する
アプリ内の画面を司るActivityを新しく開始する
サービスを開始する
ユーザーインターフェースを持たず、バックグラウンドで操作を実行するコンポーネント(サービス)を開始する
ブロードキャストを配信する
システムの起動や端末の充電開始など、さまざまなシステムイベントに関するブロードキャストを配信する
Intentの種類
Intentは2種類のタイプに分かれます。
明示的インテント(Explicit Intent)
ターゲットアプリのパッケージ名またはコンポーネントの完全修飾クラス名を明示的に指定する。特定のアクティビティに遷移したり、特定のサービスを起動したりする場合に使用される。
暗黙的インテント(Implicit Intent)
特定のコンポーネントを直接指定せず、実行したい操作のみを指定する。システム側が求められた操作に適切なコンポーネントを選択。Webページの表示、地図上の操作、連絡先を選択など。
今回は明示的インテントを使用してActivity間でデータを受け渡す方法をまとめていきます。
Activity間でデータを受け渡す方法
手順
- Activityの追加
- Intentでデータを渡す
- データを受け取る
Intentのデータの保存と取り出しはAndroidでデータを格納する入れ物として多用されるBundle
クラスを内部的に使用して実装されています。そのためIntentで保存するデータはキーと値のセットで管理されます。
Activityの追加
まずはデータの渡し先となるActivityを追加します。Androidアプリ内には複数のActivityを持たせることができるのでもともとある「MainActivity」とは別に「SecondActivity」を作成しておきます。
「app」>「java」>「com.example.プロジェクト名」で右クリックして「New」>「Fragment」>「Empty Views Activity」をクリックします。
class SecondActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_second)
}
}
ここは特にIntentは関係のない作業になります。今回は単純にActivityを増やしたいだけなので特に中に記入はしません。
Intentでデータを渡す
次にMainActivity
内でIntent
を使用してデータを渡していきます。Intent
の引数にはContext
と遷移先となるActivityを明示的に指定します。そしてデータを格納するのがputExtra
メソッドです。保存するデータはキーと値のセットで管理されるので引数にキー文字列と保存したい値を渡します。
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val intent = Intent(this, SecondActivity::class.java)
intent.putExtra("key", "Test")
startActivity(intent)
}
}
そして最後にstartActivity
メソッドを呼び出します。
データを受け取る
データを受け取るためには明示的に指定したSecondActivity
クラスからintent.getStringExtra
メソッドの引数に先ほど指定したキー文字列を渡します。
class SecondActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_second)
val receivedData = intent.getStringExtra("key")
Toast.makeText(this,receivedData.toString(),Toast.LENGTH_LONG)
.show()
}
}
これでActivity間でデータを受け渡すことができました。
格納できるデータ型
格納できるデータ型はString
型だけではなく、putExtra
メソッドの引数違いで複数用意されています。よく使うInt
やBoolean
だけでなく、配列やParcelable
インターフェースを実装したカスタムクラスなど様々なデータ型が格納できるようになっていましう。
@NonNull
public Intent putExtra(String name, boolean value) {
throw new RuntimeException("Stub!");
}
@NonNull
public Intent putExtra(String name, byte value) {
throw new RuntimeException("Stub!");
}
@NonNull
public Intent putExtra(String name, char value) {
throw new RuntimeException("Stub!");
}
@NonNull
public Intent putExtra(String name, short value) {
throw new RuntimeException("Stub!");
}
@NonNull
public Intent putExtra(String name, int value) {
throw new RuntimeException("Stub!");
}
@NonNull
public Intent putExtra(String name, long value) {
throw new RuntimeException("Stub!");
}
@NonNull
public Intent putExtra(String name, float value) {
throw new RuntimeException("Stub!");
}
@NonNull
public Intent putExtra(String name, double value) {
throw new RuntimeException("Stub!");
}
@NonNull
public Intent putExtra(String name, @Nullable String value) {
throw new RuntimeException("Stub!");
}
Intentでできること
他アプリへの共有機能の実装
ブラウザを起動してWebページを開く方法
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。