인코딩의 Decoding

728x90
반응형

Notification은 어플이 foregorund에서 실행 상태가 아니여도 사용자에게 정보를 제공할 수 있는 ui 형태입니다.

  • Notification은 주로 status bar에 나타난다.
  • SDK 26(Android 8.0) 버전 이후로는 Notification을 Notification Channel 별로 관리해야 한다.
  • SDK 26(Android 8.0) 버전 이후로 앱 아이콘 위에 배지 형태로도 Notification이 표시된다.

참고 - status bar란

상위에 빨간 색으로 표시된 부분이 status bar입니다.

 

이번 글에서는 기본 notification을 생성해보겠습니다.

 

1. project 생성

Empty Activity 선택
Name은 Notification으로 / package name은 나중에 사용할지 모르니 봐두기

 

2. 화면 구성

project가 생성되면 res > layout > activity_main.xml 열기
기존에 있던 TextView를 지우고 다음과 같이 Button 생성

 

3. NotificationChannel 생성

 

API 26버전 이후로는 Notification을 채널 별로 관리해야한다 ( 이전에는 App 단위로 운영, 지금은 App 하위에 Channel이 존재)

--> Channel을 생성하고 채널 안에 Notification을 생성해야 Notification을 사용할 수 있다.

 

java > MainActivity.java 열기

onCreate() 상단에 다음과 같은 변수 생성

 

- 변수 PRIMAY_CHANNEL_ID는 CHANNEL을 구분하기 위한 ID이다 (고유값을 생성해 준 것 String에 의미가 있지는 않음)

- Notification을 생성 및 전달할때 NotificationManager가 필요해서 변수 생성.

 

onCreate() 하단에 다음과 같이 Channel을 생성해주는 메소드 정의

 

4. Notification Builder 생성

 

Channel을 만든 뒤에는 Builder를 생성해야 한다.

Builder의 역할 - Notification을 생성해준다.( Notification을 생성할때 Notification.Compat class를 사용한다 - 규칙 )

 

우선 onCreate() 위에 생성할 Notification에 대한 ID 변수를 생성한다.(단순 구분값)
Notification에 사용할 이미지도 생성 

 

Android Studio 상위 메뉴에서 New > Image Asset 클릭하면 나오는 화면입니다. 

 

onCreate() 하위에 다음과 같이 Builder를 생성하는 메소드 정의

 

5. Button 정의 및 Notification 호출 하기

 

activity_main.xml에서 생성했던 Button에 대한 변수 생성

 

Button Inflate 및 onClickListener 정의

 

MainActivity onCreate() 메소드 안에 button을 정의(inflate) 하고 버튼에 대한 onClickListener을 정의

onClick 메소드 안에 버튼을 클릭 했을 때 동작이 들어간다.

setNotification은 아래에서 정의 할 예정

 

onCreate() 하위 적당한 곳에 sendNotification 메소드 정의

- getNotification으로 Builder 생성 -> NotificationManger로 Notification 전달(호출)

 

6. 결과

 

앱에서 버튼을 클릭한 경우 화면 상단에 Notification이 나타난다.

 

+

 

참고 소스

 

- 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/notify"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Notify Me!"
        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

 

package android.example.notification;

import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.NotificationCompat;

import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

    // Channel에 대한 id 생성
    private static final String PRIMARY_CHANNEL_ID = "primary_notification_channel";
    // Channel을 생성 및 전달해 줄 수 있는 Manager 생성
    private NotificationManager mNotificationManager;

    // Notification에 대한 ID 생성
    private static final int NOTIFICATION_ID = 0;

    // Notification을 호출할 button 변수
    private Button button_notify;

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

        button_notify = findViewById(R.id.notify);
        button_notify.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View view){
                sendNotification();
            }
        });
        createNotificationChannel();

    }

    //채널을 만드는 메소드
    public void createNotificationChannel()
    {
        //notification manager 생성
        mNotificationManager = (NotificationManager)
                getSystemService(NOTIFICATION_SERVICE);
                // 기기(device)의 SDK 버전 확인 ( SDK 26 버전 이상인지 - VERSION_CODES.O = 26)
                if(android.os.Build.VERSION.SDK_INT
                        >= android.os.Build.VERSION_CODES.O){
                    //Channel 정의 생성자( construct 이용 )
                    NotificationChannel notificationChannel = new NotificationChannel(PRIMARY_CHANNEL_ID
                            ,"Test Notification",mNotificationManager.IMPORTANCE_HIGH);
                    //Channel에 대한 기본 설정
                    notificationChannel.enableLights(true);
                    notificationChannel.setLightColor(Color.RED);
                    notificationChannel.enableVibration(true);
                    notificationChannel.setDescription("Notification from Mascot");
                    // Manager을 이용하여 Channel 생성
                    mNotificationManager.createNotificationChannel(notificationChannel);
                }

    }

    // Notification Builder를 만드는 메소드
    private NotificationCompat.Builder getNotificationBuilder() {
        NotificationCompat.Builder notifyBuilder = new NotificationCompat.Builder(this, PRIMARY_CHANNEL_ID)
                .setContentTitle("You've been notified!")
                .setContentText("This is your notification text.")
                .setSmallIcon(R.drawable.ic_android);
        return notifyBuilder;
    }

    // Notification을 보내는 메소드
    public void sendNotification(){
        // Builder 생성
        NotificationCompat.Builder notifyBuilder = getNotificationBuilder();
        // Manager를 통해 notification 디바이스로 전달
        mNotificationManager.notify(NOTIFICATION_ID,notifyBuilder.build());
    }
}

 

참고 - 'Android developer codelabs' https://codelabs.developers.google.com/codelabs/android-training-notifications

반응형

이 글을 공유합시다

facebook twitter googleplus kakaoTalk kakaostory naver band