Sobes.tech
Junior

Kuidas ühendada BroadcastReceiver sõnumite saamiseks Androidis?

sobes.tech AI

Vastus AI-lt

On kaks peamist viisi:

  1. Dünaamiline registreerimine:

    • Registreeritakse ja tühistatakse programmikoodis.
    • Elab seni, kuni aktiivne objekt, mis selle registreeris, on aktiivne.
    • Kasutatakse sündmusteks, mida ei ole vaja pidevalt vastu võtta või kui rakendus ei ole aktiivne (näiteks orientatsiooni muutmisel, aku laadimistaseme muutmisel).
    // Activity või Fragmentis
    private val receiver = object : BroadcastReceiver() {
        override fun onReceive(context: Context?, intent: Intent?) {
            // Saadud sõnumi töötlemine
            intent?.action?.let { action ->
                when (action) {
                    Intent.ACTION_BATTERY_CHANGED -> {
                        // Aku muutuste töötlemine
                    }
                    // Muud tegevused
                }
            }
        }
    }
    
    override fun onResume() {
        super.onResume()
        val intentFilter = IntentFilter().apply {
            addAction(Intent.ACTION_BATTERY_CHANGED)
            // Muud tegevused
        }
        registerReceiver(receiver, intentFilter)
    }
    
    override fun onPause() {
        super.onPause()
        unregisterReceiver(receiver)
    }
    
  2. Statiline registreerimine:

    • Deklareeritud manifestifailis (AndroidManifest.xml).
    • Elab kauem kui komponendi elutsükkel, mis selle registreeris. Võib saada sõnumeid isegi siis, kui rakendus ei ole aktiivne (mõnede tegevuste puhul, piirangutega viimastes Androidi versioonides).
    • Kasutatakse süsteemsete sündmuste jaoks, mida tuleb pidevalt vastu võtta (näiteks seadme käivitamisel).
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
              package="com.example.yourapp">
    
        <application ...>
            <receiver android:name=".MyBroadcastReceiver"
                      android:exported="true"> <!-- Oluline Android 12+ jaoks -->
                <intent-filter>
                    <action android:name="android.intent.action.BOOT_COMPLETED" />
                    <action android:name="android.intent.action.AIRPLANE_MODE" />
                    <!-- Muud tegevused -->
                </intent-filter>
            </receiver>
            ...
        </application>
    </manifest>
    
    // BroadcastReceiver klass
    class MyBroadcastReceiver : BroadcastReceiver() {
        override fun onReceive(context: Context?, intent: Intent?) {
            // Saadud sõnumi töötlemine
            intent?.action?.let { action ->
                when (action) {
                    Intent.ACTION_BOOT_COMPLETED -> {
                        // Käivituse lõpetamise töötlemine
                    }
                    Intent.ACTION_AIRPLANE_MODE_CHANGED -> {
                        // Lennuki režiimi muutmise töötlemine
                    }
                    // Muud tegevused
                }
            }
        }
    }