Android - Ricevitori di trasmissione

Broadcast Receivers rispondere semplicemente ai messaggi trasmessi da altre applicazioni o dal sistema stesso. Questi messaggi sono talvolta chiamati eventi o intenti. Ad esempio, le applicazioni possono anche avviare trasmissioni per far sapere ad altre applicazioni che alcuni dati sono stati scaricati sul dispositivo e sono disponibili per l'uso, quindi questo è il destinatario della trasmissione che intercetterà questa comunicazione e avvierà l'azione appropriata.

Sono disponibili due passaggi importanti per far funzionare BroadcastReceiver per gli intenti trasmessi dal sistema:

  • Creazione del ricevitore di trasmissione.

  • Registrazione del ricevitore di trasmissione

C'è un passaggio aggiuntivo nel caso in cui intendi implementare i tuoi intenti personalizzati, quindi dovrai creare e trasmettere quegli intenti.

Creazione del ricevitore di trasmissione

Un ricevitore di trasmissione è implementato come una sottoclasse di BroadcastReceiver class e sovrascrivendo il metodo onReceive () in cui ogni messaggio viene ricevuto come file Intent parametro oggetto.

public class MyReceiver extends BroadcastReceiver {
   @Override
   public void onReceive(Context context, Intent intent) {
      Toast.makeText(context, "Intent Detected.", Toast.LENGTH_LONG).show();
   }
}

Registrazione del ricevitore di trasmissione

Un'applicazione ascolta gli intenti di trasmissione specifici registrando un ricevitore di trasmissione nel file AndroidManifest.xml . Considera che registreremo MyReceiver per l'evento ACTION_BOOT_COMPLETED generato dal sistema che viene attivato dal sistema una volta che il sistema Android ha completato il processo di avvio.

Ricevitore di trasmissione

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

Ora, ogni volta che il tuo dispositivo Android viene avviato, verrà intercettato da BroadcastReceiver MyReceiver e verrà eseguita la logica implementata all'interno di onReceive () .

Esistono diversi eventi generati dal sistema definiti come campi statici finali nel file Intentclasse. La tabella seguente elenca alcuni importanti eventi di sistema.

Suor n Costante e descrizione dell'evento
1

android.intent.action.BATTERY_CHANGED

Trasmissione adesiva contenente lo stato di carica, il livello e altre informazioni sulla batteria.

2

android.intent.action.BATTERY_LOW

Indica la condizione di batteria scarica sul dispositivo.

3

android.intent.action.BATTERY_OKAY

Indica che la batteria ora è a posto dopo essere scarica.

4

android.intent.action.BOOT_COMPLETED

Questo viene trasmesso una volta, dopo che il sistema ha terminato l'avvio.

5

android.intent.action.BUG_REPORT

Mostra attività per segnalare un bug.

6

android.intent.action.CALL

Effettua una chiamata a qualcuno specificato dai dati.

7

android.intent.action.CALL_BUTTON

L'utente ha premuto il pulsante "chiama" per accedere al dialer o ad un'altra interfaccia utente appropriata per effettuare una chiamata.

8

android.intent.action.DATE_CHANGED

La data è cambiata.

9

android.intent.action.REBOOT

Fai riavviare il dispositivo.

Trasmissione di intenti personalizzati

Se vuoi che la tua stessa applicazione generi e invii intenti personalizzati, dovrai creare e inviare quegli intenti utilizzando il metodo sendBroadcast () all'interno della tua classe di attività. Se utilizzi il metodo sendStickyBroadcast (Intent) , l'Intent èsticky, il che significa che l' intento che stai inviando rimane in giro dopo che la trasmissione è completa.

public void broadcastIntent(View view) {
   Intent intent = new Intent();
   intent.setAction("com.tutorialspoint.CUSTOM_INTENT");
   sendBroadcast(intent);
}

Questo intento com.tutorialspoint.CUSTOM_INTENT può anche essere registrato in modo simile poiché abbiamo registrato l'intento generato dal 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>

Esempio

Questo esempio ti spiegherà come creare BroadcastReceiver per intercettare l'intento personalizzato. Una volta acquisita familiarità con l'intento personalizzato, è possibile programmare l'applicazione per intercettare gli intenti generati dal sistema. Quindi seguiamo i seguenti passaggi per modificare l'applicazione Android che abbiamo creato nel capitolo Hello World Example -

Passo Descrizione
1 Si utilizzerà Android Studio per creare un'applicazione Android e denominarla come La mia applicazione in un pacchetto com.example.tutorialspoint7.myapplication come spiegato nel capitolo Hello World Example .
2 Modificare il file di attività principale MainActivity.java per aggiungere il metodo broadcastIntent () .
3 Crea un nuovo file java chiamato MyReceiver.java nel pacchetto com.example.tutorialspoint7.myapplication per definire un BroadcastReceiver.
4 Un'applicazione può gestire uno o più intenti personalizzati e di sistema senza alcuna restrizione. Ogni intento che desideri intercettare deve essere registrato nel tuo file AndroidManifest.xml utilizzando il tag <receiver ... />
5 Modifica il contenuto predefinito del file res / layout / activity_main.xml per includere un pulsante per trasmettere l'intento.
6 Non è necessario modificare il file della stringa, Android Studio si occupa del file string.xml.
7 Esegui l'applicazione per avviare l'emulatore Android e verifica il risultato delle modifiche apportate nell'applicazione.

Di seguito è riportato il contenuto del file di attività principale modificato MainActivity.java. Questo file può includere ciascuno dei metodi fondamentali del ciclo di vita. Abbiamo aggiunto il metodo broadcastIntent () per trasmettere un intento personalizzato.

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

Di seguito è riportato il contenuto di 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();
   }
}

Di seguito verrà visualizzato il contenuto modificato del file AndroidManifest.xml . Qui abbiamo aggiunto il tag <receiver ... /> per includere il nostro servizio:

<?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>

Di seguito sarà il contenuto di res/layout/activity_main.xml file per includere un pulsante per trasmettere il nostro intento personalizzato -

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

Proviamo a eseguire il nostro file modificato Hello World!applicazione che abbiamo appena modificato. Presumo che tu abbia creato il tuoAVDdurante l'impostazione dell'ambiente. Per eseguire l'app da Android Studio, apri uno dei file di attività del tuo progetto e fai clic sull'icona Esegui dalla barra degli strumenti. Android Studio installa l'app sul tuo AVD e la avvia e se tutto va bene con la configurazione e l'applicazione, verrà visualizzata la seguente finestra dell'emulatore:

Ora per trasmettere il nostro intento personalizzato, facciamo clic su Broadcast Intentpulsante, questo trasmetterà il nostro intento personalizzato "com.tutorialspoint.CUSTOM_INTENT" che verrà intercettato dal nostro BroadcastReceiver registrato cioè MyReceiver e secondo la nostra logica implementata verrà visualizzato un avviso nella parte inferiore del simulatore come segue:

Puoi provare a implementare altri BroadcastReceiver per intercettare gli intenti generati dal sistema come l'avvio del sistema, la data modificata, la batteria scarica ecc.