2012-04-18 82 views
0

我想實施BroadcastReceiver以偵聽聯繫人是否已刪除/更新。我讀了ContantObserver,但我不知道如何在應用程序背景中運行此應用程序,如BroadcastReceiver如何接收聯繫人更改:Android

我該如何執行此操作?有什麼辦法可以在應用程序的背景下運行ContantObserver

我跟着this FAQ.

回答

0

實現一個broadcaste接收器和在ContentObserveronChange方法靶向這個接收器發送Broadcaste ..看到this使用自定義的意圖和broadcastes ..

+0

我需要的是實現從應用程序的背景此功能。我的意思是我的申請不在前臺,如果聯繫已被更改,則必須通過我的申請進行審覈。我認爲ContentObserver需要在前臺運行。我對嗎? – 2012-04-18 13:30:43

+0

@AndroidLearner ..這就是爲什麼我建議在後臺運行的接收器..和內容觀察員不必在前臺.. – ngesh 2012-04-18 13:34:40

+0

好的謝謝你。我將執行此操作。 – 2012-04-18 14:43:53

0

啓動服務並註冊ContentObserver到此服務器

這是我做的一個示例代碼,它將偵聽Contacts.CONTENT_URI中的任何更改並通知用戶

這是服務

public class ContactObserverService extends Service implements ContactObserver.OnUpdate { 
private ContactObserver contactObserver ; 

public ContactObserverService() { 
} 

@Override 
public void onCreate(){ 
    super.onCreate(); 
    contactObserver = new ContactObserver(this); 
    Toast.makeText(this,"Service Started",Toast.LENGTH_SHORT).show(); 
    this.getContentResolver().registerContentObserver(ContactsContract.Contacts.CONTENT_URI,false,contactObserver); 
} 

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

@Nullable 
@Override 
public IBinder onBind(Intent intent) { 
    return null; 
} 

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    // The service is starting, due to a call to startService() 
    return START_STICKY; 
} 

@Override 
public void onUpdate(Uri uri) { 
    NotificationCompat.Builder builder = (NotificationCompat.Builder) new NotificationCompat.Builder(this) 
      .setContentTitle("Contact Update Notifier") 
      .setContentText(uri.getQuery()) 
      .setSmallIcon(R.drawable.images); 
    NotificationManager manager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE); 
    manager.notify(1,builder.build()); 
} 
} 

的ContentObserver類是

public class ContactObserver extends ContentObserver { 
private OnUpdate onUpdate; 

public interface OnUpdate{ 
    void onUpdate(Uri uri); 
} 
public ContactObserver(OnUpdate onUpdate) { 
    super(new Handler()); 
    this.onUpdate = onUpdate; 
} 

@Override 
public void onChange(boolean selfChange) { 
    this.onChange(selfChange, null); 
} 
@Override 
public void onChange(boolean selfChange, Uri uri) { 
    // this is NOT UI thread, this is a BACKGROUND thread 
    uri.getQueryParameterNames(); 
    onUpdate.onUpdate(uri); 
} 
}