Το Intent Filter είναι μια δηλωτική δήλωση στο AndroidManifest.xml που υποδεικνύει στο σύστημα ποιες σιωπηρές προθέσεις μπορεί να επεξεργαστεί ένα στοιχείο της εφαρμογής. Σύμφωνα με τον Οδηγό Ανάπτυξης Android, το φίλτρο περιέχει action, category και data, βάσει των οποίων το σύστημα δρομολογεί κλήσεις από άλλες εφαρμογές και συστήματα συμβάντα. Η ανάπτυξη Android χρησιμοποιεί το Intent Filter ως τον κύριο μηχανισμό χαλαρής σύνδεσης μεταξύ στοιχείων διαφορετικών εφαρμογών.
Κύρια σημεία
Intent Filter είναι ένα στοιχείο διαμόρφωσης της εφαρμογής Android που ενημερώνει το σύστημα για τη δυνατότητα ενός στοιχείου να επεξεργάζεται συγκεκριμένους τύπους σιωπηρών προθέσεων. Σε αντίθεση με τα ρητά Intent που καθορίζουν μια συγκεκριμένη κλάση, τα σιωπηρά Intent περιέχουν μόνο περιγραφή της απαιτούμενης ενέργειας και το σύστημα βρίσκει το κατάλληλο στοιχείο βάσει των καταχωρημένων φίλτρων.
Τα φίλτρα δηλώνονται εντός του στοιχείου — Activity, Service ή BroadcastReceiver — στο αρχείο AndroidManifest.xml. Κάθε φίλτρο μπορεί να περιέχει πολλαπλά στοιχεία action, category και data. Ένα στοιχείο μπορεί να έχει απεριόριστο αριθμό Intent Filter, καθένα από τα οποία περιγράφει ένα ξεχωριστό σενάριο επεξεργασίας.
Το Intent Filter υλοποιεί την αρχή της χαλαρής σύνδεσης μεταξύ στοιχείων εφαρμογών. Η εφαρμογή Α δεν χρειάζεται να γνωρίζει την ύπαρξη της εφαρμογής Β — απλώς στέλνει ένα Intent με περιγραφή της ενέργειας και το σύστημα το δρομολογεί βάσει των φίλτρων. Αυτός ο μηχανισμός αποτελεί τη βάση του Share Sheet, της επιλογής προγράμματος περιήγησης και της επεξεργασίας deep link.
Τα ρητά Intent καθορίζουν μια συγκεκριμένη κλάση στοιχείου για εκκίνηση. Χρησιμοποιούνται για εσωτερική πλοήγηση εντός μιας εφαρμογής, όταν ο προγραμματιστής γνωρίζει ακριβώς ποιο Activity πρέπει να ανοίξει. Τα σιωπηρά Intent περιέχουν μόνο περιγραφή της ενέργειας και το στοιχείο καθορίζεται δυναμικά από το σύστημα.
Το Intent Filter λειτουργεί αποκλειστικά με σιωπηρά Intent. Εάν στο Intent καθορίζεται μια συγκεκριμένη κλάση, το σύστημα αγνοεί όλα τα φίλτρα και εκκινεί το καθορισμένο στοιχείο απευθείας. Τα φίλτρα ελέγχονται μόνο κατά την επίλυση σιωπηρών κλήσεων, καθιστώντας τα βασικό στοιχείο διαλειτουργικότητας μεταξύ εφαρμογών.
| Χαρακτηριστικό | Ρητό Intent | Σιωπηρό Intent |
|---|---|---|
| Στοιχείο | Καθορίζεται ρητά (className) | Καθορίζεται από το σύστημα |
| Intent Filter | Δεν απαιτείται | Απαιτείται |
| Παράδειγμα | startActivity(Intent(this, ProfileActivity::class.java)) | Intent(ACTION_VIEW, Uri.parse(“https://example.com”)) |
| Ασφάλεια | Υψηλότερη (χωρίς υποκλοπή) | Χαμηλότερη (πιθανές συγκρούσεις) |
Κάθε Intent Filter αποτελείται από τρεις ομάδες στοιχείων — action, category και data — ο συνδυασμός των οποίων καθορίζει ποια Intent θα λαμβάνει το στοιχείο. Το φίλτρο θεωρείται ότι ικανοποιείται εάν το Intent ταιριάζει με τουλάχιστον ένα στοιχείο από κάθε ομάδα.
Το Action περιγράφει την εκτελούμενη ενέργεια — προβολή, επεξεργασία, αποστολή. Η Category προσθέτει πρόσθετο πλαίσιο επεξεργασίας — για παράδειγμα, δυνατότητα εκκίνησης από το πρόγραμμα περιήγησης. Το Data καθορίζει τη μορφή των πληροφοριών που υποβάλλονται σε επεξεργασία μέσω URI ή τύπου MIME.
Παράδειγμα Intent Filter για Activity που ανοίγει συνδέσμους προφίλ χρηστών. Το φίλτρο περιλαμβάνει και τις τρεις ομάδες στοιχείων για ακριβή δρομολόγηση.
<activity android:name=".ProfileActivity">
<intent-filter>
<action
android:name="android.intent.action.VIEW" />
<category
android:name="android.intent.category.DEFAULT" />
<category
android:name="android.intent.category.BROWSABLE" />
<data
android:scheme="myapp"
android:host="profile" />
</intent-filter>
</activity>
Σημειώστε την υποχρεωτική αναφορά category DEFAULT — χωρίς αυτήν, το σύστημα δεν θα μεταδίδει σιωπηρά Intent στο στοιχείο. Η κατηγορία BROWSABLE προστίθεται εάν ο σύνδεσμος πρέπει να υποβάλλεται σε επεξεργασία από το πρόγραμμα περιήγησης.
Το Deep link στο Android ρυθμίζεται μέσω Intent Filter με action VIEW και ετικέτα data που περιέχει σχήμα, host και διαδρομή. Κατά τη μετάβαση σε έναν σύνδεσμο της μορφής myapp://profile/42, το σύστημα βρίσκει το Activity με το κατάλληλο φίλτρο και το εκκινεί με το μεταδιδόμενο URI. Είναι σημαντικό να ρυθμίσετε σωστά τα pathPrefix, pathPattern ή path για ακριβή αντιστοίχιση.
Από το Android 6 (API 23) και μετά, υποστηρίζονται App Links — επαληθευμένα deep link μέσω HTTPS. Για τα App Links χρησιμοποιείται το ίδιο Intent Filter, αλλά με πρόσθετη επαλήθευση τομέα μέσω Digital Asset Links. Μετά την επαλήθευση, το σύστημα ανοίγει αυτόματα την εφαρμογή χωρίς διάλογο επιλογής.
Παράδειγμα φίλτρου για App Link με επαλήθευση μέσω συνδέσμου HTTPS. Σε αυτήν την περίπτωση, το σχήμα είναι πάντα https και ο host αντιστοιχεί στον τομέα που καθορίζεται στα Digital Asset Links.
<intent-filter android:autoVerify="true">
<action
android:name="android.intent.action.VIEW" />
<category
android:name="android.intent.category.DEFAULT" />
<category
android:name="android.intent.category.BROWSABLE" />
<data
android:scheme="https"
android:host="example.com"
android:pathPrefix="/profile" />
</intent-filter>
Το χαρακτηριστικό autoVerify υποδεικνύει στο σύστημα να ελέγξει τα Digital Asset Links κατά την εγκατάσταση της εφαρμογής. Εάν η επαλήθευση είναι επιτυχής, η εφαρμογή γίνεται αυτόματα ο προεπιλεγμένος χειριστής για τον καθορισμένο τομέα και τις διαδρομές.
Αφού το σύστημα επιλέξει ένα στοιχείο για την επεξεργασία του Intent, ο προγραμματιστής πρέπει να εξάγει τα δεδομένα από την εισερχόμενη πρόθεση εντός του στοιχείου-στόχου. Για το Activity χρησιμοποιείται η μέθοδος getIntent() στην onCreate(), για το BroadcastReceiver η μέθοδος onReceive(), όπου το Intent μεταβιβάζεται ως παράμετρος.
Η εξαγωγή δεδομένων περιλαμβάνει τη λήψη του action για τον προσδιορισμό του τύπου λειτουργίας, του data για το URI και των extra-παραμέτρων για πρόσθετες πληροφορίες. Κάθε ένα από αυτά τα στοιχεία μπορεί να απουσιάζει, επομένως απαιτείται έλεγχος null πριν από τη χρήση.
Παράδειγμα επεξεργασίας εισερχόμενου deep link σε Activity σε Kotlin. Ο κώδικας εξάγει το URI από το Intent και βάσει του host και της διαδρομής λαμβάνει απόφαση πλοήγησης.
class ProfileActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val uri = intent?.data
if (uri?.host == "profile") {
val userId = uri.lastPathSegment
loadProfile(userId)
}
}
}
Συνιστάται η χρήση safe call operator για τον έλεγχο των intent και data για null, καθώς η δραστηριότητα μπορεί να εκκινηθεί χωρίς εισερχόμενο deep link. Επίσης, πρέπει να ελέγχετε τα host και pathSegment για null πριν από τη χρήση τους στην πλοήγηση.
Εάν πολλές εφαρμογές έχουν καταχωρήσει Intent Filter που ταιριάζει στο ίδιο σιωπηρό Intent, το σύστημα εμφανίζει στον χρήστη έναν διάλογο επιλογής. Ο χρήστης μπορεί να επιλέξει μια εφαρμογή για μία χρήση ή να ορίσει έναν προεπιλεγμένο χειριστή. Από το Android 10, ο διάλογος επιλογής εμφανίζεται μόνο στην πρώτη κλήση, μετά την οποία το σύστημα απομνημονεύει την επιλογή του χρήστη.
Για τη διαχείριση της προτεραιότητας χρησιμοποιείται το χαρακτηριστικό android:priority στην ετικέτα intent-filter. Όσο μεγαλύτερη η τιμή, τόσο μεγαλύτερη προτεραιότητα έχει το στοιχείο κατά την επίλυση συγκρούσεων. Ωστόσο, η προτεραιότητα δεν λειτουργεί για φίλτρα από διαφορετικές εφαρμογές — σε αυτήν την περίπτωση εμφανίζεται πάντα διάλογος επιλογής, εάν καμία εφαρμογή δεν έχει οριστεί ως προεπιλεγμένη.
Ο προγραμματιστής μπορεί να καλέσει προγραμματιστικά τον διάλογο επιλογής μέσω Intent.createChooser(), μεταβιβάζοντας το επιθυμητό Intent και έναν τίτλο. Αυτό είναι χρήσιμο όταν η εφαρμογή θέλει να προτείνει ρητά στον χρήστη να επιλέξει έναν χειριστή, ακόμη και αν έχει οριστεί προεπιλεγμένη εφαρμογή. Για παράδειγμα, κατά την αποστολή εικόνων σε κοινωνικά δίκτυα μέσω ACTION_SEND, η createChooser εγγυάται την εμφάνιση του διαλόγου ανεξάρτητα από τις προεπιλεγμένες ρυθμίσεις.
Ένα από τα πιο συνηθισμένα λάθη είναι η απουσία της κατηγορίας DEFAULT στο Intent Filter. Οι προγραμματιστές αντιγράφουν τη διαμόρφωση από παραδείγματα αλλά ξεχνούν να προσθέσουν αυτήν την κατηγορία, με αποτέλεσμα το Activity να μην λαμβάνει σιωπηρά Intent. Το σύστημα απλά δεν βλέπει το φίλτρο για σιωπηρές κλήσεις, αν και τα ρητά Intent συνεχίζουν να λειτουργούν.
Το δεύτερο συνηθισμένο λάθος είναι η εσφαλμένη αναφορά scheme στην ετικέτα data χωρίς πλήρες URI. Εάν αναφέρεται μόνο το σχήμα αλλά όχι ο host, το φίλτρο θα δέχεται όλους τους συνδέσμους με αυτό το σχήμα από οποιαδήποτε πηγή, κάτι που μπορεί να οδηγήσει σε ανεπιθύμητες κλήσεις από μη επαληθευμένες πηγές. Συνιστάται να αναφέρετε πάντα τουλάχιστον σχήμα και host.
Το τρίτο λάθος είναι η απουσία ελέγχου intent.data για null στον κώδικα του Activity. Εάν το Activity εκκινείται όχι μέσω deep link αλλά με τον τυπικό τρόπο από τον εκκινητή, το Intent δεν περιέχει URI. Η πρόσβαση στο intent.data χωρίς έλεγχο προκαλεί NullPointerException και σφάλμα της εφαρμογής. Χρησιμοποιείτε πάντα intent?.data?.toString() με τον τελεστή safe call.
Συχνές ερωτήσεις
Ναι, για τη λήψη σιωπηρών Intent η κατηγορία DEFAULT είναι υποχρεωτική. Χωρίς αυτήν, το σύστημα δεν θα μεταδίδει σιωπηρές κλήσεις στο στοιχείο και το Intent Filter θα λειτουργεί μόνο για ρητά Intent, τα οποία ούτως ή άλλως δεν ελέγχουν τα φίλτρα.
Δεν υπάρχουν περιορισμοί. Ένα Activity μπορεί να περιέχει οποιονδήποτε αριθμό Intent Filter. Κάθε φίλτρο περιγράφει ένα ξεχωριστό σενάριο επεξεργασίας, για παράδειγμα ένα φίλτρο για deep link, άλλο για επεξεργασία αρχείων και τρίτο για Share Sheet.
Το Intent Filter είναι ένας γενικός μηχανισμός για την επεξεργασία σιωπηρών Intent. Το App Link είναι μια ειδική περίπτωση Intent Filter με επαλήθευση μέσω Digital Asset Links, που ορίζει αυτόματα την εφαρμογή ως προεπιλεγμένο χειριστή για συνδέσμους HTTPS σε έναν συγκεκριμένο τομέα.
Ναι, το Intent Filter μπορεί να δηλωθεί όχι μόνο για Activity αλλά και για Service και BroadcastReceiver. Για το Service, αυτό επιτρέπει την εκκίνηση μιας υπηρεσίας παρασκηνίου από άλλες εφαρμογές, για το BroadcastReceiver — τη λήψη συστημικών εκπομπών.
Ο τύπος MIME αναφέρεται στην ετικέτα data μέσω του χαρακτηριστικού mimeType. Το φίλτρο καθορίζει ποιους τύπους δεδομένων μπορεί να επεξεργαστεί το στοιχείο — για παράδειγμα, image/* για όλες τις εικόνες ή text/plain μόνο για απλό κείμενο. Οι τύποι MIME μπορούν να συνδυάζονται με σχήματα URI.
Σύνοψη
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης