2011-06-13 6 views
2

나는 sms content provider의 내용을 모니터링 할 contentObserver을 사용하고 이상 호출되고, 나는 디버깅을위한 Log.d() 태그를 넣어 가지고와 logcat의 태그는 한 번 의미보다 더 볼되고있다 onchange() ID가 두 번 이상 호출되는 경우이 문제가 발생하지 않도록하려면 어떻게해야합니까? 백그라운드에서 실행되는 서비스에서 관찰자를 구현했습니다. 다음은 코드onchange를 기능을 한 번

package com.messageHider; 

import android.app.Service; 
import android.content.ContentResolver; 
import android.content.Intent; 
import android.database.ContentObserver; 
import android.database.Cursor; 
import android.net.Uri; 
import android.os.Handler; 
import android.os.IBinder; 
import android.util.Log; 
import android.widget.Toast; 

public class smsSentService extends Service { 
ContentResolver contentResolver; 
Uri uri=Uri.parse("content://sms/"); 
Handler handler; 
@Override 
public IBinder onBind(Intent arg0) { 
    return null; 
} 
@Override 
public void onCreate() { 
    contentResolver=getContentResolver(); 
    contentResolver.registerContentObserver(uri, true, new contentObserver(handler)); 
    Log.d("SENTSERVICE", "Service created"); 
    super.onCreate(); 
} 
@Override 
public void onStart(Intent intent, int startId) { 
    Log.d("SENTSERVICE", "Service started"); 
    super.onStart(intent, startId); 
} 
@Override 
public void onDestroy() { 
    super.onDestroy(); 
} 
public class contentObserver extends ContentObserver 
{ 
    public contentObserver(Handler handler) { 
     super(handler); 

    } 
    @Override 
    public void onChange(boolean selfChange) { 
     Cursor cursor=contentResolver.query(uri, null, null, null, null); 
     cursor.moveToFirst(); 
     String type=cursor.getString(cursor.getColumnIndex("type")); 
     Log.d("THEMESSAGE", type); 
     super.onChange(selfChange); 
    } 
} 

}


답변

0

내가 아웃 바운드 SMS 메시지를 시청 콘텐츠 관찰자를 사용하여 발견 된 당신이 에뮬레이터에서 아웃 바운드 SMS를 보내려고하면, 당신은 실제로 거라고 그것이 텍스트를 재전송하려했으나 실패했기 때문에 3 가지 인스턴스가 표시됩니다. 인바운드 문자 메시지에도이 기능이 표시됩니까?

아웃 바운드 SMS 메시지의 경우 SMS 상태 필드를 확인하십시오. -1 값은 실패를 나타냅니다.

0

true를 반환하려면 deliverSelfNotifications()를 재정의해야합니다.

class contentObserver extends ContentObserver { private Context mContext; 

    public contentObserver(Handler handler) { 
     super(handler); 

    } 

    @Override 
    public void onChange(boolean selfChange) { 
     Cursor cursor=contentResolver.query(uri, null, null, null, null); 
     cursor.moveToFirst(); 
     String type=cursor.getString(cursor.getColumnIndex("type")); 
     Log.d("THEMESSAGE", type); 
     super.onChange(selfChange); 
    } 

    @Override 
    public boolean deliverSelfNotifications() { 
     return true; 
    } 
} 
+0

deliverSelfNotifications()를 재정의하면 onChange()도 두 번 호출됩니다. –

1

콘텐츠 관찰자를 onResume 메서드에 등록하고 onPause에서 등록을 취소하십시오.