Sobes.tech
Junior

Cum să conectezi un BroadcastReceiver pentru a primi mesaje în Android?

sobes.tech AI

Răspuns de la AI

Există două metode principale:

  1. Înregistrare dinamică:

    • Se înregistrează și se dezînregistrează programatic în cod.
    • Durează atât timp cât obiectul care l-a înregistrat este activ.
    • Se folosește pentru evenimente care nu trebuie să fie primite în mod constant sau când aplicația nu este activă (de exemplu, la schimbarea orientării, nivelul bateriei).
    // În Activity sau Fragment
    private val receiver = object : BroadcastReceiver() {
        override fun onReceive(context: Context?, intent: Intent?) {
            // Procesarea mesajului primit
            intent?.action?.let { action ->
                when (action) {
                    Intent.ACTION_BATTERY_CHANGED -> {
                        // Procesarea schimbării bateriei
                    }
                    // Alte acțiuni
                }
            }
        }
    }
    
    override fun onResume() {
        super.onResume()
        val intentFilter = IntentFilter().apply {
            addAction(Intent.ACTION_BATTERY_CHANGED)
            // Alte acțiuni
        }
        registerReceiver(receiver, intentFilter)
    }
    
    override fun onPause() {
        super.onPause()
        unregisterReceiver(receiver)
    }
    
  2. Înregistrare statică:

    • Este declarată în fișierul de manifest (AndroidManifest.xml).
    • Durează mai mult decât ciclul de viață al componentei care a înregistrat-o. Poate primi mesaje chiar și atunci când aplicația nu este activă (pentru unele acțiuni, cu limitări în ultimele versiuni de Android).
    • Se folosește pentru evenimentele sistemului care trebuie să fie primite în mod constant (de exemplu, la pornirea dispozitivului).
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
              package="com.example.yourapp">
    
        <application ...>
            <receiver android:name=".MyBroadcastReceiver"
                      android:exported="true"> <!-- Important pentru Android 12+ -->
                <intent-filter>
                    <action android:name="android.intent.action.BOOT_COMPLETED" />
                    <action android:name="android.intent.action.AIRPLANE_MODE" />
                    <!-- Alte acțiuni -->
                </intent-filter>
            </receiver>
            ...
        </application>
    </manifest>
    
    // Clasa BroadcastReceiver
    class MyBroadcastReceiver : BroadcastReceiver() {
        override fun onReceive(context: Context?, intent: Intent?) {
            // Procesarea mesajului primit
            intent?.action?.let { action ->
                when (action) {
                    Intent.ACTION_BOOT_COMPLETED -> {
                        // Procesarea la finalizarea pornirii
                    }
                    Intent.ACTION_AIRPLANE_MODE_CHANGED -> {
                        // Procesarea schimbării modului avion
                    }
                    // Alte acțiuni
                }
            }
        }
    }