Sobes.tech
Junior

Πώς να συνδέσετε έναν BroadcastReceiver για λήψη μηνυμάτων στο Android;

sobes.tech AI

Απάντηση από AI

Υπάρχουν δύο βασικοί τρόποι:

  1. Δυναμική εγγραφή:

    • Καταχωρείται και διαγράφεται προγραμματιστικά στον κώδικα.
    • Διαρκεί όσο το αντικείμενο που την κατέγραψε είναι ενεργό.
    • Χρησιμοποιείται για γεγονότα που δεν χρειάζεται να λαμβάνονται συνεχώς ή όταν η εφαρμογή δεν είναι ενεργή (π.χ. κατά την αλλαγή προσανατολισμού, επίπεδο μπαταρίας).
    // Σε Activity ή Fragment
    private val receiver = object : BroadcastReceiver() {
        override fun onReceive(context: Context?, intent: Intent?) {
            // Επεξεργασία του ληφθέντος μηνύματος
            intent?.action?.let { action ->
                when (action) {
                    Intent.ACTION_BATTERY_CHANGED -> {
                        // Επεξεργασία αλλαγής μπαταρίας
                    }
                    // Άλλες ενέργειες
                }
            }
        }
    }
    
    override fun onResume() {
        super.onResume()
        val intentFilter = IntentFilter().apply {
            addAction(Intent.ACTION_BATTERY_CHANGED)
            // Άλλες ενέργειες
        }
        registerReceiver(receiver, intentFilter)
    }
    
    override fun onPause() {
        super.onPause()
        unregisterReceiver(receiver)
    }
    
  2. Στατική εγγραφή:

    • Δηλώνεται στο αρχείο μανιφέστ (AndroidManifest.xml).
    • Διαρκεί περισσότερο από τον κύκλο ζωής του συστατικού που την κατέγραψε. Μπορεί να λαμβάνει μηνύματα ακόμα και όταν η εφαρμογή δεν είναι ενεργή (για ορισμένες ενέργειες, με περιορισμούς στις τελευταίες εκδόσεις Android).
    • Χρησιμοποιείται για συστημικά γεγονότα που πρέπει να λαμβάνονται συνεχώς (π.χ. κατά την εκκίνηση της συσκευής).
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
              package="com.example.yourapp">
    
        <application ...>
            <receiver android:name=".MyBroadcastReceiver"
                      android:exported="true"> <!-- Σημαντικό για Android 12+ -->
                <intent-filter>
                    <action android:name="android.intent.action.BOOT_COMPLETED" />
                    <action android:name="android.intent.action.AIRPLANE_MODE" />
                    <!-- Άλλες ενέργειες -->
                </intent-filter>
            </receiver>
            ...
        </application>
    </manifest>
    
    // Κλάση BroadcastReceiver
    class MyBroadcastReceiver : BroadcastReceiver() {
        override fun onReceive(context: Context?, intent: Intent?) {
            // Επεξεργασία του ληφθέντος μηνύματος
            intent?.action?.let { action ->
                when (action) {
                    Intent.ACTION_BOOT_COMPLETED -> {
                        // Επεξεργασία μετά την ολοκλήρωση της εκκίνησης
                    }
                    Intent.ACTION_AIRPLANE_MODE_CHANGED -> {
                        // Επεξεργασία αλλαγής λειτουργίας πτήσης
                    }
                    // Άλλες ενέργειες
                }
            }
        }
    }