【Android Kotlin】 インテントとペンディングインテントについて

#Android
writtdden by 上様

こんにちは
Androidエンジニア見習いの上様です。

8月中旬になり、猛暑が続いています。暑さに耐えながらもKotlinの学習を続けています!最近は毎日汗だくですが、学習をすすめております。。。

以前の記事も共有しておりますのでそちらもご覧ください。

【Kotlin】Androidアプリ開発のためのMVPアーキテクチャガイド

Android Kotlinにおけるチェーンメソッドの活用

Android UnitTest作成:MockとMockitoの違い、用途の違いについて

Kotlinでのアプリ開発で疑問に思ったことを学習し、その内容を共有しています!今回はインテント関連の記事となっております!それでは本題に入っていきます!

インテント(Intent)とは何か?

Androidアプリケーションの開発において、インテントは非常によく見かける単語です。インテントは、アプリ間やアプリ内で通信を行うためのメカニズムで、アクティビティの開始やデータの送信などに使われます。

・アクティビティの開始

新しいアクティビティを開始するためには、インテントを作成し、startActivityメソッドを使用します。

val intent = Intent(this, SecondActivity::class.java)
startActivity(intent)

上記の例では、SecondActivityを開始しています。

・データを送信するインテント

他のアプリにデータを送信する場合もインテントを使用します。例えば、テキストメッセージを共有する場合は以下のようにします。

val sendIntent = Intent().apply {
  action = Intent.ACTION_SEND
  putExtra(Intent.EXTRA_TEXT, "テキスト")
  type = "text/plain"
}
startActivity(Intent.createChooser(sendIntent, "共有方法"))

このコードは、テキストを送信するためのインテントを作成し、ユーザーに共有方法を選ばせます。

ペンディングインテント(PendingIntent)とは何か?

ペンディングインテントは、後で実行するためにインテントを保留するものです。通常、通知やアラームで使用されます。例えば、ユーザーが通知をクリックしたときに特定のアクティビティを開く場合に使用されます。

・通知とペンディングインテント

通知を作成し、ユーザーが通知をタップしたときに特定のアクティビティを開く方法を見てみましょう。

val intent = Intent(this, NotificationActivity::class.java).apply {
  flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
}
val pendingIntent: PendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT)

val builder = NotificationCompat.Builder(this, "CHANNEL_ID")
  .setSmallIcon(R.drawable.notification_icon)
  .setContentTitle("通知タイトル")
  .setContentText("通知内容")
  .setPriority(NotificationCompat.PRIORITY_DEFAULT)
  .setContentIntent(pendingIntent)
  .setAutoCancel(true)

with(NotificationManagerCompat.from(this)) {
  notify(1, builder.build())
}

このコードでは、通知がタップされたときにNotificationActivityが開かれます。

・アラームとペンディングインテント

アラームを設定し、特定の時刻にブロードキャストレシーバーを起動するには、以下のようにします。

val alarmManager = getSystemService(Context.ALARM_SERVICE) as AlarmManager
val intent = Intent(this, AlarmReceiver::class.java)
val pendingIntent = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT)

val triggerTime = System.currentTimeMillis() + 60000 // 1分後
alarmManager.setExact(AlarmManager.RTC_WAKEUP, triggerTime, pendingIntent)

このコードでは、1分後にAlarmReceiverが起動されます。

インテントフィルタとブロードキャスト

・インテントフィルタ

インテントフィルタは、特定のインテントを受け取るためのフィルタです。アクティビティ、サービス、ブロードキャストレシーバーはインテントフィルタを使用して、特定のアクションやデータを持つインテントを受け取ります。

// xml
<activity android:name=".MainActivity">
  <intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
  </intent-filter>
</activity>

・ブロードキャストレシーバー

ブロードキャストレシーバーは、システムや他のアプリから送信されたインテントを受信します。

class MyBroadcastReceiver : BroadcastReceiver() {
  override fun onReceive(context: Context, intent: Intent) {
     // インテントを受信したときの処理
  }
}

// レシーバーの登録
val filter = IntentFilter("com.example.MY_ACTION")
registerReceiver(MyBroadcastReceiver(), filter)

カスタムブロードキャストの実装

・ブロードキャストを送信する

まず、ブロードキャストを送信するためのコードを記述します。以下は、ボタンをクリックしたときにカスタムブロードキャストを送信する例です。

val intent = Intent("com.example.CUSTOM_ACTION")
sendBroadcast(intent)

・ブロードキャストレシーバーの作成

次に、カスタムブロードキャストを受信するためのブロードキャストレシーバーを作成します。

class MyBroadcastReceiver : BroadcastReceiver() {
  override fun onReceive(context: Context?, intent: Intent?) {
    if (intent?.action == "com.example.CUSTOM_ACTION") {
      // カスタムブロードキャストを受信したときの処理
      Toast.makeText(context, "カスタムブロードキャストを受信しました", Toast.LENGTH_SHORT).show()
    }
  }
}

・レシーバーの登録

最後に、ブロードキャストレシーバーを動的に登録します。

val receiver = MyBroadcastReceiver()
val filter = IntentFilter("com.example.CUSTOM_ACTION")
registerReceiver(receiver, filter)

まとめ

今回はインテントとペンディングインテントの基本的な使い方を学びました。自分でも調べたときに難しい言い回しや専門用語が多くて混乱することが多かったですが、この記事で少しでも理解が深まれば幸いです。実際にコードを試してみることで、より一層理解が深まるでしょう。以上、見習いエンジニアの上様でした!またどこかでお会いしましょう!

Favorite