Enregistrement d'un ContentObserver dans un service Android

Je travaille sur l'application de contrôle parental / filtrage de contenu pour adultes. Cette application surveille en permanence les appels et les sms sur le mobile d'un enfant et enregistre toute l'activité sur un serveur. Pour cela, je démarre un service (MyService.java) sur BOOT_COMPLETED et dans la méthode onCreate du service, j'inscrit un contentobserver pour callLog et sms uri (reportez-vous à l'extrait de code ci-dessous).

Maintenant, le problème est que, puisque je veux surveiller tous les appels sortants et entrants s et sms, je souhaite que le service fonctionne continuellement (sans être arrêté / tué). En outre, ce service est utilisé pour l'enregistrement d'observateurs de contenu et ne fait aucun autre traitement (sa méthode OnstartCommand est fausse), de sorte que le système d'exploitation Android supprime le service après un certain temps. Comment puis-je m'assurer que le service fonctionne en permanence et qu'il maintient l'objet contentobserver en vie?

  • Android AsyncTask - Ordre d'exécution
  • Synchroniser l'heure du système dans 2 téléphones
  • Libagl alphaPlaneWorkaround messages d'erreur dans LogCat
  • Entrée en double: com / android / volley / AuthFailureError.class lors de la compilation d'un projet dans un studio Android
  • Est-ce que "Bitmap.createScaledBitmap" convertit une image 32 bits en 24 bits?
  • Trouvez déjà les périphériques bluetooth jumelés automatiquement lorsqu'ils sont en gamme
  •    
     Public class MyService extends Service {
    
         Private CallLogObserver clLogObs = null;
         Public void onCreate () {        
             Super.onCreate ();       
             essayer{                            
                 ClLogObs = new CallLogObserver (this);
                 This.getContentResolver (). RegisterContentObserver (android.provider.CallLog.Calls.CONTENT_URI, true, clLogObs);               
              } Capture (Exception ex)
              {
                  Log.e ("CallLogData", ex.toString ());
              }
         }
    
         @Passer outre
         Public IBinder onBind (Intention arg0) {
             // TODO Foret de la méthode générée automatiquement
             Retourner nulle;
         }
    
         @Passer outre
         Public void sur Destroy () {   
             Si (clLogObs! = Null)
             {
                 This.getContentResolver (). UnregisterContentObserver (clLogObs);
             }
             Super.onDestroy ();
         }
    
         @Passer outre
         Public int onStartCommand (Intention intention, int flags, int startId) {  
             Super.onStartCommand (intention, flags, startId);           
    
             Retourner le service.START_STICKY;
         }
    
         @Passer outre
         Public boolean onUnbind (Intention intention) {
             Retourner super.onUnbind (intention);
         }
    

    4 Solutions collect form web for “Enregistrement d'un ContentObserver dans un service Android”

    Vous ne pouvez pas vous assurer que votre service s'exécute en continu sur Android.

    Pour le cas d'utilisation que vous mentionnez, il vaut mieux compter sur le récepteur Broadcast comme ACTION_NEW_OUTGOING_CALL & SMS_RECEIVED.

    Si vous vous sentez, les récepteurs Broadcast supportés ci-dessus ne couvrent pas tous vos cas d'utilisation. Utilisez AlaramManager pour démarrer périodiquement votre SERVICE et consultez CALL_LOGS et le tableau SMS pour toute modification des données et prenez les mesures appropriées (cela implique de vérifier le marquage des dernières données visitées sur CALL_LOGS et le tableau SMS).

    Vous pouvez configurer le service pour fonctionner au premier plan. Cela donnera à votre service une chance beaucoup plus faible d'être tué par le système d'exploitation.

    Lisez ici pour plus d'informations.

    L'observateur du contenu n'est pas enregistré dès que votre service est tué. L'enregistrement une fois n'est pas une option et votre service doit fonctionner tout le temps. Pour garantir ceci, vous devez retourner START_STICKY depuis OnStCommand. Vous pouvez également démarrer le service au premier plan.

    Mais que faire si un nouvel appel arrive lorsque le service est tué? Pour gérer cela, vous pouvez stocker le dernier _id traité dans les préférences de votre application. Et chaque fois que vous obtenez tous les nouveaux journaux d'appels avec un identifiant plus grand que l'ID enregistré. Vous devez traiter les journaux sur le service surCréer ainsi que sur l'observateur sur le changement.

    Vous ne pouvez pas garantir qu'il fonctionnera en permanence, mais vous pouvez retourner START_STICKY depuis OnStartCommand, ce qui garantit que Android va redémarrer votre service s'il est tué pour quelque raison que ce soit.

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.