Подтвердить что ты не робот

Регистрация ContentObserver в службе Android

Я работаю над приложением для фильтрации родительского контроля/для взрослых. Это приложение постоянно отслеживает звонки и sms на дочернем мобильном устройстве и регистрирует всю активность на сервере. Для этого я запускаю сервис (MyService.java) на BOOT_COMPLETED и в методе onCreate службы я зарегистрирую контент-сервер для callLog и sms uri (см. ниже фрагмент кода).

Теперь проблема заключается в том, что я хочу отслеживать каждый исходящий, входящий вызов s и смс. Я хочу, чтобы служба постоянно работала (без остановки/убийства). Кроме того, эта Служба используется только для регистрации наблюдателей контента и не выполняет никакой другой обработки (ее метод OnstartCommand является фиктивным), поэтому Android-сервер убивает службу после некоторого времени. Как обеспечить непрерывность работы службы и сохранение содержимого объекта contentobserver?

   
public class MyService extends Service {

    private CallLogObserver clLogObs = null;
    public void onCreate() {        
        super.onCreate();       
        try{                            
            clLogObs = new CallLogObserver(this);
            this.getContentResolver().registerContentObserver(android.provider.CallLog.Calls.CONTENT_URI, true, clLogObs);               
         }catch(Exception ex)
         {
             Log.e("CallLogData", ex.toString());
         }
    }

    @Override
    public IBinder onBind(Intent arg0) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public void onDestroy() {   
        if( clLogObs !=null  )
        {
            this.getContentResolver().unregisterContentObserver(clLogObs);
        }
        super.onDestroy();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {  
        super.onStartCommand(intent, flags, startId);           

        return Service.START_STICKY;
    }

    @Override
    public boolean onUnbind(Intent intent) {
        return super.onUnbind(intent);
    }
4b9b3361

Ответ 1

Вы не можете гарантировать бесперебойную работу вашего сервиса на Android.

В случае использования, о котором вы говорите, лучше полагаться на широковещательный приемник, такой как ACTION_NEW_OUTGOING_CALL и SMS_RECEIVED.

Если вы чувствуете, что поддерживаемые Broadcast приемники не охватывают все ваши прецеденты. Используйте AlaramManager для периодического запуска службы SERVICE и просмотра таблиц CALL_LOGS и SMS для любых изменений данных и принятия соответствующих мер (это может включать проверку пометки последних посещенных данных в таблице CALL_LOGS и SMS).

Ответ 2

вы можете настроить службу для запуска на переднем плане. это даст вашей службе гораздо меньший шанс быть убитым ОС.

прочитайте здесь для получения дополнительной информации.

Ответ 3

Наблюдатель по содержимому получает незарегистрированную информацию, как только ваша служба будет убита. Таким образом, регистрация один раз не является вариантом, и ваша служба должна работать все время. Чтобы гарантировать это, вы должны вернуть START_STICKY из onStartCommand. Вы также можете запустить службу на переднем плане.

Но что, если новый вызов придет, когда служба будет убита? Чтобы справиться с этим, вы можете сохранить последний обработанный _id в настройках вашего приложения. и каждый раз получать все новые журналы вызовов с большим id, чем сохраненный идентификатор. Вы должны обработать журналы на службе onCreate, а также на наблюдателе onChange.

Ответ 4

Вы не можете гарантировать, что он будет работать непрерывно, но вы можете вернуть START_STICKY из onStartCommand, что гарантирует, что Android снова запустит вашу службу, если она по какой-либо причине будет убита.