2012-04-18 51 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); 
} 
}