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

【Kotlin入門】Androidでブロードキャストレシーバーをプログラム的に登録する方法

この記事では、Kotlinを使ってAndroidアプリにブロードキャストレシーバー(BroadcastReceiver)をプログラム的に(コードから動的に)登録する方法を解説します。マニフェストに静的に宣言する代わりに、Activityのライフサイクルに合わせて登録・解除を行うことで、必要な期間だけシステムからのブロードキャストを受信できるようになります。

ここでは例として、ネットワーク接続状態の変化(CONNECTIVITY_ACTION)を検知し、接続・切断の状態をトーストで表示する実装を紹介します。

実装手順

ステップ1:新規プロジェクトを作成する

Android Studioを起動し、メニューから「File」→「New Project」を選択します。必要な項目を入力して新しいプロジェクトを作成しましょう。テンプレートは「Empty Activity」で問題ありません。

ステップ2:レイアウトファイル(activity_main.xml)を編集する

以下のコードを res/layout/activity_main.xml に記述します。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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"
    tools:context=".MainActivity">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="50dp"
        android:text="Tutorials Point"
        android:textAlignment="center"
        android:textColor="@android:color/holo_green_dark"
        android:textSize="32sp"
        android:textStyle="bold" />
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:text="BroadCastReceiver"
        android:textColor="@android:color/holo_blue_dark"
        android:textSize="24sp" />
</RelativeLayout>

ステップ3:MainActivity.kt にレシーバーの登録処理を書く

次に、以下のコードを src/MainActivity.kt に追加します。ポイントは、onStart()registerReceiver() を呼び出してレシーバーを登録し、onStop()unregisterReceiver() を呼び出して解除している点です。

import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.net.ConnectivityManager
import android.os.Bundle
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
class MainActivity : AppCompatActivity() {
    private val myBroadCastReceiver: BroadcastReceiver = MyBroadCastReceiver()
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        title = "KotlinApp"
    }
    override fun onStart() {
        super.onStart()
        val filter = IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)
        registerReceiver(myBroadCastReceiver, filter)
    }
    override fun onStop() {
        super.onStop()
        unregisterReceiver(myBroadCastReceiver)
    }
}
class MyBroadCastReceiver : BroadcastReceiver() {
    override fun onReceive(context: Context?, intent: Intent?) {
        if (ConnectivityManager.CONNECTIVITY_ACTION == intent!!.action) {
            val noConnectivity: Boolean = intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false)
            if (noConnectivity) {
                Toast.makeText(context, "Disconnected", Toast.LENGTH_SHORT).show()
            } else {
                Toast.makeText(context, "Connected", Toast.LENGTH_SHORT).show()
            }
        }
    }
}

ステップ4:AndroidManifest.xml を確認する

最後に、androidManifest.xml を以下のように記述します。動的登録の場合、レシーバーをマニフェストに宣言する必要はありませんが、ランチャーアクティビティとして MainActivity が設定されていることを確認してください。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android" package="com.example.q11">
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

アプリを実行してみよう

それでは、実際にアプリを起動してみましょう。実機のAndroidスマートフォンをPCに接続している前提で説明します。Android Studioでプロジェクト内のアクティビティファイルを開き、ツールバーの「Run」アイコンをクリックしてください。【Kotlin入門】Androidでブロードキャストレシーバーをプログラム的に登録する方法

デバイス選択ダイアログが表示されたら、接続したモバイル端末を選択して実行します。アプリが起動すると、端末の画面に以下のような初期画面が表示されます。

【Kotlin入門】Androidでブロードキャストレシーバーをプログラム的に登録する方法

この状態でWi-Fiやモバイルデータ通信のオン/オフを切り替えると、ネットワーク接続状態の変化を検知して「Connected」「Disconnected」というトーストメッセージが表示されます。

【Kotlin入門】Androidでブロードキャストレシーバーをプログラム的に登録する方法

補足:APIレベルに関する注意点

ConnectivityManager.CONNECTIVITY_ACTION はAPI 28(Android 9)以降で非推奨となっています。最新のAndroidでは、NetworkCallback や WorkManager、あるいは registerReceiver()RECEIVER_EXPORTED/RECEIVER_NOT_EXPORTED フラグ指定(Android 14以降で必須)など、目的に応じた代替手段の検討をおすすめします。ただし、動的なレシーバー登録の基本的な仕組み自体は本記事の手順と同じです。

  1. Androidでカスタムインテントフィルターをブロードキャストレシーバーに登録する方法

    インテントフィルターとは例に入る前に、Androidにおける「インテントフィルター」について確認しておきましょう。インテントフィルターはIntentFilterクラスのインスタンスであり、暗黙的インテント(Implicit Intent)を扱う際に活躍します。Javaコード内で直接処理するものではなく、AndroidManifest.xmlに設定する必要があります。Androidシステムは起動しようとしているインテントの種類を把握しておく必要があるため、インテントフィルターがインテントやアクションに関する情報をシステムに伝える役割を担っています。インテントを起動する前に、Androidは「アク

  2. AndroidでBroadcastReceiverをプログラムから動的に登録する方法【サンプルコード付き】

    この記事では、AndroidアプリでBroadcastReceiver(ブロードキャストレシーバー)をマニフェストに静的に宣言する代わりに、Javaコードから動的に登録・解除する方法を、ステップごとのサンプルコードとともに解説します。例として、ネットワーク接続状態の変化を検知してToastを表示するレシーバーを実装していきます。 ステップ1:Android Studioで新規プロジェクトを作成する Android Studioを起動し、メニューから「File」→「New Project」を選択します。必要な項目をすべて入力して、新しいプロジェクトを作成してください。 ステップ2:レイアウトファ