2013-05-07 5 views
3

J'utilise un code de this tutorial sur la façon de recevoir des messages SMS:Diffusion récepteur fonctionne toujours après l'application Fermer - Android

Le code fonctionne parfaitement, et fait exactement ce que je veux.

J'ai un problème avec cela.

Je souhaite que mon application s'exécute en arrière-plan, mais lorsqu'elle est fermée, je souhaite qu'elle cesse d'intercepter les messages SMS.

Ma question est la suivante: pourquoi mon application intercepte-t-elle toujours les messages SMS après leur fermeture? Je suppose que je dois trouver un "on close" gestionnaire et fermer le récepteur de diffusion alors. (S'il y a un gestionnaire d'événement "on close" ..?).

Si quelqu'un peut fournir un aperçu, je serais très reconnaissant. Merci!

+0

vous n'entendiez pas l'application à proximité, n'est-ce pas? Je pense que vous vouliez minimiser l'application. Sur app fermer le récepteur ne va pas intercepter les actions de cours. –

Répondre

16

En mettant votre BroadcastReceiver dans votre Manifest, il, par défaut, est toujours active. Par conséquent, si vous voulez qu'il fonctionne uniquement lorsque votre Activity est affiché, vous voulez activer/désactiver votre BroadcastReceiver lorsque votre CV Activity/pause:

public void onResume() 
{ 
    ComponentName component=new ComponentName(this, TextMessageReceiver.class); 
    getPackageManager() 
     .setComponentEnabledSetting(component, 
      PackageManager.COMPONENT_ENABLED_STATE_ENABLED, 
      PackageManager.DONT_KILL_APP); 
} 

public void onPause() 
{ 
    ComponentName component=new ComponentName(this, TextMessageReceiver.class); 
    getPackageManager() 
     .setComponentEnabledSetting(component, 
      PackageManager.COMPONENT_ENABLED_STATE_DISABLED, 
      PackageManager.DONT_KILL_APP); 
} 

L'alternative, est de déclarer votre BroadcastReceiver dans votre Activity et puis appelez registerReceiver et unregisterReceiver dans les mêmes événements de cycle de vie.

+0

Donc, si nous les mettons dans MainActivity, Quand allez à l'activité suivante, le récepteur de diffusion sera désinscrit !? –

+0

@ Mr.Hyde - correct, seulement pendant que l'activité est en cours d'exécution le récepteur de diffusion serait actif. – ianhanniballake

0

ive regardé autour ici et c'est la conclusion ive venir à

try{ 
     unregisterReceiver(mybroadcast); 
    }catch(IllegalArgumentException e){ 
     Log.d("reciever",e.toString()); 
    } 

je dirais override OnDestroy() et le mettre là-dedans

-1

je dirais override OnTerminate() sur votre demande objet et désinscrire votre récepteur là.

@Override 
public void onTerminate() { 
    unregisterReceiver(mybroadcast); 
    super.onTerminate(); 
} 
+1

N'utilisez pas onTerminate(), public void onTerminate() Ajouté au niveau API 1 Cette méthode est utilisée dans les environnements de processus émulés. Il ne sera jamais appelé sur un appareil Android de production, où les processus sont supprimés simplement en les tuant; aucun code d'utilisateur (y compris ce rappel) n'est exécuté dans ce cas. http://developer.android.com/reference/android/app/Application.html#onTerminate() –

Questions connexes