Colección de citas famosas - Slogan de motivación - ¿Qué son los observadores de contenido de Android?

¿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;

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 {

public MyObserver(Handler handler) { // el controlador es un controlador de mensajes

super(handler);

}

@Override

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);

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