प्रोग्रामेटिक ब्रॉडकास्ट रिसीवर पंजीकरण
यह उदाहरण दर्शाता है कि नेटवर्क कनेक्टिविटी परिवर्तनों को सुनने के लिए ब्रॉडकास्ट रिसीवर को कोड के माध्यम से (मैनिफेस्ट में घोषित किए बिना) कैसे पंजीकृत और अनपंजीकृत किया जाए।
चरण 1: नया प्रोजेक्ट बनाएं
एंड्रॉइड स्टूडियो में File → New Project चुनें।
चरण 2: लेआउट (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="ब्रॉडकास्ट रिसीवर डेमो"
android:textColor="@android:color/holo_blue_dark"
android:textSize="24sp" />
</RelativeLayout>
चरण 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 networkReceiver = NetworkChangeReceiver()
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(networkReceiver, filter)
}
override fun onStop() {
super.onStop()
// मेमोरी लीक से बचने के लिए अनपंजीकृत करें
unregisterReceiver(networkReceiver)
}
}
// अलग क्लास में ब्रॉडकास्ट रिसीवर
class NetworkChangeReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
if (ConnectivityManager.CONNECTIVITY_ACTION == intent.action) {
val noConnectivity = intent.getBooleanExtra(
ConnectivityManager.EXTRA_NO_CONNECTIVITY,
false
)
val message = if (noConnectivity) "डिस्कनेक्टेड" else "कनेक्टेड"
Toast.makeText(context, message, Toast.LENGTH_SHORT).show()
}
}
}
चरण 4: AndroidManifest.xml (कोई विशेष अनुमति की आवश्यकता नहीं)
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
package="com.example.broadcastreceiver">
<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 7.0+):
Android 7.0 (API 24) से, CONNECTIVITY_ACTION ब्रॉडकास्ट को मैनिफेस्ट में घोषित रिसीवर के लिए नहीं भेजा जाता है, लेकिन प्रोग्रामेटिक रूप से पंजीकृत रिसीवर के लिए यह अभी भी काम करता है जब ऐप फोरग्राउंड में होता है।
आधुनिक विकल्प: ConnectivityManager.NetworkCallback
API 24+ के लिए, नेटवर्क परिवर्तनों को सुनने का अनुशंसित तरीका:
import android.net.ConnectivityManager
import android.net.Network
import android.net.NetworkCapabilities
import android.net.NetworkRequest
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
class MainActivity : AppCompatActivity() {
private lateinit var connectivityManager: ConnectivityManager
private val networkCallback = object : ConnectivityManager.NetworkCallback() {
override fun onAvailable(network: Network) {
runOnUiThread { showToast("नेटवर्क उपलब्ध") }
}
override fun onLost(network: Network) {
runOnUiThread { showToast("नेटवर्क खो गया") }
}
override fun onCapabilitiesChanged(network: Network, capabilities: NetworkCapabilities) {
val hasInternet = capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
runOnUiThread { showToast(if (hasInternet) "इंटरनेट कनेक्टेड" else "इंटरनेट नहीं") }
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
connectivityManager = getSystemService(ConnectivityManager::class.java)
}
override fun onStart() {
super.onStart()
val request = NetworkRequest.Builder()
.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
.build()
connectivityManager.registerNetworkCallback(request, networkCallback)
}
override fun onStop() {
super.onStop()
connectivityManager.unregisterNetworkCallback(networkCallback)
}
private fun showToast(message: String) {
Toast.makeText(this, message, Toast.LENGTH_SHORT).show()
}
}
मुख्य अंतर:
| ब्रॉडकास्ट रिसीवर | NetworkCallback |
|---|---|
| सरल, लीगेसी API | आधुनिक, अधिक विश्वसनीय |
| सभी नेटवर्क परिवर्तन | विशिष्ट क्षमताओं को फ़िल्टर कर सकता है |
| फोरग्राउंड तक सीमित (API 24+) | बैकग्राउंड में भी काम करता है |