2011-04-12 4 views
13

나는 유해 컨텐츠 차단 애플리케이션/성인용 컨텐츠 필터링 애플리케이션을 개발 중입니다. 이 응용 프로그램은 지속적으로 어린이의 모바일 통화 및 smses을 모니터링하고 서버에 모든 활동을 기록합니다. 이를 위해 BOOT_COMPLETED에 서비스 (MyService.java) 을 시작하고 서비스의 onCreate 메소드에서 callLog 및 sms uri에 대한 contentobserver를 등록합니다 (아래 코드 스 니펫 참조).Android 서비스에 ContentObserver 등록

이제 나가는 모든 수신 전화와 SMS를 모니터링하고 싶기 때문에 서비스가 계속 실행되고 싶습니다 (중지/종료되지 않고). 또한이 서비스는 콘텐츠 관찰자를 등록하고 다른 처리를 수행하지 않고 (OnstartCommand 메서드가 더미 임) 사용되기 때문에 안드로이드 OS가 언젠가 서비스를 종료합니다. 서비스가 지속적으로 실행되고 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); 
    } 
+2

사람들은 이미 서비스를 계속 실행할 수 없다는 의견에 댓글을 달았지만 서비스는 ContentObservers를 등록하는 것처럼 들리므로 서비스가 종료 될 때 해당 옵저버가 등록되어 있는지 여부가 중요한 질문 인 것처럼 들립니다. 새로운 관찰자 인스턴스를 다시 등록하지 않도록하는 방법에 대해 설명합니다. – spaaarky21

답변

3

Android에서 서비스를 계속 실행할 수는 없습니다.

언급 한 유스 케이스의 경우 ACTION_NEW_OUTGOING_CALL & SMS_RECEIVED와 같은 브로드 캐스트 수신기를 사용하는 것이 좋습니다.

위의 지원되는 브로드 캐스트 수신기 이상은 모든 사용 사례를 다루지는 않습니다. AlaramManager를 사용하여 주기적으로 SERVICE를 시작하고 CALL_LOGS 및 SMS 테이블에서 데이터 변경 사항을 조사하고 적절한 조치를 취하십시오 (CALL_LOGS 및 SMS 테이블에서 마지막으로 방문한 데이터에 체크 표시를 할 수 있음).

+0

감사합니다 스쿠마. 안드로이드는 서비스가 중단없이 작동하는 것을 허용하지 않기 때문에 방송 수신기를 기반으로 앱을 재 설계해야합니다. – Srao

-1

계속 실행할 수는 없지만 어떤 이유에서든 Android가 서비스가 다시 시작될 경우이를 보장하는 START_CTICAND에서 START_STICKY를 반환 할 수 있습니다.

2

포 그라운드에서 실행되도록 서비스를 설정할 수 있습니다. 그러면 OS에 의해 서비스가 중단 될 확률이 훨씬 줄어 듭니다.

자세한 내용은 here을 참조하십시오.

0

서비스가 종료 되 자마자 콘텐츠 관찰자의 등록이 해제됩니다. 한번 등록하는 것은 옵션이 아니며 서비스가 항상 실행되어야합니다. 이를 보장하려면 onStartCommand에서 START_STICKY를 반환해야합니다. 포 그라운드에서 서비스를 시작할 수도 있습니다.

하지만 서비스가 종료 될 때 새 전화가 오면 어떻게 될까요? 이를 처리하기 위해 앱의 환경 설정에서 마지막으로 처리 된 _id를 저장할 수 있습니다. 매번 저장된 ID보다 큰 ID로 모든 새 통화 로그를 가져옵니다. onCreate 및 onserver onChange 서비스에서 로그를 처리해야합니다.

관련 문제