Je surveille les SMS entrants.
Mon application fonctionne parfaitement avec un BroadcastReceiver
. Cependant, il fonctionne à partir d'une activité et souhaite que le BroadcastReceiver
fonctionne tout le temps (et pas seulement lorsque mon activité est en cours d'exécution).
Comment puis-je atteindre cet objectif? J'ai parcouru le cycle de vie de BroadcastReceiver
mais tout ce qui est mentionné dans la documentation est que le cycle de vie est limité à la méthode onReceive
, pas le cycle de vie de conservation de BroadcastReceiver
vérification des SMS entrants.
Comment puis-je rendre cela persistant?
Merci
Vous devez définir un receveur en manifeste avec le nom de l'action Android.intent.action.BOOT_COMPLETED.
<!-- Start the Service if applicable on boot -->
<receiver Android:name="com.prac.test.ServiceStarter">
<intent-filter>
<action Android:name="Android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
Assurez-vous également d'inclure l'autorisation de démarrage terminée.
<uses-permission Android:name="Android.permission.RECEIVE_BOOT_COMPLETED"/>
Utilisez Service pour que cela persiste. Et utilisez des récepteurs pour recevoir les événements de démarrage pour redémarrer le service si le système démarre.
Code de démarrage du service au démarrage. Faites en sorte que Service fasse votre travail de vérification des SMS ou de tout ce que vous voulez. Vous devez faire votre travail dans MyPersistingService
le définir vous-même.
import Android.content.BroadcastReceiver;
import Android.content.Context;
import Android.content.Intent;
import Android.util.Log;
public class ServiceStarter extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Intent i = new Intent("com.prac.test.MyPersistingService");
i.setClass(context, MyPersistingService.class);
context.startService(i);
}
}
Le service ou le démarrage terminé n'est pas obligatoire
En fait, vous n'avez pas besoin d'implémenter un Service
ou de vous inscrire à Android.intent.action.BOOT_COMPLETED
Quelques exemples montrent comment enregistrer/désinscrire un BroadcastReceiver
lorsque l'activité est créée et détruite. Cependant, cela est utile pour les intentions que vous attendez uniquement lorsque l'application est ouverte (pour la communication interne entre Service/Activité par exemple).
Cependant, dans le cas d'un SMS, vous souhaitez écouter l'intention en tout temps (et pas seulement lorsque votre application est ouverte).
Il y a une autre façon
Vous pouvez créer un class
qui étend BroadcastReceiver
et vous inscrire aux intentions souhaitées via AndroidManifest.xml
. De cette façon, le BroadcastReceiver
sera indépendant de votre activité (et ne dépendra pas du cycle de vie de l'activité)
De cette façon, votre BroadcastReceiver
sera notifié automatiquement par Android dès qu'un SMS arrivera même si votre application est fermée).
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest>
...
<uses-permission Android:name="Android.permission.READ_SMS"/>
<uses-permission Android:name="Android.permission.RECEIVE_SMS"/>
<application>
....
<receiver Android:name=".MyCustomBroadcastReceiver">
<intent-filter>
<action Android:name="Android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
</application>
</manifest>
MyCustomBroadcastReceiver.Java
public class MyCustomBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if(intent != null) {
String action = intent.getAction();
if(action != null) {
if(action.equals("Android.provider.Telephony.SMS_RECEIVED")) {
// DO YOUR STUFF
} else if (action.equals("ANOTHER ACTION")) {
// DO ANOTHER STUFF
}
}
}
}
}
Notes
Vous pouvez ajouter d'autres filtres d'intention à AndroidManifest et les gérer tous dans le même BroadcastReceiver
.
Démarrez un service uniquement si vous effectuez une tâche longue. Vous avez juste besoin d'afficher une notification ou de mettre à jour une base de données, utilisez simplement le code ci-dessus.