본문 바로가기
안드로이드 웹앱 콘테츠 개발자 양성(국비지원)/Android 화면 구성 기능(디자인- xml 과 java로 제어)

Android Studio(기능) Notification - 알림창 띄우기

by 차누감 2019. 10. 7.

오늘부터 시작하는 예제들은 OS 기능을 사용하는 예제들이다.

(Context에는 여러가지 기능을 사용할 수 있는 클래스들이 있다.)

[ .getSystemService(클래스명)을 사용하면 기능들을 불러올 수 있다. ]

 

참고사항

원래 LayoutInflater inflater= getLayoutInflater(); 도 getLayoutInflater()로쓸 수 없고, .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

 

하지만 자주 쓰는 것들은 get으로 그냥 바로 불러 올 수 있도록 해놓음.

 

<최종 화면>


◎Notification는 알림 메세지라고 보면 된다.

예) 문자가 오면 위에 알림창이 뜨는 것이다.

 

예제는 버튼을 누르면 알림창이 나오도록 해보자.

 

화면 구성

activity_main.xml 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="16dp"
    tools:context=".MainActivity">
 
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="show Notification"
        android:onClick="clickBtn"/>
</RelativeLayout>
 
 

MainActivity.java 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
 
 
import android.content.Context;
import android.graphics.BitmapFactory;
 
 
public class MainActivity extends AppCompatActivity {
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
 
    public void clickBtn(View view) {
 
        //알림(Notification)을 관리하는 관리자 객체를 운영체제(Context)로부터 소환하기
        NotificationManager notificationManager=(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
 
        //Notification 객체를 생성해주는 건축가객체 생성(AlertDialog 와 비슷)
        NotificationCompat.Builder builder= null;
 
        //Oreo 버전(API26 버전)이상에서는 알림시에 NotificationChannel 이라는 개념이 필수 구성요소가 됨.
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
 
            String channelID="channel_01"//알림채널 식별자
            String channelName="MyChannel01"//알림채널의 이름(별명)
 
            //알림채널 객체 만들기
            NotificationChannel channel= new NotificationChannel(channelID,channelName,NotificationManager.IMPORTANCE_DEFAULT);
 
            //알림매니저에게 채널 객체의 생성을 요청
            notificationManager.createNotificationChannel(channel);
 
            //알림건축가 객체 생성
            builder=new NotificationCompat.Builder(this, channelID);
 
 
        }else{
            //알림 건축가 객체 생성
            builder= new NotificationCompat.Builder(thisnull);
        }
 
        //건축가에게 원하는 알림의 설정작업
        builder.setSmallIcon(android.R.drawable.ic_menu_view);
 
        //상태바를 드래그하여 아래로 내리면 보이는
        //알림창(확장 상태바)의 설정
        builder.setContentTitle("Title");//알림창 제목
        builder.setContentText("Messages....");//알림창 내용
        //알림창의 큰 이미지
        Bitmap bm= BitmapFactory.decodeResource(getResources(),R.drawable.gametitle_09);
        builder.setLargeIcon(bm);//매개변수가 Bitmap을 줘야한다.
 
        //건축가에게 알림 객체 생성하도록
        Notification notification=builder.build();
 
        //알림매니저에게 알림(Notify) 요청
        notificationManager.notify(1, notification);
 
        //알림 요청시에 사용한 번호를 알림제거 할 수 있음.
 
 
    }
}
 
 

<여기까지 실행 화면>

 

이제 알림창(앵그리버드)을 클릭시에 새로운 화면을 띄우자 [보통 여기서 메시지 창으로 가겠지만..]

 

먼저 새창을 만들자.

MainActivity.java에 코드를 추가하자.

 

여기서 메세지를 눌러서 확인했지만 위에 메세지 아이콘이 없어지지 않았다. 그것을 없애자.

이제 버튼을 눌렀을때, 알림창이 오고 알림음 효과를 넣어보자.

효과음을 넣을 raw폴더를 만든다.
get_gem.wav는 임의로 넣은 효과음 파일이다.
빨간 박스에 제일 위에 코드는 안드로이드에서 제공하는 효과음을 넣은 것이고, 다음 줄은 내가 추가한 효과음 파일을 넣은 것이다.

진동 효과도 넣어보자.

 

이렇게 하면 진동이 올 것이다.

 

그리고 알림창에 다른 기능을 넣자.

빨간 박스 마지막 줄이 색을 준것인데, 테스트 기기는 버전이 낮아서 적용이 안됐다..
more이나 setting을 누르면 Second 페이지가 뜨도록 했다. (원래는 다른 페이지를 넣겠지만...)

알림창에 큰 이미지를 넣어보자.

이제 알림창에 text를 넣어보자.

위와 같은 text를 넣는 방식인데, 줄바꿈 대신에 한줄 한줄 추가하는 방법

상태바 표시하기. 

activity_main.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="16dp"
tools:context=".MainActivity">
 
<Button
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="show Notification"
    android:onClick="clickBtn"/>
</RelativeLayout>
 

 

MainActivity.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
 
 
import android.content.Context;
import android.graphics.BitmapFactory;
 
 
public class MainActivity extends AppCompatActivity {
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
 
    public void clickBtn(View view) {
 
        //알림(Notification)을 관리하는 관리자 객체를 운영체제(Context)로부터 소환하기
        NotificationManager notificationManager=(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
 
        //Notification 객체를 생성해주는 건축가객체 생성(AlertDialog 와 비슷)
        NotificationCompat.Builder builder= null;
 
        //Oreo 버전(API26 버전)이상에서는 알림시에 NotificationChannel 이라는 개념이 필수 구성요소가 됨.
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
 
            String channelID="channel_01"//알림채널 식별자
            String channelName="MyChannel01"//알림채널의 이름(별명)
 
            //알림채널 객체 만들기
            NotificationChannel channel= new NotificationChannel(channelID,channelName,NotificationManager.IMPORTANCE_UNSPECIFIED);
 
            //알림매니저에게 채널 객체의 생성을 요청
            notificationManager.createNotificationChannel(channel);
 
            //알림건축가 객체 생성
            builder=new NotificationCompat.Builder(this, channelID);
 
 
        }else{
            //알림 건축가 객체 생성
            builder= new NotificationCompat.Builder(thisnull);
        }
 
        //건축가에게 원하는 알림의 설정작업
        builder.setSmallIcon(android.R.drawable.ic_dialog_email);
 
        //상태바를 드래그하여 아래로 내리면 보이는
        //알림창(확장 상태바)의 설정
        builder.setContentTitle("Title");//알림창 제목
        builder.setContentText("Messages....");//알림창 내용
        //알림창의 큰 이미지
        Bitmap bm= BitmapFactory.decodeResource(getResources(),R.drawable.gametitle_09);
        builder.setLargeIcon(bm);//매개변수가 Bitmap을 줘야한다.
 
        //알림창을 클릭시에 실행할 작업(SecondActivity 실행) 설정
        Intent intent= new Intent(this,SecondActivity.class);
        //지금 실행하는 것이 아니라 잠시 보류시키는 Intent 객체 필요
        PendingIntent pendingIntent= PendingIntent.getActivity(this0,intent,PendingIntent.FLAG_UPDATE_CURRENT);
        builder.setContentIntent(pendingIntent);
 
        //알림창 클릭시에 자동으로 알림제거
        builder.setAutoCancel(true);
 
        //그밖의 설정들...
 
        //알림 사운드 설정
        Uri soundUri= RingtoneManager.getActualDefaultRingtoneUri(this, RingtoneManager.TYPE_NOTIFICATION);
        soundUri=Uri.parse("android.resource://"+getPackageName()+"/"+R.raw.get_gem); //내가 가져온 음악파일을 넣어준다.
        builder.setSound(soundUri);
 
        //알림 진동 설정[진동은 반드시 퍼미션 추가 필요]
        builder.setVibrate(new long[]{0200010003000});// 0초 대기, 2초 진동, 1초 대기, 3초 진동
 
        //잘 사용하지 않는 그밖의 설정들...
        builder.addAction(android.R.drawable.ic_menu_more,"more", pendingIntent);
        builder.addAction(android.R.drawable.ic_menu_set_as,"setting", pendingIntent);
 
        builder.setColor(Color.MAGENTA);
 
        //요즘들어 종종 보이는 알림창 스타일
        //1. BigpictureStyle
        NotificationCompat.BigPictureStyle pictureStyle = new NotificationCompat.BigPictureStyle(builder);
        pictureStyle.bigPicture(BitmapFactory.decodeResource(getResources(), R.drawable.gametitle_09));
 
        //2. BigTextStyle
        NotificationCompat.BigTextStyle bigTextStyle=new NotificationCompat.BigTextStyle(builder);
        bigTextStyle.bigText("Hello. World\nNice to meet you.\n\n Good boy"); //줄바꿈은 안되는 폰도 있음.
 
        ///3. InboxStyle
        NotificationCompat.InboxStyle inboxStyle= new NotificationCompat.InboxStyle(builder);
        inboxStyle.addLine("first");
        inboxStyle.addLine("second");
        inboxStyle.addLine("hello--");
        inboxStyle.addLine("안녕하세요.");
 
        //상태표시줄 표시
        builder.setProgress(100,50true); //마지막을 false로 쓰면 게이지가 멈춰 있음.
 
        //건축가에게 알림 객체 생성하도록
        Notification notification=builder.build();
 
        //알림매니저에게 알림(Notify) 요청
        notificationManager.notify(1, notification);
 
        //알림 요청시에 사용한 번호를 알림제거 할 수 있음.
 
 
    }
}
 
 

AndroidMainifest.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?xml version="1.0" encoding="utf-8"?>
    package="com.lcw.ex60notification">
 
    <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=".SecondActivity"></activity>
        <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>
 

SecondActivity.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
 
 
public class SecondActivity extends AppCompatActivity {
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
 
        getSupportActionBar().setTitle("Second Activity");
    }
}
 
 

activity_second.xml

1
2
3
4
5
6
7
8
9
<?xml version="1.0" encoding="utf-8"?>
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".SecondActivity">
 
 
 

댓글