17/05/2023
6.5 Broadcast d’informations Exemples d’actions natives
Il est aussi possible d'utiliser un objet La méthode putExtra permet Un certain nombre de messages sont diffusés par l'OS:
Intent pour broadcaster un message à but d'enregistrer une paire clé/valeur dans
l'Intent. On peut récupérer les données à ● ACTION_BOOT_COMPLETED: diffusé lorsque le système a fini son démarrage
informatif. Ainsi, toutes les applications
l'aide de la méthode getExtras dans l'objet ● ACTION_SHUTDOWN: diffusé lorsque le système est en cours d'extinction
pourront capturer ce message et
Bundle qui est dans l'Intent après ● ACTION_SCREEN_ON / OFF: allumage / extinction de l'écran
récupérer l'information.
l’interception de cet Intent (voir filtrage ● ACTION_POWER_CONNECTED / DISCONNECTED: connexion / perte de l'alimentation
Intent broadcast = new plus loins): ● ACTION_TIME_TICK: une notification envoyée toutes les minutes
Intent("com.emsi.broadcast"); ● ACTION_USER_PRESENT: notification reçue lorsque l'utilisateur délock son téléphone
broadcast.putExtra("planningChange", "test"); Bundle extra = intent.getExtras(); ● ...
sendBroadcast(broadcast); String val = extra.getString("extra"); La liste de toutes les actions système se trouve dans la documentation des Intents.
D'autres actions permettent de lancer des applications tierces pour déléguer un traitement:
● ACTION_CALL (ANSWER, DIAL): passer/réceptionner/afficher un appel
● ACTION_SEND: envoyer des données par SMS ou E-mail
● ACTION_WEB_SEARCH: rechercher sur internet
111
110
17/05/2023
6.6 Recevoir et filtrer les Intents Filtrage de l’Intent par l’activité
Un filtre peut utiliser plusieurs niveaux de filtrage: En déclarant un filtre au niveau du tag activity, l'application déclare les types de messages
(intents) qu'elle sait gérer et qui permettront de l'invoquer.
Étant donné la multitude de ● action: identifie le nom de l'Intent. Pour éviter
messages véhiculés par des les collisions, il faut utiliser la convention de <activity android:name=".Accueil" android:label="@string/app_name">
<intent-filter>
Intent, chaque application nommage de Java <action android:name="com.emsi.nom_de_l_action" />
doit pouvoir facilement ● category: permet de filtrer une catégorie <category android:name="android.intent.category.DEFAULT" />
</intent-filter>
"écouter" les Intents dont d'action (DEFAULT, BROWSABLE, ...) </activity>
elle a besoin. Android ● data: filtre sur les données du message par
dispose d'un système de Ainsi, l'application répond à la sollicitation des Intents envoyés par:
exemple en utilisant android:host pour filtrer
filtres déclaratifs permettant un nom de domaine particulier. Ou encore Button invoc = (Button)findViewById(R.id.autoinvoc);
de définir ce filtrage dans le mimeType:name pour filtrer les Intents avec invoc.setOnClickListener(new OnClickListener() {
@Override
Manifest. un type de données spécifique public void onClick(View v) {
Intent intent = new Intent("com.emsi.nom_de_l_action");
startActivity(intent);
}});
113
112
17/05/2023
Filtrage par catégorie et data Réception par un BroadcastReceiver
Dans le Manifest:
Les catégories d'Intent évoquées précédemment Les messages <receiver android:name=".MyBroadcastReceiver" android:exported="true">
<intent-filter>
permettent de répondre à des évènements dans <action android:name="android.intent.action.VIEW" />
“broadcastés” par les <intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
un contexte particulier. L'exemple le plus utilisé <category android:name="android.intent.category.DEFAULT" /> applications ou par le
<action
est l'interception d'un clic lors d'une navigation <category android:name="android.intent.category.BROWSABLE" /> système sont android:name="android.intent.action.INPUT_METHOD_CHANGED" />
<data android:scheme="share" android:host="monecole.ma"/>
sur le web ou un protocole particulier est prévu. réceptionnées par une <action android:name="com.emsi.miage.dev.customaction" />
</intent-filter> </intent-filter>
Par exemple, les liens vers le market sont de la classe héritant de </receiver>
forme market://. BroadcastReceiver. Cette
L'attribut host définit l'URI de l'autorité (on évite ainsi le fishing). La classe héritant de BroadcastReceiver:
L'attribut scheme définit la partie de gauche de l'URI. On peut
classe doit surcharger la
Pour par exemple répondre à un clic sur un lien ainsi lancer notre activité lors d'un clic sur: méthode onReceive. Dans public class MyBroadcastReceiver extends BroadcastReceiver {
share://monecole.ma/docs, il faut construire le Manifest, un filtre doit @Override
public void onReceive(Context context, Intent intent) {
if(intent.getAction().equals("com.emsi.miage.dev.customaction") ){
un filtre d'Intent utilisant la catégorie définissant <a href="share://monecole.ma/docs">lien</a> être inséré dans un tag }
//faire quelque chose
}
ce qui est "navigable" tout en combinant cette receiver qui pointe vers la }
La durée de vie du receiver correspond à la durée d’execution de onReceive. Si
Le filtre <data> peut aussi préciser d’autres informations comme
catégorie avec un type d'action signifiant que classe se chargeant des cette dernière essaie d’effectuer des tâches longues, le système peut
(port, path et mimeType) l’interrompre implicitement. Pour celà il faut lancer des “Services”.
l'on souhaite "voir" la ressource. Il faut en plus messages.
utiliser le tag data dans la construction du filtre:
114 115
17/05/2023
Problème : versions récentes et sécurité 6.7. Les PendingIntent
● Déclaration d'un Intent à diffuser lorsque
depuis Android 7.0, 8.0 et encore dans
Un objet PendingIntent (intention en attente) l'utilisateur fait une action sur votre
le 9-11, il y a de plus en plus de
est un wrapper autour d'un Intent. L'objectif notification (basée sur NotificationManager du
restrictions sur l’écoute des intents
principal d'un PendingIntent est d'autoriser système Android).
implicites les plus communs. Pour la BroadcastReceiver br = new MyBroadcastReceiver(); une autre application ou un autre composant ● Déclaration d'un Intent à exécuter lorsque
plupart, il n’est plus possible de les IntentFilter filter = new
IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
à utiliser notre Intent comme si ce dernier l'utilisateur exécute une action avec votre
filtrer simplement dans le manifest
filter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED); était diffusé depuis notre application. widget d'application (le Widget à l'écran
mais il faudra enregistrer votre this.registerReceiver(br, filter);
d'accueil exécute l'Intent dans ce cas).
BroadcastReceiver avec un Context. Pour stopper un Receiver il faut appeler : ● Déclaration d'un Intent à exécuter à une
unregisterReceiver(android.content.BroadcastReceiver) heure ultérieure spécifiée (c’est
Cela implique que le receiver n’est à l’ Les principaux cas d'utilisation pour un
écoute que durant la durée de vie de AlarmManager du système Android qui va
PendingIntent sont les suivants:
votre context (Application, Activity, diffuser l’Intent).
Service..)
116 117
17/05/2023
Exercices
● Ajoutez à votre projet un BroadcastReceiver qui permet de lancer un
Service de Tracking par GPS au moment du démarrage du système. Le
traceur va enregistrer les positions GPS datées dans une BDD locale.
● Détectez le moment de la connexion à Internet pour lancer la lecture
de toutes les positions stockées dans la BDD et les envoyer vers le
serveur via un Web Service.
● Assurez vous de recevoir les deux actions dans les versions les plus
déployées sur le marché ainsi que dans les dernières versions
d’Android.