Computer >> 컴퓨터 >  >> 프로그래밍 >> Android

Android에서 알림이 표시 중인지 취소되었는지 확인하는 방법

이 글에서는 Android 앱에서 특정 알림이 현재 화면에 표시 중인지, 아니면 사용자가 삭제(취소)했는지 확인하는 방법을 단계별 예제와 함께 소개합니다.

동작 원리

알림의 표시 여부를 확인하는 핵심은 PendingIntent입니다. 알림을 등록할 때 함께 생성해 둔 PendingIntent를 나중에 PendingIntent.FLAG_NO_CREATE 플래그로 다시 조회하는 방식입니다. 이 플래그는 일치하는 PendingIntent가 없을 경우 새로 만들지 않고 null을 반환하기 때문에, 조회 결과가 null인지 여부만으로 해당 알림이 여전히 활성 상태인지 판단할 수 있습니다.

1단계 — 새 프로젝트 생성

Android Studio에서 File ⇒ New Project 메뉴로 이동한 뒤, 새 프로젝트 생성에 필요한 정보를 모두 입력하여 프로젝트를 만듭니다.

2단계 — 레이아웃 작성

res/layout/activity_main.xml 파일에 아래 코드를 추가합니다. 화면 중앙에 알림을 생성하는 버튼 하나를 배치하는 단순한 구성입니다.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:tools="https://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <Button
        android:onClick="createNotification"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:layout_margin="16dp"
        android:text="Create notification" />

</RelativeLayout>

3단계 — MainActivity 구현

src/MainActivity.java 파일에 아래 코드를 추가합니다.

package app.tutorialspoint.com.notifyme;

import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.NotificationCompat;
import android.support.v7.app.AppCompatActivity;
import android.view.View;

public class MainActivity extends AppCompatActivity {

   public static final String NOTIFICATION_CHANNEL_ID = "10001";
   private final static String default_notification_channel_id = "default";

   @Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      onNewIntent(getIntent());
   }

   public void createNotification(View view) {
      if (isNotificationVisible()) {
         NotificationManager mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
         NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(MainActivity.this, default_notification_channel_id);
         mBuilder.setContentTitle("Notify Me");
         mBuilder.setContentText("Something important!");
         mBuilder.setSmallIcon(R.drawable.ic_launcher_foreground);
         mBuilder.setAutoCancel(true);
         if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
            int importance = NotificationManager.IMPORTANCE_HIGH;
            NotificationChannel notificationChannel = new NotificationChannel(NOTIFICATION_CHANNEL_ID, "NOTIFICATION_CHANNEL_NAME", importance);
            mBuilder.setChannelId(NOTIFICATION_CHANNEL_ID);
            assert mNotificationManager != null;
            mNotificationManager.createNotificationChannel(notificationChannel);
         }
         assert mNotificationManager != null;
         mNotificationManager.notify((int) System.currentTimeMillis(), mBuilder.build());
      }
   }

   private boolean isNotificationVisible() {
      Intent notificationIntent = new Intent(MainActivity.this, MainActivity.class);
      PendingIntent test = PendingIntent.getActivity(MainActivity.this, 123, notificationIntent, PendingIntent.FLAG_NO_CREATE);
      return test != null;
   }
}

주목할 부분은 isNotificationVisible() 메서드입니다. 요청 코드 123과 함께 FLAG_NO_CREATE 플래그로 PendingIntent를 조회하여, 결과가 null이 아니면 해당 알림이 아직 표시 중이라고 판단합니다.

4단계 — 매니페스트 설정

AndroidManifest.xml 파일에 아래 코드를 추가합니다.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
    package="app.tutorialspoint.com.notifyme">

    <uses-permission android:name="android.permission.VIBRATE" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        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>

    </application>
</manifest>

앱 실행하기

이제 애플리케이션을 실행해 보겠습니다. 실제 Android 기기를 컴퓨터에 연결했다고 가정합니다. Android Studio에서 프로젝트의 액티비티 파일 중 하나를 연 뒤, 툴바의 Android에서 알림이 표시 중인지 취소되었는지 확인하는 방법 Run 아이콘을 클릭하세요. 목록에서 본인의 모바일 기기를 선택하면 기기 화면에 기본 화면이 표시됩니다.

버튼을 눌러 알림을 생성한 후, 알림을 스와이프로 삭제하거나 그대로 두면서 isNotificationVisible()의 반환값 변화를 확인해 보면 알림 상태 추적이 어떻게 동작하는지 명확하게 이해할 수 있습니다.

참고: 위 예제는 안드로이드 서포트 라이브러리(android.support.*) 기준으로 작성되었습니다. 최신 프로젝트에서는 AndroidX(androidx.core.app.NotificationCompat, androidx.appcompat.app.AppCompatActivity)로 임포트를 교체해 사용하세요. 또한 Android 13(API 33) 이상에서는 알림 권한(POST_NOTIFICATIONS)을 런타임에 요청해야 한다는 점도 유의하시기 바랍니다.