web-dev-qa-db-fra.com

Android BroadcastReceiver au démarrage - continuez à fonctionner lorsque l'activité est en arrière-plan

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

51
RasberryPoptart

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);
    }
}
142
Javanator

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.

7
W0rmH0le