Paodingjieniu de BroadcastReceiver de Android

Introducción a esta sección:

En la sección anterior, ya teníamos una comprensión preliminar de BroadcastReceiver, conociendo dos tipos de transmisiones: registro estándar y ordenado, dinámico o estático de receptores de transmisión, transmisiones del sistema de monitoreo y envío de transmisiones por nosotros mismos. Ha satisfecho nuestras necesidades básicas ~ ¡Pero las transmisiones escritas arriba son todas transmisiones globales! Esto también significa que las transmisiones enviadas por nuestra APLICACIÓN serán recibidas por otras APLICACIONES, o que las transmisiones enviadas por otras APLICACIONES también serán recibidas por nuestra APLICACIÓN, ¡lo que fácilmente puede causar algunos problemas de seguridad! Y Android nos proporciona un mecanismo de transmisión local, las transmisiones enviadas mediante este mecanismo solo se transmitirán dentro de la aplicación, ¡y los receptores de transmisión solo pueden recibir transmisiones enviadas por esta aplicación!


1. Radiodifusión Local

1) Uso del núcleo:

PD: Las transmisiones locales no se pueden aceptar a través del registro estático, que es más eficiente que las transmisiones globales del sistema.

2) Precauciones:

3) Ejemplo de código (iniciar sesión en otro lugar para desconectar al usuario):

Al igual que WeChat, si usamos otro teléfono móvil para iniciar sesión en nuestra cuenta nuevamente en el WeChat en ejecución, el anterior le recordará a la cuenta que inicie sesión en otro terminal, y luego cerrará todas las actividades que abrimos y luego regresará al inicio de sesión. página Entonces ~
escribamos un ejemplo simple a continuación:

Diagrama de efecto de carrera:

Código:

Paso 1 : Prepare un ActivityCollector que cierre todas las actividades, ¡aquí está el proporcionado por la actividad anterior!

ActivityCollector.java

public class ActivityCollector { 
    private static List<Activity> actividades = new ArrayList<Activity>(); 
    public static void addActivity(Actividad actividad) { 
        actividades.add(actividad); 
    } 
    public static void removeActivity(Actividad actividad) { 
        actividades.remove(actividad); 
    } 
    public static void finishAll() { 
        for (Actividad actividad: actividades) { 
            if (!actividad.isFinishing()) { 
                actividad.finish(); 
            } 
        } 
} 
    }

Paso 2 : ¡Primero escriba la BaseActivity simple para la herencia y luego escriba la interfaz de inicio de sesión!

clase pública BaseActivity extiende AppCompatActivity { 
    @Override 
    protected void onCreate(Bundle SavedInstanceState) { 
        super.onCreate(savedInstanceState); 
        ActivityCollector.addActivity(esto); 
    } 

    @Override 
    protected void onDestroy() { 
        super.onDestroy(); 
        ActivityCollector.removeActivity(esto); 
    } 
}

LoginActivity.java:

Clase pública LoginActivity extiende BaseActivity implementa View.OnClickListener{ 


    private SharedPreferences pref; 
    editor privado SharedPreferences.Editor; 

    privado EditText edit_user; 
    EditText privado edit_pawd; 
    Botón privado btn_login; 


    @Override 
    protected void onCreate(Paquete de estado de instancia guardado) { 
        super.onCreate(estado de instancia guardado); 
        setContentView(R.layout.actividad_login); 
        pref = PreferenceManager.getDefaultSharedPreferences(esto); 

        enlazarVistas(); 
    } 

    private void bindViews() { 
        edit_user = (EditText) findViewById(R.id.edit_user); 
        edit_pawd = (EditText) findViewById(R.id.edit_pawd);
        btn_login = (Botón) findViewById(R.id.btn_login); 
        btn_login.setOnClickListener(esto); 
    } 

    @Override 
    protected void onStart() { 
        super.onStart(); 
        if(!pref.getString("usuario","").equals("")){ 
            edit_user.setText(pref.getString("usuario","")); 
            edit_pawd.setText(pref.getString("pawd","")); 
        } 
    } 

    @Override 
    public void onClick(Ver v) { 
        String usuario = edit_user.getText().toString(); 
        Cadena pata = edit_pawd.getText().toString(); 
        si (usuario.
            editor = pref.edit(); 
            editor.putString("usuario", 
            editor.putString("pawd", pawd); 
            editor.commit(); 
            Intent intent = new Intent(LoginActivity.this, MainActivity.class); 
            startActivity(intent); 
            Toast.makeText(LoginActivity .this,"Yo, lo hiciste bien~",Toast.LENGTH_SHORT).show(); 
            finish(); 
        }else{ 
            Toast.makeText(LoginActivity.this,"Es tan fácil de generar, ¿cuál es tu cerebro?", Brindis. LENGTH_SHORT).show(); 
        } 

    } 
}

Paso 3 : personalice un BroadcastReceiver, complete la operación del cuadro de diálogo emergente en onReceive e inicie la página de inicio:  MyBcReceiver.java

clase pública MyBcReceiver extiende BroadcastReceiver { 
    @Override 
    public void onReceive(contexto de contexto final, intento de intención) { 
        AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(context); 
        dialogBuilder.setTitle("Alerta:"); 
        dialogBuilder.setMessage("Tu El la cuenta ha iniciado sesión en otro lugar, vuelva a iniciar sesión~"); 
        dialogBuilder.setCancelable(false); 
        dialogBuilder.setPositiveButton("OK", 
                new DialogInterface.OnClickListener() { 
                    @Override 
                    public void onClick(DialogInterface dialog, int which) {  
                        ActivityCollector .terminarTodo ();
                        Intent intent = new Intent(contexto, LoginActivity. class);
                        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
                        context.startActivity(intención); 
                    } 
                }); 
        AlertDialog alertDialog = dialogBuilder.create(); 
        alertDialog.getWindow().setType( 
                WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); 
        alertaDialog.show(); 
    } 
}

No olvide agregar el permiso de diálogo del sistema en AndroidManifest.xml:  < uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

Paso 4: en MainActivity, cree una instancia de localBroadcastManager, utilícelo para completar operaciones relacionadas y preste atención a anular el registro del receptor cuando lo destruya.

MainActivity.java

clase pública MainActivity extiende BaseActivity { 

    private MyBcReceiver localReceiver; 
    privado LocalBroadcastManager localBroadcastManager; 
    IntentFilter privado IntentFilter; 

    @Override 
    protected void onCreate(Paquete de estado de instancia guardado) { 
        super.onCreate(estado de instancia guardado); 
        setContentView(R.diseño.actividad_principal); 
        localBroadcastManager = LocalBroadcastManager.getInstance(esto); 

        //初始化广播接收者,设置过滤器
        localReceiver = new MyBcReceiver(); 
        intentFilter = new IntentFilter(); 
        intentFilter.addAction("com.jay.mybcreceiver.LOGIN_OTHER"); 
        localBroadcastManager.registerReceiver(localReceiver, intentFilter);

        Botón btn_send = (Botón) findViewById(R.id.btn_send); 
        btn_send.setOnClickListener(new View.OnClickListener() { 
            @Override 
            public void onClick(View v) { 
                Intent intent = new Intent("com.jay.mybcreceiver.LOGIN_OTHER"); 
                localBroadcastManager.sendBroadcast(intent); 
            } 
        }); 
    } 

    @Override 
    protected void onDestroy() { 
        super.onDestroy(); 
        localBroadcastManager.unregisterReceiver(localReceiver); 
    } 
}

Ok, es así de simple, no olvides registrar la Actividad~


2. Resuelva el problema de escuchar la transmisión de inicio en Android 4.3 y superior:

En Android 4.3 y superior, podemos instalar la aplicación en la tarjeta SD. Todos sabemos que la tarjeta SD se carga después de un breve período de tiempo después de encender el sistema, por lo que es posible que nuestra aplicación no pueda escuchar esta transmisión! ¡Así que necesitamos monitorear tanto la transmisión de arranque como la transmisión de montaje de la tarjeta SD!

Además, algunos teléfonos móviles pueden no tener una tarjeta SD, por lo que no podemos escribir estos dos monitores de transmisión en el mismo filtro de Internet, sino que debemos escribirlos en 2. El código de configuración es el siguiente:

<receiver android:name=".MyBroadcastReceiver"> 
    <intent-filter> 
        <action android:name="android.intent.action.BOOT_COMPLETED"/> 
    </intent-filter> 
    <intent-filter> 
        <action android:name= "ANDROID.INTENT.ACTION.MEDIA_MOUNTED"/> 
        <action android:name="ANDROID.INTENT.ACTION.MEDIA_UNMOUNTED"/> 
        <data android:scheme="file"/> 
    </intent-filter> 
</receiver>

3. Resumen de transmisión del sistema de uso común:

Finalmente, me gustaría brindarle algunas transmisiones del sistema que generalmente usamos:

intent.action.AIRPLANE_MODE; 
//Emisión cuando el modo avión está activado o desactivado 

Intent.ACTION_BATTERY_CHANGED; 
//Estado de carga o cambios en la energía de la batería 
//Estado de carga de la batería, cambios en el nivel de carga, no puede recibir esta transmisión creando una declaración, Solo registre 
Intent.ACTION_BATTERY_LOW a través de Context.registerReceiver() 
; 
baja
que la batería está
Indica

// 
Intent.ACTION_CAMERA_BUTTON; // Intención de transmisión 
. ACTION_CLOSE_SYSTEM_DIALOGS 
enviado cuando se presiona el botón de la cámara (botón de hardware) al tomar fotografías ; 
// Cuando la pantalla se agota para bloquear la pantalla, cuando el usuario presiona el botón de encendido, presiona prolongadamente o brevemente (independientemente de El cuadro de diálogo no aparece), cuando la pantalla está bloqueada, el sistema Android transmitirá este mensaje de acción 
Intent.ACTION_CONFIGURATION_CHANGED; 
//La transmisión enviada cuando se cambia la configuración actual del dispositivo (incluidos los cambios: idioma de la interfaz, dispositivo orientación, etc., consulte Configuración.java) 
Intent.ACTION_DATE_CHANGED; 
//Esta transmisión se enviará cuando cambie la fecha del dispositivo







Intent.ACTION_DEVICE_STORAGE_LOW; 
//Transmisión enviada cuando la memoria del dispositivo es insuficiente, esta transmisión solo puede ser utilizada por el sistema, ¿otras aplicaciones no están disponibles? 

Intent.ACTION_DEVICE_STORAGE_OK; 
// ¿La transmisión enviada cuando la memoria del dispositivo es insuficiente o suficiente, esta transmisión solo puede ser utilizada por el sistema y otras aplicaciones no están disponibles? 

Intent.ACTION_DOCK_EVENT; 
// 
//El lugar donde se emite esta transmisión frameworks\base\services\java\com\android\server\DockObserver.java 

Intent.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE; 
Después de completar la aplicación móvil, se envía la transmisión (el móvil se refiere to: APP2SD) 

Intent .ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE; 
//La transmisión enviada cuando se mueve la aplicación (el móvil se refiere a: APP2SD) 

Intent.ACTION_GTALK_SERVICE_CONNECTED; 
//La intención de transmisión enviada cuando Gtalk ha establecido 

una conexión.ACTION_GTALK_SERVICE_DISCONNECTED; //La 
intención de transmisión 
enviado cuando Gtalk ha sido desconectado 
.ACTION_HEADSET_PLUG; 
//Broadcast Intent.ACTION_INPUT_METHOD_CHANGED enviado cuando un auricular está conectado al puerto del auricular 

;
//La transmisión se envía cuando se cambia el método de entrada 
// 
La transmisión 
se envía 
cuando 
 
Intent.ACTION_LOCALE_CHANGED;
se cambia la configuración regional actual del dispositivo 
//Emisión: el medio de expansión (tarjeta de extensión) se extrajo de la ranura de la tarjeta SD, pero el punto de montaje (punto de montaje) no se desmontó (desmontar) 
Intent.ACTION_MEDIA_BUTTON; 
//La transmisión se envió cuando el "Botón de medios " se presiona el botón, si hay un botón "Botón de medios" (botón de hardware) 
Intent.ACTION_MEDIA_CHECKING; 
//Inserte un dispositivo de almacenamiento externo, como una tarjeta SD, el sistema verificará la tarjeta SD, ¿la transmisión se envió en este momento? 
Intent.ACTION_MEDIA_EJECT; 
// La transmisión enviada por el dispositivo de almacenamiento externo de gran capacidad (como una tarjeta SD o un disco duro móvil) se ha desconectado y este mensaje se enviará independientemente de si se ha desinstalado correctamente ¿Transmisión? 
// Difusión: el usuario desea quitar los medios de expansión (desenchufe la tarjeta de expansión). 
Intent.ACTION_MEDIA_MOUNTED; 
//La transmisión enviada cuando la tarjeta SD se inserta e instala (reconoce) correctamente 
//Emisión: el medio de expansión está insertado y montado. 
Intención.ACTION_MEDIA_NOFS; 
//



 
Intent.ACTION_MEDIA_REMOVED; 
//El dispositivo de almacenamiento externo se eliminó, ya sea que se haya desinstalado correctamente o no, ¿se enviará esta transmisión? 
// Emisión: medios extendidos eliminados. 
Intent.ACTION_MEDIA_SCANNER_FINISHED; 
// 
Emisión 
: 
se ha 
escaneado 
un 
directorio de los medios porque ya está compartido como almacenamiento masivo USB. 
 Intent.ACTION_MEDIA_UNMOUNTABLE; 
// 
Intent.ACTION_MEDIA_UNMOUNTED 
// Difusión: el medio extendido existe, pero aún no se ha montado. 
Intent.ACTION_NEW_OUTGOING_CALL; 
Intent.ACTION_PACKAGE_ADDED; 
// Después de una instalación exitosa del APK 
// Difusión: Se instala un nuevo paquete de aplicación en el dispositivo. 
//Se instaló un nuevo paquete de aplicación en el dispositivo y los datos incluyen el nombre del paquete (el último programa del paquete instalado no puede recibir esta transmisión) 
 Intent.ACTION_PACKAGE_CHANGED;


//Un paquete de aplicación existente ha cambiado, incluido el nombre del paquete 
Intent.ACTION_PACKAGE_DATA_CLEARED;
//La transmisión enviada al borrar los datos de una aplicación (en Configuración - Administración de aplicaciones - seleccione una aplicación, luego haga clic en ¿Borrar datos?) //El usuario ha borrado los datos 
de un paquete, incluido el nombre del paquete (borrar el programa del paquete No se puede recibir esta transmisión) 

Intent.ACTION_PACKAGE_INSTALL; 
// ¿Activar una transmisión cuando se completa una descarga y se completa la instalación, como descargar una aplicación en el mercado electrónico? 
// 
Intent.ACTION_PACKAGE_REMOVED; 
//Transmisión enviada después de eliminar con éxito un APK 
//Se eliminó un paquete de aplicación existente del dispositivo, incluido el nombre del paquete (el programa del paquete que se está instalando no puede recibir esta transmisión) 

Intent.ACTION_PACKAGE_REPLACED; 
// La transmisión enviada cuando se reemplaza un paquete de instalación existente (independientemente de si la aplicación instalada es más nueva o más antigua que la anterior, ¿se enviará esta transmisión?) Intent.ACTION_PACKAGE_RESTARTED; //El usuario reinicia un paquete, todos los procesos 
del 
paquete debe eliminarse y todo el estado de tiempo de ejecución asociado debe eliminarse, incluido el nombre del paquete (los programas del paquete de reinicio no pueden recibir esta transmisión) Intent.ACTION_POWER_CONNECTED; 
// 
Intento de transmisión.ACTION_POWER_DISCONNECTED 
enviado cuando se conecta una fuente de alimentación externa // 
Intento de transmisión. ACTION_PROVIDER_CHANGED 
cuando se desconecta la fuente de alimentación externa 
; 
//Intent.ACTION_REBOOT; 
//Emisión cuando se reinicia el dispositivo


Intent.ACTION_SCREEN_OFF; // 
Intento de transmisión.ACTION_SCREEN_ON 
después de apagar la pantalla ; // 
Intento de transmisión.ACTION_SHUTDOWN 
después de encender la pantalla ; //Intento de 
transmisión.ACTION_TIMEZONE_CHANGED 
enviado cuando el sistema está apagado ; // 
Intento de transmisión 
enviado cuando la zona horaria cambia .ACTION_TIME_CHANGED; 
//Intento de transmisión.ACTION_TIME_TICK enviado cuando se establece la hora 
; 
//Emisión: la hora actual ha cambiado (lapso de tiempo normal). 
//Los cambios de hora actuales, enviados cada minuto, no se pueden recibir a través de la declaración del componente, solo a través del método Context.registerReceiver() para registrar 
Intent.ACTION_UID_REMOVED; 
//La transmisión enviada por un ID de usuario se ha eliminado del sistema 
// 
Intent. ACTION_UMS_CONNECTED ; 
// ¿Transmitir cuando el dispositivo ha ingresado al estado de almacenamiento masivo USB? 
Intent.ACTION_UMS_DISCONNECTED; 
// ¿Transmitir cuando el dispositivo ha cambiado del estado de almacenamiento masivo USB al estado normal? 
Intent.ACTION_USER_PRESENT 
//










Intent.ACTION_WALLPAPER_CHANGED; 
//Transmitir cuando el fondo de pantalla del dispositivo ha cambiado

Supongo que te gusta

Origin blog.csdn.net/leyang0910/article/details/131332384
Recomendado
Clasificación