오늘은 안드로이드 스튜디오를 이용해서 안드로이드 헤드업 알림을 구현하는 방법에 대해 알아보고자 한다.
여기서 말하는 헤드업 알림이란 아래와 같이 상단에 간단한 정보와 함께 표현되는 알림을 의미한다.
구현은 아래 공식문서를 보며 참고하였다.
1. 프로젝트 생성
프로젝트는 Empty Activity로 기본 설정으로 생성하였다.
2. activity_main 수정
버튼을 클릭하면 알림이 울릴 수 있게 activity_main에 아래와 같이 버튼을 추가한다.
<?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/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView" />
</androidx.constraintlayout.widget.ConstraintLayout>
3. 알림을 위한 채널 생성
공식 문서에서 아래와 같이 작성되어있기 때문에 채널을 생성해서 등록해주어야 한다.
Android 8.0 이상에서 알림을 제공하려면 먼저 NotificationChannel 인스턴스를
createNotificationChannel()에 전달하여 앱의 알림 채널을 시스템에 등록해야 합니다.
따라서 다음 코드는 SDK_INT 버전에서 조건에 의해 차단됩니다.
MainActivity onCreate 안에 코드를 추가해서 앱 실행과 동시에 채널을 먼저 생성해주며,
안드로이드 버전이 8.0일 때만 생성하게끔 구분해준다.
또 채널을 생성하는 코드에서 NotificationManager.IMPORTANCE_HIGH 이상을 사용해야 헤드업 알림이 적용된다.
CHANNEL_ID와 NAME은 본인이 원하는 대로 지정해주면 된다.
나중에 Builder를 작성할 때 여기서 생성한 CHANNEL_ID를 넣어주기만 하면 된다.
public class MainActivity extends AppCompatActivity {
Button button;
NotificationManager notificationManager;
final String CHANNEL_ID = "YOUR_CHANNEL_ID";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = (Button) findViewById(R.id.button); // 생성한 버튼 연결
notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
// 버전이 오레오보다 높으면 채널 생성
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
// NotificationManager.IMPORTANCE_HIGH 이상이여야 Head Up 알림이 적용된다.
NotificationChannel channel = new NotificationChannel(CHANNEL_ID, "NAME", NotificationManager.IMPORTANCE_HIGH);
notificationManager.createNotificationChannel(channel);
}
}
}
4. 버튼 클릭 시 알림 띄우기
버튼에 onClickListener를 이용해서 클릭을 감지하고 클릭 시에 알림을 설정하고 띄워준다.
알림을 생성하는 Builder도 안드로이드 버전에 따라 다르게 설정해준다.
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// 버전이 오레오보다 높고 낮을 때를 분리해서 builder 생성
NotificationCompat.Builder builder;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
builder = new NotificationCompat.Builder(MainActivity.this, CHANNEL_ID);
} else {
builder = new NotificationCompat.Builder(MainActivity.this);
}
builder.setSmallIcon(R.drawable.ic_launcher_foreground)
.setContentTitle("제목")
.setContentText("내용")
.setDefaults(Notification.DEFAULT_SOUND | Notification.DEFAULT_VIBRATE)
.setPriority(NotificationCompat.PRIORITY_HIGH) // 헤드업 알림을 위한 우선순위 높음 설정
.setAutoCancel(true); // 알림 클릭시 지워지게 설정
NotificationManagerCompat notificationManagerCompat = NotificationManagerCompat.from(MainActivity.this);
notificationManagerCompat.notify(1, builder.build()); // ID가 다르면 개별 알림
}
});
코드의 setPriority 부분에 우선순위를 높음으로 설정해주어야 헤드업 알림이 사용된다.
또 제일 아래 코드 notificationManagerCompat.notify(1, builder.build());
이 부분의 1은 알림의 ID값을 설정하는 부분인데 만약 ID값이 같은 알림이라면 중복되지 않고 업데이트되는 형식으로 알림이 전송되며, ID 값이 다르다면 같은 앱이라도 두 개의 다른 알림이 띄워지게 된다.
5. 완성된 화면
6. 알림에 정보 넣기
알림에 특정한 정보를 담고 그 정보를 바탕으로 무언가 실행시키고 싶다면 PendingIntent를 사용해야 한다.
아래 코드는 알림을 누르면 MainActivity를 실행시키고 INFO에 "정보 넣기" 라는 정보를 담아 주었다.
Intent intent = new Intent(MainActivity.this, MainActivity.class); // MainActivity 켜기
intent.putExtra("INFO", "정보 넣기");
PendingIntent pendingIntent = PendingIntent.getActivity(MainActivity.this, 0, intent, PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_UPDATE_CURRENT);
builder.setSmallIcon(R.drawable.ic_launcher_foreground)
.setContentTitle("제목")
.setContentText("내용")
.setContentIntent(pendingIntent) // 알림 눌렀을 때 행동을 설정
.setDefaults(Notification.DEFAULT_SOUND | Notification.DEFAULT_VIBRATE)
.setPriority(NotificationCompat.PRIORITY_HIGH) // 헤드업 알림을 위한 우선순위 높음 설정
.setAutoCancel(true); // 알림 클릭시 지워지게 설정
String info = getIntent().getStringExtra("INFO");
if (info != null) {
Log.e("===== 알림 정보 =====", info);
}
알림을 생성해둔 채 앱을 완전히 종료하고 알림을 눌러 앱을 실행시키면 로그에서 해당 intent를 확인할 수 있다.
만약 앱이 실행된 상태에서 알림의 intent를 받고 싶다면
아래와 같이 AndroidManifest에서 launchMode를 singleTask로 설정해서 앱이 실행 중일 때 알림을 눌러 같은 액티비티가 중복으로 실행되는 것을 방지해두고
<activity
android:name=".MainActivity"
android:launchMode="singleTask"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
아래와 같이 onNewIntent를 Override 해서 바뀐 intent를 감지해서 사용하면 된다.
이렇게 설정해두면 이미 앱이 실행 중 일 때 알림을 눌렀을 때도 로그에 알림 정보가 찍히는 것을 확인할 수 있다.
이를 활용해서 알림이 왔을 때 특정 액티비티나 프래그먼트, 페이지 등으로 보내는 역할을 수행할 수 있을 것이다.
@Override
protected void onNewIntent(Intent intent) {
String info = intent.getStringExtra("INFO");
if (info != null) {
Log.e("===== 알림 정보 =====", info);
}
}
7. MainActivity 전체 코드
package com.example.myapplication;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.NotificationCompat;
import androidx.core.app.NotificationManagerCompat;
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
Button button;
NotificationManager notificationManager;
String CHANNEL_ID = "YOUR_CHANNEL_ID";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = (Button) findViewById(R.id.button);
String info = getIntent().getStringExtra("INFO");
if (info != null) {
Log.e("===== 알림 정보 =====", info);
}
notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
// 버전이 오레오보다 높으면 채널 생성
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationChannel channel = new NotificationChannel(CHANNEL_ID, "NAME", NotificationManager.IMPORTANCE_HIGH);
notificationManager.createNotificationChannel(channel);
}
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// 버전이 오레오보다 높고 낮을 때를 분리해서 builder 생성
NotificationCompat.Builder builder;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
builder = new NotificationCompat.Builder(MainActivity.this, CHANNEL_ID);
} else {
builder = new NotificationCompat.Builder(MainActivity.this);
}
Intent intent = new Intent(MainActivity.this, MainActivity.class); // MainActivity 켜기
intent.putExtra("INFO", "정보 넣기");
PendingIntent pendingIntent = PendingIntent.getActivity(MainActivity.this, 0, intent, PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_UPDATE_CURRENT);
builder.setSmallIcon(R.drawable.ic_launcher_foreground)
.setContentTitle("제목")
.setContentText("내용")
.setContentIntent(pendingIntent) // 알림 눌렀을 때 행동을 설정
.setDefaults(Notification.DEFAULT_SOUND | Notification.DEFAULT_VIBRATE)
.setPriority(NotificationCompat.PRIORITY_HIGH) // 헤드업 알림을 위한 우선순위 높음 설정
.setAutoCancel(true); // 알림 클릭시 지워지게 설정
NotificationManagerCompat notificationManagerCompat = NotificationManagerCompat.from(MainActivity.this);
notificationManagerCompat.notify(1, builder.build()); // ID가 다르면 개별 알림
}
});
}
@Override
protected void onNewIntent(Intent intent) {
String info = intent.getStringExtra("INFO");
if (info != null) {
Log.e("===== 알림 정보 =====", info);
}
super.onNewIntent(intent);
}
}
간단한 기능인데도 막상 구현하려고 하니 막히는 부분이 생겨서 시간이 좀 걸렸는데
글 작성을 위해 다시 프로젝트를 생성하고 코드를 구성해보면서 다시 복습을 하니 완벽히 이해가 되어서 좋았다.
이 글을 참고해서 다른 분들은 시간을 많이 절약하셨으면 좋겠다.
'Mobile > Android' 카테고리의 다른 글
Android Studio Bumblebee 에서 Firebase 연동하기 (0) | 2022.03.29 |
---|