투케이2K

792. (Android/Java) [RemoteViews] NotificationCompat.DecoratedCustomViewStyle 사용해 커스텀 푸시 알림 표시 만들기 본문

Android

792. (Android/Java) [RemoteViews] NotificationCompat.DecoratedCustomViewStyle 사용해 커스텀 푸시 알림 표시 만들기

투케이2K 2024. 5. 8. 19:59

[개발 환경 설정]

개발 툴 : AndroidStudio

개발 언어 : Java / Kotlin

 

[layout >> view_custom_notification_small.xml 파일]

---------------------------------------------------------------------------------------
[layout >> view_custom_notification_small.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">

    <TextView
        android:id="@+id/notification_title"
        style="@style/TextAppearance.Compat.Notification.Title"
        android:layout_width="wrap_content"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:text="Small notification, showing only a title"
        android:textColor="#ff0000"/>

</LinearLayout>
---------------------------------------------------------------------------------------
 

[layout >> view_custom_notification_large.xml 파일]

---------------------------------------------------------------------------------------
[layout >> view_custom_notification_large.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="300dp"
    android:orientation="vertical">

    <TextView
        android:id="@+id/notification_title"
        style="@style/TextAppearance.Compat.Notification.Title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="Large notification, showing a title and a body."
        android:textColor="#ff0000"/>

    <TextView
        android:id="@+id/notification_body"
        style="@style/TextAppearance.Compat.Notification.Line2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="This is the body. The height is manually forced to 300dp."
        android:textColor="#0000ff"/>

</LinearLayout>
---------------------------------------------------------------------------------------
 

[JAVA 소스 코드 파일]

---------------------------------------------------------------------------------------
[JAVA 소스 코드 파일]
---------------------------------------------------------------------------------------

        // ---------------------------------------------------------------
        // [로직 처리 실시]
        // ---------------------------------------------------------------
        try {

            /**
             * -----------------------------------------------------
             * [요약 설명]
             * -----------------------------------------------------
             * 1. NotificationCompat.DecoratedCustomViewStyle : 커스텀 맞춤 레이아웃을 만들 때 사용합니다
             * -----------------------------------------------------
             * 2. NotificationCompat.DecoratedCustomViewStyle 적용을 위한 단계 :
             *
             * - NotificationCompat.Builder를 사용하여 기본 알림을 빌드합니다.
             * - setStyle()를 호출하여 NotificationCompat.DecoratedCustomViewStyle의 인스턴스를 전달합니다.
             * - 맞춤 레이아웃을 RemoteViews의 인스턴스로 확장합니다.
             * - setCustomContentView()를 호출하여 축소된 알림의 레이아웃을 설정합니다.
             * - 선택적으로 setCustomBigContentView()를 호출하여 확장된 알림의 다른 레이아웃을 설정합니다.
             * -----------------------------------------------------
             * 3. 커스텀 맞춤 레이아웃을 만들기 위해서는 사전 layout >> small , large 각 레이아웃 제작이 필요합니다
             * -----------------------------------------------------
             * 참고 사이트 :
             *
             * https://developer.android.com/develop/ui/views/notifications/custom-notification?hl=ko
             * -----------------------------------------------------
             * */


            // [NotificationManager 선언]
            NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);


            // [맞춤 알림에 사용할 레이아웃 가져오기]
            RemoteViews notificationLayout = new RemoteViews(getPackageName(), R.layout.view_custom_notification_small);
            RemoteViews notificationLayoutExpanded = new RemoteViews(getPackageName(), R.layout.view_custom_notification_large);
            
            notificationLayout.setTextViewText(R.id.notification_title, "[Title] : Hello Twok"); // [타이틀]
            
            notificationLayoutExpanded.setTextViewText(R.id.notification_title, "[Title] : Hello Twok"); // [타이틀]
            notificationLayoutExpanded.setTextViewText(R.id.notification_body, "[Body] : Notification Show"); // [메시지]


            // [알림 표시에 사용 될 채널 확인]
            int importance = NotificationManager.IMPORTANCE_HIGH; // [알림 중요도 설정 (알림바 표시)]
            int prior = NotificationCompat.PRIORITY_HIGH;
            String Noti_Channel_ID = "Hight_Noti_Setting"; // [알림 채널 아이디]
            String Noti_Channel_Group_ID = "Hight_Group_Setting"; // [알림 채널 그룹 아이디]

            NotificationChannel notificationChannel = null; // [알림 채널 설정]
            if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
                notificationChannel = new NotificationChannel(Noti_Channel_ID, Noti_Channel_Group_ID, importance);
                notificationChannel.setVibrationPattern(new long[]{ 0 }); // [알림 진동 발생안함 설정 > 동적으로 진동 메소드 발생 시킴]
                //notificationChannel.setVibrationPattern(new long[]{0, 300, 250, 300, 250, 300});
                notificationChannel.enableVibration(true); // [노티피케이션 진동 설정]
                //notificationChannel.setShowBadge(true); // 뱃지 카운트 실시 (디폴트 true)
                if (notificationManager.getNotificationChannel(Noti_Channel_ID) != null){ // [이미 만들어진 채널이 존재할 경우]
                    S_Log._W_("Notification :: 채널이 이미 존재합니다", null);
                }
                else {
                    S_Log._E_("Notification :: 채널이 없어서 만듭니다", null);
                    notificationManager.createNotificationChannel(notificationChannel); // [알림 채널 생성 실시]
                }
                notificationManager.createNotificationChannel(notificationChannel);
            }


            // [알림에 레이아웃 적용]
            Notification customNotification = new NotificationCompat.Builder(A_Intro.this, Noti_Channel_ID)
                    .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.white_app_default)) // [메시지 박스에 아이콘 표시]
                    .setSmallIcon(R.drawable.white_app_default) // [타이틀 창 부분에 화이트 아이콘]
                    .setColor(ContextCompat.getColor(this, R.color.black)) // [화이트 아이콘 색상 지정]
                    .setWhen(System.currentTimeMillis()) // [알림 표시 시간 설정]
                    .setShowWhen(true) // [푸시 알림 받은 시간 커스텀 설정 표시]
                    .setAutoCancel(true) // [알림 클릭 시 삭제 여부]
                    .setPriority(prior) // [알림 중요도 설정]
                    .setChannelId(Noti_Channel_ID) // [알림 채널 지정]

                    //.setContentTitle("[Title] : Hello Twok") // [주석] : [알림 제목] : [커스텀은 RemoteViews 에서 지정]
                    //.setContentText("[Body] : Notification Show") // [주석] : [알림 내용 지정] : [커스텀은 RemoteViews 에서 지정]

                    .setStyle(new NotificationCompat.DecoratedCustomViewStyle()) // TODO [커스텀 레이아웃 스타일 지정]
                    .setCustomContentView(notificationLayout)
                    .setCustomBigContentView(notificationLayoutExpanded)

                    .build();

            notificationManager.notify(666, customNotification);
        }
        catch (Exception e){
            e.printStackTrace();
        }

---------------------------------------------------------------------------------------
 

[결과 출력]


반응형
Comments