2010-08-24 5 views
2

J'ai une application qui écoute l'écran éteint, et les intentions de l'utilisateur. Étant donné que vous ne pouvez pas vous inscrire pour recevoir les intentions d'écran du manifeste, je les enregistre dans un service. Est-ce que j'ai vraiment besoin d'un service complet pour m'assurer que je reçois toujours une notification lorsque l'écran s'éteint et que l'utilisateur déverrouille le téléphone? Il semble vraiment inutile :-(Est-ce une bonne idée d'avoir un service juste pour vous inscrire aux intentions?

Le code que j'utilise dans mon service..

@Override 
public void onCreate() { 
    super.onCreate(); 
    Log.d(TAG, "Service created."); 
    // register receiver that handles user unlock and screen off logic 
    IntentFilter filter = new IntentFilter(Intent.ACTION_USER_PRESENT); 
    filter.addAction(Intent.ACTION_SCREEN_OFF); 
    BroadcastReceiver mReceiver = new ScreenReceiver(); 
    registerReceiver(mReceiver, filter); 
} 

Répondre

1

Veuillez tenir compte de ce que vous tentez de faire et d'une façon différente de le faire.

Oui, la seule façon de surveiller les événements est d'être activement enregistré. Ceci est très intentionnel, car ils sont très tentants pour les applications de penser qu'ils veulent être informés, et se retrouver avec un tas d'applications qui doivent être lancées chaque fois que l'utilisateur allume ou éteint l'écran se retrouverait avec un vraiment mauvaise expérience utilisateur.

Étant donné que, je peux vous dire maintenant qu'il n'y a aucun moyen que vous pouvez garantie que vous verrez ces événements, en plus d'utiliser un service qui est toujours en cours d'exécution et aurait disposé des startForeground() pour s'empêcher de être tué. Évidemment, ce n'est pas quelque chose que vous voulez faire à moins que votre application ne fasse quelque chose que l'utilisateur se soucie très délibérément d'avoir en cours d'exécution pour eux quand ils décident que cela devrait être.

Alors ... qu'est-ce que vous essayez d'accomplir?

+0

Oui, je comprends que c'est très intentionnel. L'application que je construis est très ouverte sur les raisons pour lesquelles elle doit le faire, et ce qu'elle exécute sur userlogin est une tâche très triviale. – NPike

2

Vous pouvez utiliser une classe de récepteur de radiodiffusion Un récepteur de radiodiffusion peut être une partie autonome d'une application

+0

Donc, même si mon application n'est pas en cours d'exécution, et qu'il n'y a pas de service en cours d'exécution, je recevrai toujours ces intentions? – NPike

+0

Oui. Une diffusion est envoyée à toutes les intentions enregistrées dans le manifeste pour accepter cette diffusion. Votre application ne peut consister que d'un récepteur de diffusion si c'est ce que vous voulez. Vous n'avez pas besoin d'une application, d'un service ou de quoi que ce soit d'autre. – Falmarri

+0

Puis-je enregistrer le récepteur de diffusion dans mon activité principale? (Pour les intentions décrites ci-dessus que vous ne pouvez pas inscrire dans un manifeste) – NPike

0

Puisque vous ne pouvez pas enregistrer pour recevoir hors écran intentions du

manifeste que vous êtes à ce sujet? la documentation ne décrit pas cette limitation , alors que pour ACTION_BATTERY_CHANGED, ACTION_CONFIGURATION_CHANGED et ACTION_TIME_TICK.

S'il vous plaît utiliser un manifeste-enregistré BroadcastReceiver si possible.

+0

Vous ne pouvez pas vous inscrire pour eux. Ceci est très délibéré, car avoir un tas d'applications qui doivent fonctionner chaque fois que vous allumez/éteignez l'écran conduirait rapidement à une expérience vraiment cruddy. – hackbod

+0

Y a-t-il une chance que la documentation soit mise à jour pour refléter cela? –

+1

@Christopher: J'ai déposé un problème sur b.android.com à ce sujet, il y a ~ 10 heures. – CommonsWare

2

Action_User_Present peut être enregistré dans le fichier manifeste.

0

Il s'agit d'un code Android de base.

mUserPresentIntent = new Intent(Intent.ACTION_USER_PRESENT); 
mUserPresentIntent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING 
| Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT); 

et

mScreenOnIntent = new Intent(Intent.ACTION_SCREEN_ON); 
mScreenOnIntent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY | Intent.FLAG_RECEIVER_FOREGROUND); 
mScreenOffIntent = new Intent(Intent.ACTION_SCREEN_OFF); 
mScreenOffIntent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY | Intent.FLAG_RECEIVER_FOREGROUND); 

Nous devrions enregistrer le filtre lorsque le noyau programme envoyer avec le drapeau "FLAG_RECEIVER_REGISTERED_ONLY".

Questions connexes