Android: receptores de difusión
Broadcast Receivers simplemente responda a los mensajes de difusión de otras aplicaciones o del propio sistema. Estos mensajes a veces se denominan eventos o intenciones. Por ejemplo, las aplicaciones también pueden iniciar transmisiones para que otras aplicaciones sepan que se han descargado algunos datos en el dispositivo y están disponibles para su uso, por lo que este es un receptor de transmisión que interceptará esta comunicación e iniciará la acción apropiada.
Hay dos pasos importantes siguientes para que BroadcastReceiver funcione para los intentos de transmisión del sistema:
Creación del receptor de transmisión.
Registro de receptor de transmisión
Hay un paso adicional en caso de que vaya a implementar sus intenciones personalizadas, entonces tendrá que crear y difundir esas intenciones.
Creación del receptor de transmisión
Un receptor de radiodifusión se implementa como una subclase de BroadcastReceiver class y anulando el método onReceive () donde cada mensaje se recibe como un Intent parámetro de objeto.
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "Intent Detected.", Toast.LENGTH_LONG).show();
}
}
Registro de receptor de transmisión
Una aplicación escucha las intenciones de transmisión específicas al registrar un receptor de transmisión en el archivo AndroidManifest.xml . Considere que vamos a registrar MyReceiver para el evento generado por el sistema ACTION_BOOT_COMPLETED que es disparado por el sistema una vez que el sistema Android ha completado el proceso de arranque.
Receptor de radiodifusión
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<receiver android:name="MyReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED">
</action>
</intent-filter>
</receiver>
</application>
Ahora, cada vez que se inicie su dispositivo Android, BroadcastReceiver MyReceiver lo interceptará y se ejecutará la lógica implementada dentro de onReceive () .
Hay varios eventos generados por el sistema definidos como campos estáticos finales en el Intentclase. La siguiente tabla enumera algunos eventos importantes del sistema.
No Señor | Constante y descripción del evento |
---|---|
1 |
android.intent.action.BATTERY_CHANGED Transmisión fija que contiene el estado de carga, el nivel y otra información sobre la batería. |
2 |
android.intent.action.BATTERY_LOW Indica una condición de batería baja en el dispositivo. |
3 |
android.intent.action.BATTERY_OKAY Indica que la batería ahora está bien después de estar baja. |
4 |
android.intent.action.BOOT_COMPLETED Esto se transmite una vez, después de que el sistema haya terminado de iniciarse. |
5 | android.intent.action.BUG_REPORT Mostrar actividad para informar de un error. |
6 | android.intent.action.CALL Realice una llamada a alguien especificado por los datos. |
7 | android.intent.action.CALL_BUTTON El usuario presionó el botón "llamar" para ir al marcador u otra interfaz de usuario apropiada para realizar una llamada. |
8 | android.intent.action.DATE_CHANGED La fecha ha cambiado. |
9 | android.intent.action.REBOOT Haga que el dispositivo se reinicie. |
Difusión de intenciones personalizadas
Si desea que su propia aplicación genere y envíe intents personalizados, tendrá que crear y enviar esos intents utilizando el método sendBroadcast () dentro de su clase de actividad. Si usa el método sendStickyBroadcast (Intent) , el Intent essticky, lo que significa que la intención que está enviando permanece después de que se completa la transmisión.
public void broadcastIntent(View view) {
Intent intent = new Intent();
intent.setAction("com.tutorialspoint.CUSTOM_INTENT");
sendBroadcast(intent);
}
Esta intención com.tutorialspoint.CUSTOM_INTENT también se puede registrar de manera similar a como hemos registrado la intención generada por el sistema.
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<receiver android:name="MyReceiver">
<intent-filter>
<action android:name="com.tutorialspoint.CUSTOM_INTENT">
</action>
</intent-filter>
</receiver>
</application>
Ejemplo
Este ejemplo le explicará cómo crear BroadcastReceiver para interceptar la intención personalizada. Una vez que esté familiarizado con la intención personalizada, puede programar su aplicación para interceptar las intenciones generadas por el sistema. Así que sigamos los siguientes pasos para modificar la aplicación de Android que creamos en el capítulo Ejemplo de Hello World :
Paso | Descripción |
---|---|
1 | Utilizará Android Studio para crear una aplicación de Android y nombrarla como Mi aplicación en un paquete com.example.tutorialspoint7.myapplication como se explica en el capítulo Ejemplo de Hello World . |
2 | Modifique el archivo de actividad principal MainActivity.java para agregar el método broadcastIntent () . |
3 | Cree un nuevo archivo java llamado MyReceiver.java en el paquete com.example.tutorialspoint7.myapplication para definir un BroadcastReceiver. |
4 | Una aplicación puede manejar una o más intenciones personalizadas y del sistema sin restricciones. Cada intento que desee interceptar debe registrarse en su archivo AndroidManifest.xml usando la etiqueta <receptor ... /> |
5 | Modifique el contenido predeterminado del archivo res / layout / activity_main.xml para incluir un botón para transmitir la intención. |
6 | No es necesario modificar el archivo de cadena, Android Studio se encarga del archivo string.xml. |
7 | Ejecute la aplicación para iniciar el emulador de Android y verifique el resultado de los cambios realizados en la aplicación. |
A continuación se muestra el contenido del archivo de actividad principal modificado MainActivity.java. Este archivo puede incluir cada uno de los métodos fundamentales del ciclo de vida. Hemos agregado el método broadcastIntent () para transmitir una intención personalizada.
package com.example.tutorialspoint7.myapplication;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
public class MainActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
// broadcast a custom intent.
public void broadcastIntent(View view){
Intent intent = new Intent();
intent.setAction("com.tutorialspoint.CUSTOM_INTENT"); sendBroadcast(intent);
}
}
A continuación se muestra el contenido de MyReceiver.java:
package com.example.tutorialspoint7.myapplication;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
/**
* Created by TutorialsPoint7 on 8/23/2016.
*/
public class MyReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "Intent Detected.", Toast.LENGTH_LONG).show();
}
}
A continuación se muestra el contenido modificado del archivo AndroidManifest.xml . Aquí hemos agregado la etiqueta <receptor ... /> para incluir nuestro servicio:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.tutorialspoint7.myapplication">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver android:name="MyReceiver">
<intent-filter>
<action android:name="com.tutorialspoint.CUSTOM_INTENT">
</action>
</intent-filter>
</receiver>
</application>
</manifest>
A continuación se mostrará el contenido de res/layout/activity_main.xml archivo para incluir un botón para difundir nuestra intención personalizada -
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context=".MainActivity">
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Example of Broadcast"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:textSize="30dp" />
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Tutorials point "
android:textColor="#ff87ff09"
android:textSize="30dp"
android:layout_above="@+id/imageButton"
android:layout_centerHorizontal="true"
android:layout_marginBottom="40dp" />
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/imageButton"
android:src="@drawable/abc"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/button2"
android:text="Broadcast Intent"
android:onClick="broadcastIntent"
android:layout_below="@+id/imageButton"
android:layout_centerHorizontal="true" />
</RelativeLayout>
Intentemos ejecutar nuestro modificado Hello World!aplicación que acabamos de modificar. Supongo que habías creado tuAVDmientras realiza la configuración del entorno. Para ejecutar la aplicación desde Android Studio, abra uno de los archivos de actividad de su proyecto y haga clic en el icono Ejecutar de la barra de herramientas. Android Studio instala la aplicación en su AVD y la inicia y, si todo está bien con su configuración y aplicación, se mostrará la siguiente ventana del emulador:
Ahora, para transmitir nuestra intención personalizada, hagamos clic en Broadcast Intent, esto transmitirá nuestra intención personalizada "com.tutorialspoint.CUSTOM_INTENT" que será interceptada por nuestro BroadcastReceiver registrado, es decir, MyReceiver y, según nuestra lógica implementada, aparecerá un brindis en la parte inferior del simulador de la siguiente manera:
Puede intentar implementar otro BroadcastReceiver para interceptar las intenciones generadas por el sistema, como el inicio del sistema, la fecha de cambio, la batería baja, etc.