Registro de un ContentObserver en un servicio de Android

Estoy trabajando en el control parental / aplicación de contenido de contenido para adultos. Esta aplicación monitorea continuamente las llamadas y smses en el móvil de un niño y registra toda la actividad en un servidor. Para esto estoy iniciando un servicio (MyService.java) en BOOT_COMPLETED y en el método onCreate del servicio registro un contentobserver para el callLog y sms uri (consulte el fragmento de código a continuación).

Ahora el problema es, ya que quiero monitorear todas las llamadas salientes, entrantes y sms quiero que el servicio se ejecute continuamente (sin ser detenido / asesinado). Además, este servicio está siendo utilizado para registrar observadores de contenido y no hacer ningún otro proceso (su método OnstartCommand es ficticio), por lo que el sistema operativo Android mata el servicio después de algún tiempo. ¿Cómo me aseguro de que el servicio se ejecute continuamente y mantenga vivo el objeto contentobserver?

   
 Public class MyService extends Servicio {

     Private CallLogObserver clLogObs = nulo;
     Public void onCreate () {        
         Super.onCreate ();       
         tratar{                            
             ClLogObs = nuevo CallLogObserver (este);
             This.getContentResolver (). RegisterContentObserver (android.provider.CallLog.Calls.CONTENT_URI, true, clLogObs);               
          } Catch (excepción ex)
          {
              Log.e ("CallLogData", ex.toString ());
          }
     }

     @Anular
     Public IBinder onBind (Intención arg0) {
         // Método generado automáticamente TODO talón
         Return null;
     }

     @Anular
     Public void onDestroy () {   
         If (clLogObs! = Null)
         {
             This.getContentResolver (). UnregisterContentObserver (clLogObs);
         }
         Super.onDestroy ();
     }

     @Anular
     Public int onStartCommand (Intención intención, int flags, int startId) {  
         Super.onStartCommand (intención, flags, startId);           

         Return Service.START_STICKY;
     }

     @Anular
     Public boolean onUnbind (Intento de intención) {
         Return super.onUnbind (intención);
     }

No puede garantizar que su servicio se ejecute continuamente en Android.

Para el caso de uso que menciones, es mejor confiar en el receptor Broadcast como ACTION_NEW_OUTGOING_CALL y SMS_RECEIVED.

Si cree que los receptores Broadcast soportados no cubren todos sus casos de uso. Utilice AlaramManager para iniciar periódicamente su SERVICIO y buscar en CALL_LOGS y la tabla de SMS para cualquier cambio en los datos y tomar la acción apropiada (esto puede implicar marcar marcando los últimos datos visitados en CALL_LOGS y tabla de SMS).

Puede configurar el servicio para que se ejecute en primer plano. Esto le dará a su servicio una posibilidad mucho menor de ser asesinado por el sistema operativo.

Lea aquí para más información.

El observador de contenido no se registra tan pronto como su servicio sea asesinado. Así que registrar una vez no es una opción y su servicio debe estar funcionando todo el tiempo. Para garantizar esto, debes devolver START_STICKY desde onStartCommand. También puede iniciar el servicio en primer plano.

Pero, ¿qué pasaría si llegara una nueva llamada cuando se matara el servicio? Para manejar esto puedes almacenar el último _id procesado en las preferencias de tu aplicación. Y cada vez obtener todos los nuevos registros de llamadas con mayor id que el ID guardado. Debe procesar los registros en el servicio onCreate así como en el observador onChange.

No puede garantizar que se ejecute de forma continua, pero puede devolver START_STICKY desde onStartCommand, lo que garantiza que Android reiniciará su servicio si se cancela por cualquier motivo.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.