Sobes.tech
Middle

Μίλησε για δέκτες και παρόχους περιεχομένου στο Android.

sobes.tech AI

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

Οι δέκτες (Broadcast Receivers) αντιδρούν σε γενικά συστημικά μηνύματα broadcast, όπως ειδοποιήσεις χαμηλής μπαταρίας, σύνδεση δικτύου ή λήψη φωτογραφίας. Δεν έχουν οπτική διεπαφή και εκτελούν εργασίες στο παρασκήνιο.

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

  • Καταχωρημένοι στατικά: Αναφέρονται στο AndroidManifest.xml. Το σύστημα ξεκινά την εφαρμογή όταν λαμβάνει το αντίστοιχο intent, ακόμα και αν δεν τρέχει.
  • Καταχωρημένοι δυναμικά: Εγγράφονται στον κώδικα με Context.registerReceiver(). Λειτουργούν μόνο όσο υπάρχει το συστατικό (π.χ. δραστηριότητα).

Κάθε δέκτης υλοποιεί τη μέθοδο onReceive(Context context, Intent intent), όπου επεξεργάζεται το εισερχόμενο intent.

Οι πάροχοι περιεχομένου (Content Providers) διαχειρίζονται την κοινή πρόσβαση σε δομημένα δεδομένα. Παρέχουν ένα τυποποιημένο interface CRUD (Create, Read, Update, Delete) για αλληλεπίδραση με δεδομένα που αποθηκεύονται σε διάφορες πηγές (SQLite βάσεις δεδομένων, αρχεία, δεδομένα δικτύου κ.ά.).

Βασικές μέθοδοι των παρόχων περιεχομένου:

  • onCreate(): Αρχικοποίηση του παρόχου.
  • query(): Ανάκτηση δεδομένων.
  • insert(): Προσθήκη νέων δεδομένων.
  • update(): Ενημέρωση υπαρχόντων δεδομένων.
  • delete(): Διαγραφή δεδομένων.
  • getType(): Επιστρέφει τον τύπο MIME των δεδομένων για αυτό το URI.

Η πρόσβαση στον πάροχο περιεχομένου γίνεται μέσω του ContentResolver. Το URI (Unified Resource Identifier) χρησιμοποιείται για την αναγνώριση συγκεκριμένου συνόλου δεδομένων.

Παράδειγμα χρήσης του ContentResolver για ερώτημα δεδομένων:

// Uri για τον πίνακα επαφών
Uri contactsUri = ContactsContract.Contacts.CONTENT_URI;

String[] projection = {
    ContactsContract.Contacts._ID,
    ContactsContract.Contacts.DISPLAY_NAME
};

// Ερώτημα δεδομένων
Cursor cursor = getContentResolver().query(
    contactsUri,
    projection,
    null, // επιλογή
    null, // επιλογήArgs
    null  // σειρά ταξινόμησης
);

if (cursor != null) {
    while (cursor.moveToNext()) {
        long contactId = cursor.getLong(cursor.getColumnIndexOrThrow(ContactsContract.Contacts._ID));
        String displayName = cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.Contacts.DISPLAY_NAME));
        // Επεξεργασία δεδομένων
    }
    cursor.close();
}

Παράδειγμα καταχώρησης στατικού δέκτη στο AndroidManifest.xml:

<receiver
    android:name=".MyBroadcastReceiver"
    android:enabled="true"
    android:exported="true">
    <intent-filter>
        <action android:name="android.intent.action.BATTERY_LOW" />
    </intent-filter>
</receiver>

Παράδειγμα υλοποίησης δέκτη:

public class MyBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction() != null && intent.getAction().equals(Intent.ACTION_BATTERY_LOW)) {
            // Εκτέλεση ενεργειών σε περίπτωση χαμηλής μπαταρίας
        }
    }
}

Βασικές διαφορές:

Χαρακτηριστικό Broadcast Receivers Content Providers
Σκοπός Αντίδραση σε broadcast γεγονότα Διαχείριση πρόσβασης σε δεδομένα
Διεπαφή onReceive() CRUD μέθοδοι μέσω ContentResolver
Οπτική απεικόνιση Δεν υπάρχει Δεν υπάρχει
Πρόσβαση Λαμβάνουν intents από το σύστημα Παρέχουν δεδομένα κατόπιν ερωτήματος