Giới thiệu
Ví dụ này minh họa cách đăng ký (register) và hủy đăng ký (unregister) một BroadcastReceiver theo cách lập trình (programmatically) để lắng nghe thay đổi kết nối mạng trong Android Kotlin.
Các bước thực hiện
Bước 1: Tạo dự án mới
Mở Android Studio, chọn File → New Project, điền thông tin.
Bước 2: Giao diện (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>
Bước 3: MainActivity.kt
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 = 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 (intent?.action == ConnectivityManager.CONNECTIVITY_ACTION) {
val noConnectivity = intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false)
val message = if (noConnectivity) "Disconnected" else "Connected"
Toast.makeText(context, message, Toast.LENGTH_SHORT).show()
}
}
}
Bước 4: AndroidManifest.xml
<?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>
Chạy ứng dụng
Kết nối thiết bị, nhấn Run. Bật/tắt Wi-Fi hoặc dữ liệu di động để thấy Toast hiển thị "Connected" hoặc "Disconnected".
Lưu ý quan trọng: Từ Android 7.0 (API 24), CONNECTIVITY_ACTION không còn phát broadcast cho các receiver đăng ký trong Manifest. Đăng ký bằng code trong onStart/onStop vẫn hoạt động. Cách hiện đại hơn là dùng ConnectivityManager.NetworkCallback hoặc LiveData.