¿Qué son los observadores de contenido de Android?
Interceptar mensajes de texto. Por ejemplo, al enviar un mensaje de texto, leer el mensaje de texto cuando el mensaje de texto del sistema cambia, gritar y enviar los datos al buzón de mensajes de la empresa. a través del observador de contenido
Obtiene el objeto ContentResolver, llama a la función getContentResolver(),
Llama al objeto ContentResolver
método RegisterContentObserver(uri,notifyForDescendents,observer) , parámetros: objeto Uri, si
uri preciso (verdadero es inexacto, falso es exacto), objeto observador, objeto ContentObserver
Debido a que ContentObserver es una clase abstracta, entonces escribimos una clase interna para heredar esta clase abstracta y debe implementar el constructor y el procesador de mensajes del objeto Handler del constructor
Hablaremos de ello más adelante, definiremos una clase interna MyObserver e implementaremos el método de devolución de llamada onChange() de la clase principal. , se volverá a llamar a este método cuando se observen cambios en el buzón de mensajes.
En esta función de devolución de llamada, utilice el método para obtener el contenido del mensaje de texto, tome el último y llame al puntero moveToFirst() del objeto Cursor para que apunte al último.
¿Cómo realiza esta llamada la aplicación del sistema? Bueno, obtenga el objeto ContentResolver y llame al método notifyChange(uri, observador) del objeto ContentResolver a través del método getContentResolver() Parámetros: uri se define como desee y el. El observador especifica quién maneja el valor predeterminado.
Muchas aplicaciones en el sistema implementan la comunicación de notificación a través de este mecanismo de buzón de mensajes público.
A continuación, hagámoslo en la práctica y luego "Implementación de Android". Proveedor de contenido" Según el proyecto utilizado en, cree un nuevo proyecto y agregue el siguiente código:
paquete com.wuyudong.observer;
importar android.net.Uri; p>
importar android.os.Bundle;
importar android.os.Handler;
importar android.app.Activity;
importar android. content.ContentResolver;
importar android.content.Context;
importar android.database.ContentObserver;
importar android.view.Menu;
la clase pública MainActivity extiende la actividad {
@Override
protected void onCreate(Bundle saveInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Uri uri = Uri.parse("content://com.wuyudong.db.personprovider/");
getContentResolver(). RegisterContentObserver(uri, true,
new MyObserver(new Handler()));
}
clase privada MyObserver extiende ContentObserver { p>
public MyObserver(Handler handler) { // el controlador es un controlador de mensajes
super(handler);
}
@Override p>
public void onChange(boolean selfChange) {
// TODO Código auxiliar de método generado automáticamente
System.out.println("jaja, el contenido de la base de datos tiene ¡cambió! ! ! ");
super.onChange(selfChange);
}
}
}
y modificar Código en PersonDBProvider.java:
inserción de uri pública (uri uri, valores de ContentValues) {
if (matcher.match(uri) == INSERT) {
// Devuelve el conjunto de resultados de la consulta
SQLiteDatabase db = helper.getWritableDatabase();
db.insert("persona", nulo, valores); p>
getContext().getContentResolver().notifyChange(uri, null);
} else {
throw new IllegalArgumentException("La ruta no coincide, la inserción la operación no se puede realizar");
}
return null;
}
@Override
public int eliminar(Uri uri, Selección de cadena, Cadena[] selecciónArgs) {
if (matcher.match(uri) == DELETE) {
// Devuelve el conjunto de resultados de consulta
SQLiteDatabase db = helper.getWritableDatabase();
int resultado = db.delete("persona", selección, selecciónArgs);
db.close ();
if (resultado > 0) {
getContext().getContentResolver().notifyChange(uri, null);
}
} else {
p>throw new IllegalArgumentException("La ruta no coincide, no se puede realizar la operación de eliminación");
}
return 0;
}
De esta manera, cada vez que se haga clic en el botón, se imprimirá un mensaje indicando que los datos relevantes de la base de datos han sido modificados