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

Android에서 알림 버튼 클릭 후 알림 패널을 자동으로 닫는 방법

이 튜토리얼에서는 Android에서 알림(Notification)을 탭했을 때 알림 패널이 자동으로 닫히도록 구현하는 방법을 단계별로 살펴봅니다.

핵심 원리

알림 패널을 닫는 핵심은 PendingIntent입니다. 알림에 PendingIntent를 설정하고, 해당 인텐트가 실행되어 액티비티가 화면 앞쪽으로 올라오면 시스템이 자동으로 알림 패널을 닫아줍니다. 이때 FLAG_ACTIVITY_CLEAR_TOPFLAG_ACTIVITY_SINGLE_TOP 플래그를 함께 사용하면 이미 실행 중인 액티비티 인스턴스를 재활용할 수 있어 더욱 효율적입니다.

1단계 — 새 프로젝트 생성

Android Studio에서 File ⇒ New Project를 선택하고, 필요한 모든 정보를 입력하여 새 프로젝트를 생성합니다.

2단계 — 레이아웃 작성

res/layout/activity_main.xml 파일에 다음 코드를 추가합니다.

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:app="https://schemas.android.com/apk/res-auto"
    xmlns:tools="https://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="16dp"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/btnCreateNotification"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:text="Create notification"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>

3단계 — MainActivity 작성

src/MainActivity.java 파일에 다음 코드를 추가합니다. 버튼을 클릭하면 알림이 생성되며, 알림에는 MainActivity를 여는 PendingIntent가 설정됩니다.

package app.tutorialspoint.com.notifyme;

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

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);
        Button btnCreateNotification = findViewById(R.id.btnCreateNotification);
        btnCreateNotification.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent notificationIntent = new Intent(MainActivity.this, MainActivity.class);
                notificationIntent.addCategory(Intent.CATEGORY_LAUNCHER);
                notificationIntent.setAction(Intent.ACTION_MAIN);
                notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
                PendingIntent resultIntent = PendingIntent.getActivity(MainActivity.this, 0, notificationIntent, 0);

                NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(MainActivity.this, default_notification_channel_id)
                        .setSmallIcon(R.drawable.ic_launcher_foreground)
                        .setContentTitle("Test")
                        .setContentIntent(resultIntent)
                        .setStyle(new NotificationCompat.InboxStyle())
                        .setContentText("Hello! This is my first push notification");

                NotificationManager mNotificationManager = (NotificationManager)
                        getSystemService(Context.NOTIFICATION_SERVICE);

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

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

    <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에서 프로젝트의 액티비티 파일 중 하나를 연 뒤 툴바의 실행(Run) 아이콘을 클릭하세요. 목록에서 사용 중인 모바일 기기를 선택하면, 기기 화면에 아래와 같은 기본 화면이 표시됩니다.

Android에서 알림 버튼 클릭 후 알림 패널을 자동으로 닫는 방법

버튼을 눌러 알림을 생성한 뒤, 알림 패널을 내려 해당 알림을 탭해 보세요. PendingIntent에 의해 MainActivity가 화면에 띄워지면서 알림 패널이 자동으로 닫히는 것을 확인할 수 있습니다.

참고 사항

이 예제는 이전 버전의 Support Library(android.support)를 기준으로 작성되었습니다. 최신 프로젝트에서는 AndroidX 라이브러리(androidx.appcompat.app.AppCompatActivity, androidx.core.app.NotificationCompat, androidx.constraintlayout.widget.ConstraintLayout 등)를 사용하는 것이 좋습니다. 또한 Android 12(API 31) 이상에서는 PendingIntent 생성 시 FLAG_IMMUTABLE 또는 FLAG_MUTABLE 플래그를 반드시 지정해야 하므로 참고하시기 바랍니다.