Регистрация 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);
}
Ответы
Ответ 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 снова запустит вашу службу, если она по какой-либо причине будет убита.