Segundo a Google Developers (2025), "Os apps para Android podem enviar ou receber mensagens de transmissão do sistema Android e de outros apps Android". Para entender com mais facilidade os broadcasts, relembre os tratamentos de eventos presentes na linguagem Java. Evento é algo que acontece no sistema: pode ser sua reinicialização; o aparelho habilitado em modo avião; a bateria sendo carregada, a desabilitação da Wi-fi e assim por diante. Resumindo: algo acontece, uma classe transmite uma mensagem e outra ficará responsável em tratá-la.
Ainda, de acordo com a Google Developers (2025), "Os apps podem se registrar para receber transmissões específicas. Quando uma transmissão é enviada, o sistema a direciona automaticamente para apps que se inscreveram para receber esse tipo específico de transmissão."
Para ocorrer a transmissão da mensagem, é necessário vinculá-la ao um objeto Intent. Através do método setAction é definido o evento que aconteceu. Por meio do método putExtra é possível passar mais dados na transmissão da mensagem.
-
Referência do texto entre aspas: GOOGLE DEVELOPERS. Visão geral de transmissões.Disponível em: https://developer.android.com/guide/components/broadcasts#java. Acesso em: 25 de ago. 2025.
Broadcast Receiver
Existem duas maneiras de definir um BroadcastReceiver:
-
No arquivo AndroidManifest.xml (muitos broadcasts não funcionam mais dessa forma nas APIs superiores à 26);
-
Pelo contexto, cuja definição é feita por linha de código dentro de uma classe específica.
Para saber mais sobre as ações de transmissões existentes no Android, acesse na sua máquina a pasta do SDK. Por exemplo, na minha máquina o acesso ao arquivo foi: Sdk/platforms/android-31/data/broadcast_actions.txt.
Houve muitas mudanças na API 33 em relação aos broadcast. Por exemplo, nas mensagens emitidas pelo sistema operacional como: Airplane Mode, CONNECTIVITY_CHANGE, HEADSET_PLUG entre outras devem ser declaradas programaticamente (via registerReceiver()); ao usar um PendingIntent deve ser definido a mutabilidade, através de FLAG_IMMUTABLE ou FLAG_MUTABLE.
Exemplo 01 (App que gera e envia números aleatórios):
-
activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/main" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Gerar e enviar número" android:id="@+id/buttonGerar" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout>
-
MainActivity.java
import android.content.Intent; import android.os.Bundle; import android.widget.Button; import android.widget.Toast; import androidx.appcompat.app.AppCompatActivity; import java.util.Random; public class MainActivity extends AppCompatActivity { private static final String ACTION_NUMERO = "com.example.ACTION_NUMERO"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button buttonGerar = findViewById(R.id.buttonGerar); btnGerar.setOnClickListener(v -> { Integer numero = new Random().nextInt(100) + 1; Intent intent = new Intent(ACTION_NUMERO); intent.setPackage("nomeDoPacoteDoAppReceptor"); intent.putExtra("numero", numero); Toast.makeText(this,numero.toString(),Toast.LENGTH_LONG).show(); sendBroadcast(intent); }); } }
Exemplo 02 (App que recebe o número gerado, neste exemplo o receiver recebe o número e grava no SharedPreferences. A activity não inicia quando recebe o broadcast!!!):
-
No arquivo AndroidManifest.xml acrescente: <receiver android:name=".NumeroReceiver" android:exported="true"> <intent-filter> <action android:name="com.example.ACTION_NUMERO"/> </intent-filter> </receiver>
-
activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/main" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!" android:id="@+id/textViewNumero" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout>
-
NumeroReceiver.java
import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.util.Log; public class NumeroReceiver extends BroadcastReceiver { private static final String TAG = "AppReceptor"; @Override public void onReceive(Context context, Intent intent) { if ("com.example.ACTION_NUMERO".equals(intent.getAction())) { int numero = intent.getIntExtra("numero", -1); Log.d(TAG, "Número recebido: " + numero); SharedPreferences prefs = context.getSharedPreferences("dados", Context.MODE_PRIVATE); prefs.edit().putInt("numero", numero).apply(); } } }
-
MainActivity.java
import android.content.SharedPreferences; import android.os.Bundle; import android.widget.TextView; import androidx.appcompat.app.AppCompatActivity; public class MainActivity extends AppCompatActivity { private TextView textViewNumero; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textViewNumero = findViewById(R.id.textViewNumero); SharedPreferences prefs = getSharedPreferences("dados", MODE_PRIVATE); int numero = prefs.getInt("numero", -1); if (numero != -1) { textViewNumero.setText("número recebido: " + numero); } else { textViewNumero.setText("Nenhum número recebido..."); } } }
Exemplo 03 (App que recebe o número gerado, neste exemplo o receiver recebe o número e inicia a MainActivity. Este exemplo é apenas para mostrar como o Receiver pode ser usado para iniciar a Activity, porém isso não é recomendado, pois pode ser considerado intrusivo pelo usuário. Se for usar, faça para gerar primeiro uma notificação e assim o usuário decide se vai abrir):
-
No arquivo AndroidManifest.xml acrescente: <receiver android:name=".NumeroReceiver" android:exported="true"> <intent-filter> <action android:name="com.example.ACTION_NUMERO"/> </intent-filter> </receiver>
-
activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/main" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!" android:id="@+id/textViewNumero" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout>
-
MainActivity.java
import android.os.Bundle; import android.widget.TextView; import androidx.appcompat.app.AppCompatActivity; public class MainActivity extends AppCompatActivity { private TextView textViewNumero; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textViewNumero = findViewById(R.id.textViewNumero); int numero = getIntent().getIntExtra("numero", -1); if (numero != -1) { textViewNumero.setText("Número recebido: " + numero); } else { textViewNumero.setText("Nenhum número recebido..."); } } }
-
NumeroReceiver.java
import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.util.Log; public class NumeroReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if ("com.example.ACTION_NUMERO".equals(intent.getAction())) { int numero = intent.getIntExtra("numero", -1); Log.d("Receptor", "Número recebido: " + numero); Intent activityIntent = new Intent(context, MainActivity.class); activityIntent.putExtra("numero", numero); activityIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(activityIntent); } } }
Exemplo 04 (Broadcast Modo Avião):
-
No arquivo AndroidManifest.xml acrescente: <receiver android:name=".MyBroadcast" android:exported="true"> <intent-filter> <action android:name="android.intent.action.AIRPLANE_MODE"/> </intent-filter> </receiver>
-
activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <TextView android:id="@+id/textViewStatus" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello world!!" android:textSize="20sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout>
-
MyBroadcast.java
import android.content.BroadcastReceiver; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.widget.Toast; import androidx.fragment.app.FragmentActivity; public class MyBroadcast extends BroadcastReceiver { //API 26+ //ACTION_AIRPLANE_MODE_CHANGED é considerado um broadcast implícito protegido. private final FragmentActivity activity; public MyBroadcast(FragmentActivity activity){ this.activity = activity; } @Override public void onReceive(Context context, Intent intent) { if(Intent.ACTION_AIRPLANE_MODE_CHANGED.equals(intent.getAction())){ boolean status = intent.getBooleanExtra("state", false); String msg = null; if(status){ msg = "Modo avião ativado!"; }else{ msg = "Modo avião desativado!"; } Toast.makeText(context, msg, Toast.LENGTH_SHORT).show(); AlertDialogModoAviao dialog = new AlertDialogModoAviao(msg); dialog.show(activity.getSupportFragmentManager(), "AirplaneModeDialog"); } } }
-
AlertDialogModoAviao.java
import android.app.Dialog; import android.os.Bundle; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.DialogFragment; import androidx.appcompat.app.AlertDialog; public class AlertDialogModoAviao extends DialogFragment { private String mensagem; public AlertDialogModoAviao(String mensagem) { this.mensagem = mensagem; } @NonNull @Override public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) { return new AlertDialog.Builder(requireActivity()) .setTitle("Modo Avião") .setMessage(mensagem) .setPositiveButton("OK", null) .create(); } }
-
MainActivity.java
import androidx.appcompat.app.AppCompatActivity; import android.content.Intent; import android.content.IntentFilter; import android.os.Bundle; import android.widget.TextView; public class MainActivity extends AppCompatActivity { public TextView textViewStatus; private MyBroadcast myBroadcast; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textViewStatus = findViewById(R.id.textViewStatus); myBroadcast = new MyBroadcast(this); } @Override protected void onStart() { super.onStart(); IntentFilter filter = new IntentFilter(Intent.ACTION_AIRPLANE_MODE_CHANGED); registerReceiver(myBroadcast, filter); } @Override protected void onStop() { super.onStop(); unregisterReceiver(myBroadcast); } }