São mensagens emitidas na tela do dispositivo móvel para informar o usuário sobre downloads, atualizações, eventos, etc. As notificações podem ser emitidos por aplicativos de terceiros instalados, do próprio sistema operacional, mensagens de operadoras, de promoções, chamadas de telefones não atendidas. Conforme consta na documentação oficial (Google Developers), "uma notificação é uma mensagem que o Android exibe fora da interface do seu app para fornecer ao usuário lembretes, comunicações de outras pessoas ou outros informações oportunas do seu app. Os usuários podem tocar na notificação para abrir seu ou realizar uma ação diretamente da notificação".
Referência do texto entre aspas: GOOGLE DEVELOPERS. Visão geral de notificações. Disponível em: https://developer.android.com/develop/ui/views/notifications?hl=pt-br. Acesso em: 27 ago. 2025.
As notificações podem ser simples, expandidas, ter a capacidade de responder ao toque do usuário. Um ponto importante em relação às notificações, é que é necessário criar um canal antes de exibi-las.
Exemplo 01 (notificação simples):
-
No arquivo AndroidManifest.xml acrescente <uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
-
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"> <Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Gerar Notificação" android:onClick="gerar" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout>
-
NotificationHelper.java
import android.Manifest; import android.app.NotificationChannel; import android.app.NotificationManager; import android.content.Context; import android.content.pm.PackageManager; import android.os.Build; import androidx.core.app.ActivityCompat; import androidx.core.app.NotificationCompat; import androidx.core.app.NotificationManagerCompat; public class NotificationHelper { private static final String CANAL_ID = "2"; private static final int NOTIFICACAO_ID = 1; public static void criarCanal(Context context) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { CharSequence nome = "canal1"; String descricao = "descrição do canal 1"; int importancia = NotificationManager.IMPORTANCE_DEFAULT; NotificationChannel canal = new NotificationChannel(CANAL_ID, nome, importancia); canal.setDescription(descricao); NotificationManager nm = context.getSystemService(NotificationManager.class); nm.createNotificationChannel(canal); } } public static void gerarNotificacao(Context context, String titulo, String conteudo) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU && ActivityCompat.checkSelfPermission(context, Manifest.permission.POST_NOTIFICATIONS) != PackageManager.PERMISSION_GRANTED) { return; } NotificationCompat.Builder builder = new NotificationCompat.Builder(context, CANAL_ID) .setSmallIcon(android.R.drawable.ic_dialog_info) .setContentTitle(titulo) .setContentText(conteudo) .setPriority(NotificationCompat.PRIORITY_DEFAULT); NotificationManagerCompat nm = NotificationManagerCompat.from(context); nm.notify(NOTIFICACAO_ID, builder.build()); } }
-
PermissionHelper.java
import android.Manifest; import android.app.Activity; import android.content.pm.PackageManager; import android.os.Build; import androidx.core.app.ActivityCompat; public class PermissionHelper { public static final int REQUEST_NOTIFICACAO = 101; public static boolean temPermissaoNotificacao(Activity activity) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { return ActivityCompat.checkSelfPermission(activity, Manifest.permission.POST_NOTIFICATIONS) == PackageManager.PERMISSION_GRANTED; } return true; } public static void pedirPermissaoNotificacao(Activity activity) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { if (!temPermissaoNotificacao(activity)) { ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.POST_NOTIFICATIONS}, REQUEST_NOTIFICACAO); } } } }
-
MainActivity.java
import android.content.pm.PackageManager; import android.os.Bundle; import android.view.View; import android.widget.Toast; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); NotificationHelper.criarCanal(this); PermissionHelper.pedirPermissaoNotificacao(this); } public void gerar(View view) { if (PermissionHelper.temPermissaoNotificacao(this)) { NotificationHelper.gerarNotificacao(this, "Título de Teste", "Esta é a minha notificação :)"); } else { Toast.makeText(this, "Ative a permissão!!!", Toast.LENGTH_LONG).show(); } } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == PermissionHelper.REQUEST_CODE_NOTIFICACAO) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { Toast.makeText(this, "Permissão concedida", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(this, "Permissão negada", Toast.LENGTH_LONG).show(); } } } }
Antes de criar e emitir uma notificação, é necessário criar um canal. Conforme Google Developers (2025), "Antes de entregar a notificação no Android 8.0 e versões mais recentes, você precisa registrar o canal de notificação do seu app no sistema, transmitindo uma instância de NotificationChannel para createNotificationChannel()."
-
Referência do texto entre aspas: GOOGLE DEVELOPERS. Criar uma notificação. Disponível em: https://developer.android.com/training/notify-user/build-notification?hl=pt-br. Acesso em: 27 ago 2025.
Exemplo 02 (notificação expansível):
-
No arquivo AndroidManifest.xml acrescente <uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
-
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"> <Button android:id="@+id/buttonGerar" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Gerar Notificação" android:onClick="gerar" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout>
-
NotificationHelper.java
import android.annotation.SuppressLint; import android.app.NotificationChannel; import android.app.NotificationManager; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Build; import androidx.core.app.NotificationCompat; import androidx.core.app.NotificationManagerCompat; public class NotificationHelper { public static final String CANAL_ID = "canal_notificacao"; public static final int NOTIFICACAO_ID = 1; private final Context context; public NotificationHelper(Context context) { this.context = context; } @SuppressLint("MissingPermission") public void gerarNotificacao(String titulo, String conteudo) { criarCanal(); Intent i = new Intent(context, SegundaActivity.class); i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); PendingIntent pi = PendingIntent.getActivity(context, 0, i, PendingIntent.FLAG_IMMUTABLE); Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.sunflower); NotificationCompat.Builder builder = new NotificationCompat.Builder(context, CANAL_ID) .setSmallIcon(android.R.drawable.ic_dialog_info) .setContentTitle(titulo) .setContentText(conteudo) .setPriority(NotificationCompat.PRIORITY_DEFAULT) .setContentIntent(pi) .setAutoCancel(true) .setLargeIcon(bitmap) .setStyle(new NotificationCompat.BigTextStyle() .bigText("Texto longo de teste\nteste teste\nteste teste teste")); NotificationManagerCompat nm = NotificationManagerCompat.from(context); nm.notify(NOTIFICACAO_ID, builder.build()); }
private void criarCanal() { if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { CharSequence nome = "Canal Notificação"; String descricao = "Canal para notificações padrão"; int importancia = NotificationManager.IMPORTANCE_DEFAULT; NotificationChannel canal = new NotificationChannel(CANAL_ID, nome, importancia); canal.setDescription(descricao); NotificationManager nm = context.getSystemService(NotificationManager.class); nm.createNotificationChannel(canal); } } }
-
PermissionHelper.java
import android.Manifest; import android.content.pm.PackageManager; import android.widget.Toast; import androidx.appcompat.app.AppCompatActivity; import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat; public class PermissionHelper { private final AppCompatActivity activity; public PermissionHelper(AppCompatActivity activity) { this.activity = activity; } public boolean temPermissaoNotificacao() { return ContextCompat.checkSelfPermission(activity, Manifest.permission.POST_NOTIFICATIONS) == PackageManager.PERMISSION_GRANTED; } public void solicitarPermissao(int requestCode) { // Se o usuário já negou antes → mostra explicação if (ActivityCompat.shouldShowRequestPermissionRationale(activity, Manifest.permission.POST_NOTIFICATIONS)) { Toast.makeText(activity, "A permissão é necessária." , Toast.LENGTH_LONG).show(); } ActivityCompat.requestPermissions( activity, new String[]{Manifest.permission.POST_NOTIFICATIONS}, requestCode ); } }
-
MainActivity.java
import android.content.pm.PackageManager; import android.os.Bundle; import android.widget.Button; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; public class MainActivity extends AppCompatActivity { private static final int REQUEST_NOTIFICACAO = 100; private PermissionHelper permissionHelper; private NotificationHelper notificationHelper; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); permissionHelper = new PermissionHelper(this); notificationHelper = new NotificationHelper(this); Button btn = findViewById(R.id.buttonGerar); btn.setOnClickListener(v -> { if (permissionHelper.temPermissaoNotificacao()) { notificationHelper.gerarNotificacao( "Título teste", "Conteúdo teste" ); } else { permissionHelper.solicitarPermissao(REQUEST_NOTIFICACAO); } }); } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == REQUEST_NOTIFICACAO) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { notificationHelper.gerarNotificacao( "Permissão concedida!", "Agora você pode receber notificações." ); } } } }
-
activity_segunda.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout 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" android:orientation="vertical" android:layout_margin="20dp" tools:context=".SegundaActivity"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="@style/TextAppearance.AppCompat.Large" android:text="Hello World!!" /> </LinearLayout>
-
SegundaActivity.java
import android.os.Bundle; import android.widget.TextView; import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; public class SegundaActivity extends AppCompatActivity { @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_segunda); } }
Observe que neste exemplo, a notificação mostra uma mensagem. Quando o usuário clicar na notificação, será chamada uma outra Activity que apresenta a mensagem "Hello World". Esta atividade não pertence ao fluxo normal do aplicativo, por isso foi usada a flag Intent.FLAG_ACTIVITY_NEW_TASK ou Intent.FLAG_ACTIVITY_CLEAR_TASK.
Exemplo 03 (Notificação com progress bar):
-
No arquivo AndroidManifest.xml acrescente <uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
-
activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout 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:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/editTextPalavra" android:textAppearance="@style/TextAppearance.AppCompat.Large"/> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Gerar notificação!" android:id="@+id/buttonSalvar" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> </LinearLayout>
-
MainActivity.java
import android.Manifest; import android.annotation.SuppressLint; import android.app.NotificationChannel; import android.app.NotificationManager; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.PackageManager; import android.net.Uri; import android.os.Build; import android.provider.Settings; import android.util.Log; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import androidx.core.app.ActivityCompat; import androidx.core.app.NotificationCompat; import androidx.core.app.NotificationManagerCompat; import androidx.core.content.ContextCompat; public class MainActivity extends AppCompatActivity { private static final int REQUEST_NOTIFICACAO = 100; private static final String CHANNEL_ID = "gravar_dado_channel"; private static final int NOTIFICATION_ID = 1; private EditText editTextPalavra; private Button buttonSalvar; @Override protected void onCreate(android.os.Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); editTextPalavra = findViewById(R.id.editTextPalavra); buttonSalvar = findViewById(R.id.buttonSalvar); criarCanalNotificacao(); buttonSalvar.setOnClickListener(v -> { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { verificarPermissao(); } else { gerarNotificacaoComProgresso(); } }); } public void verificarPermissao(){ if (ContextCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS) == android.content.pm.PackageManager.PERMISSION_GRANTED) { gerarNotificacaoComProgresso(); } else if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.POST_NOTIFICATIONS)) { Toast.makeText(this, "A permissão é necessária ....", Toast.LENGTH_LONG).show(); ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.POST_NOTIFICATIONS}, REQUEST_NOTIFICACAO); } else { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.POST_NOTIFICATIONS}, REQUEST_NOTIFICACAO); } } private boolean salvarFrase() { String frase = editTextPalavra.getText().toString().trim(); SharedPreferences prefs = getSharedPreferences("dado", Context.MODE_PRIVATE); SharedPreferences.Editor editor = prefs.edit(); editor.putString("frase", frase); return editor.commit(); } private void criarCanalNotificacao() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { CharSequence nome = "Gravando Dado"; String descricao = "Notificação mostrando progresso de gravação"; int importancia = NotificationManager.IMPORTANCE_DEFAULT; NotificationChannel canal = new NotificationChannel(CHANNEL_ID, nome, importancia); canal.setDescription(descricao); NotificationManager nm = getSystemService(NotificationManager.class); nm.createNotificationChannel(canal); } } @SuppressLint("MissingPermission") private void gerarNotificacaoComProgresso() { NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID) .setSmallIcon(R.mipmap.ic_launcher) .setContentTitle("Gravando dado") .setContentText("Processando...") .setPriority(NotificationCompat.PRIORITY_DEFAULT); NotificationManagerCompat notificationManagerCompat = NotificationManagerCompat.from(this); int PROGRESS_MAX = 100; new Thread(() -> { for (int PROGRESS_CURRENT = 0; PROGRESS_CURRENT <= PROGRESS_MAX; PROGRESS_CURRENT += 20) { builder.setProgress(PROGRESS_MAX, PROGRESS_CURRENT, false); notificationManagerCompat.notify(NOTIFICATION_ID, builder.build()); try { Thread.sleep(1000); } catch (InterruptedException e) { Log.d("TAG", " thread sleep failure"); } } if (salvarFrase()) { builder.setContentText("Gravação concluída") .setProgress(0, 0, false) .setStyle(new NotificationCompat.BigTextStyle().bigText("Dado salvo!!")); notificationManagerCompat.notify(NOTIFICATION_ID, builder.build()); } else { builder.setContentText("Falha ao salvar") .setProgress(0, 0, false) .setStyle(new NotificationCompat.BigTextStyle().bigText("Tente novamente")); notificationManagerCompat.notify(NOTIFICATION_ID, builder.build()); } }).start(); } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == REQUEST_NOTIFICACAO) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED ) { gerarNotificacaoComProgresso(); } else { Toast.makeText(this, "Permissão negada", Toast.LENGTH_LONG).show(); } } } }
Exemplo 04 (notificação personalizada):
-
No arquivo AndroidManifest.xml acrescente <uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
-
notification_layout.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:padding="8dp"> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/ic_launcher_foreground" /> <TextView android:id="@+id/notification_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Título da Notificação" style="@style/TextAppearance.Compat.Notification.Title" /> <TextView android:id="@+id/notification_conteudo" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Conteúdo da notificação" style="@style/TextAppearance.Compat.Notification.Info" /> </LinearLayout>
-
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"> <Button android:id="@+id/buttonGerar" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Clique" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout>
-
MainActivity.java
import android.Manifest; import android.annotation.SuppressLint; import android.app.NotificationChannel; import android.app.NotificationManager; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.provider.Settings; import android.widget.Button; import android.widget.RemoteViews; import android.widget.Toast; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import androidx.core.app.ActivityCompat; import androidx.core.app.NotificationCompat; import androidx.core.app.NotificationManagerCompat; import androidx.core.content.ContextCompat; public class MainActivity extends AppCompatActivity { private static final String CHANNEL_ID = "2"; private static final int REQUEST_NOTIFICACAO = 100; private int notificationId = 1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); criarCanalNotificacao(); Button buttonGerar = findViewById(R.id.buttonGerar); buttonGerar.setOnClickListener(v -> { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { if (ContextCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS) == android.content.pm.PackageManager.PERMISSION_GRANTED) { gerarNotificacao(); } else if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.POST_NOTIFICATIONS)) { Toast.makeText(this, "Permissão necessária!", Toast.LENGTH_LONG).show(); ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.POST_NOTIFICATIONS}, REQUEST_NOTIFICACAO); } else { // Primeira vez ou sistema bloqueou pop-up ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.POST_NOTIFICATIONS}, REQUEST_NOTIFICACAO); } } else { gerarNotificacao(); } }); } @SuppressLint("MissingPermission") private void gerarNotificacao() { RemoteViews notificationLayout = new RemoteViews(getPackageName(), R.layout.notification_layout); NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID) .setSmallIcon(R.mipmap.ic_launcher) .setStyle(new NotificationCompat.DecoratedCustomViewStyle()) .setCustomContentView(notificationLayout) .setPriority(NotificationCompat.PRIORITY_DEFAULT); NotificationManagerCompat nm = NotificationManagerCompat.from(this); nm.notify(notificationId, builder.build()); } private void criarCanalNotificacao() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { CharSequence nome = "canal1"; String descricao = "Descrição do canal 1"; int importance = NotificationManager.IMPORTANCE_DEFAULT; NotificationChannel canal = new NotificationChannel(CHANNEL_ID, nome, importance); canal.setDescription(descricao); NotificationManager nm = getSystemService(NotificationManager.class); nm.createNotificationChannel(canal); } } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == REQUEST_NOTIFICACAO) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { gerarNotificacao(); } else { Toast.makeText(this, "Permissão negada.", Toast.LENGTH_LONG).show(); } } } }