티스토리 뷰

How to use Notification



안드로이드 노티피케이션을 사용하는 방법에 대해서 알아보자


노티피케이션은 알림이다. 가장 위에서 스와이프로 내리면 빠른 설정 메뉴와 함께 알림 탭이 내려오는데, 이곳에 넣을 알림을 노티피케이션이라 한다. 사용자에게 UX적으로 좋은 효과를 줄 수 있기 때문에 어플리케이션을 만들 때, SNS 또는 쇼핑 등등 서버와 연계해서 서비스를 주기 위해서 라면, 꼭 필요한 UI라고 볼 수 있다.



만드는 방법 원문은 구글 개발자 가이드에서 확인 할 수 있다.


https://developer.android.com/guide/topics/ui/notifiers/notifications.html#CreateNotification




Notification 노티피케이션의 종류별로 어떻게 빌드하면 좋을지에 대해서 지금부터 알아보자



1.SimpleNotification 간단 알림


-진짜 그냥 간단하게 알림창 하나만 띄우는 것 



요로케 나온다.




2. Expanded Notification : 자동 확장이 가능한 노티피케이션






알림 받을 때, 밑으로 쭉쭉쭉 나오는 것이 알림이 겹치게 되면,






다시 이렇게 작아진다.


3.Custom Notification : 내가 원하는 모양의 레이아웃 XML을 넣어서 만드는 노티피케이션


귀찮아서 이건 따로 스샷은 안찍었지만 이것도 가능하다.





코드를 정리해보면 보틍은 버튼을 만들어서 눌러서 되도록 만들고


<MainActivity.java>

public class MainActivity extends AppCompatActivity {

public void bHandler(View v){
switch (v.getId()){
case R.id.basic:
showBasicNotification();
break;
case R.id.expanded:
showExpandedlayoutNotification();
break;
case R.id.custom:
showCustomLayoutNotification();
break;
default:
break;
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

}

/**
* 가장 기본적인 노티피케이션
*/
public void showBasicNotification() {
NotificationCompat.Builder mBuilder = createNotification();
mBuilder.setContentIntent(createPendingIntent());

NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.notify(1, mBuilder.build());
}

/**
* 알림창을 보는 상태에서 자동적으로 확장하는 노티피케이션
*/
public void showExpandedlayoutNotification() {

NotificationCompat.Builder mBuilder = createNotification();
NotificationCompat.InboxStyle inboxStyle =
new NotificationCompat.InboxStyle();
String[] events = new String[6];
events[0] = "Monday";
events[1] = "Tuesday";
events[2] = "Wedsnday";
events[3] = "Thursday";
events[4] = "Friday";
events[5] = "Saturday";
inboxStyle.setBigContentTitle("Event tracker details:");
inboxStyle.setSummaryText("Events summary");
NotificationCompat.Action action = new NotificationCompat.Action(R.mipmap.ic_launcher, "button1", createPendingIntent());
for (String str : events) {
inboxStyle.addLine(str);
}
//스타일 추가
mBuilder.setStyle(inboxStyle);
mBuilder.setContentIntent(createPendingIntent());

NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.notify(1, mBuilder.build());


}

/**
* XML로 직접만든 화면으로 보여주는 노티피케이션
*/
private void showCustomLayoutNotification(){
NotificationCompat.Builder mBuilder = createNotification();

//커스텀 화면 만들기
RemoteViews remoteViews = new RemoteViews(getPackageName(), R.layout.custom_notification);
remoteViews.setImageViewResource(R.id.img, R.mipmap.ic_launcher);
remoteViews.setTextViewText(R.id.title, "Title");
remoteViews.setTextViewText(R.id.message, "message");

//노티피케이션에 커스텀 뷰 장착
mBuilder.setContent(remoteViews);
mBuilder.setContentIntent(createPendingIntent());

NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.notify(1, mBuilder.build());

}

/**
* 노티피케이션을 누르면 실행되는 기능을 가져오는 노티피케이션
*
* 실제 기능을 추가하는 것
* @return
*/
private PendingIntent createPendingIntent(){
Intent resultIntent = new Intent(this, MainActivity.class);
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
stackBuilder.addParentStack(MainActivity.class);
stackBuilder.addNextIntent(resultIntent);

return stackBuilder.getPendingIntent(
0,
PendingIntent.FLAG_UPDATE_CURRENT
);
}

/**
* 노티피케이션 빌드
* @return
*/
private NotificationCompat.Builder createNotification(){
Bitmap icon = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher);
NotificationCompat.Builder builder = new NotificationCompat.Builder(this)
.setSmallIcon(R.mipmap.ic_launcher)
.setLargeIcon(icon)
.setContentTitle("StatusBar Title")
.setContentText("StatusBar subTitle")
.setSmallIcon(R.mipmap.ic_launcher/*스와이프 전 아이콘*/)
.setAutoCancel(true)
.setWhen(System.currentTimeMillis())
.setDefaults(Notification.DEFAULT_ALL);
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){
builder.setCategory(Notification.CATEGORY_MESSAGE)
.setPriority(Notification.PRIORITY_HIGH)
.setVisibility(Notification.VISIBILITY_PUBLIC);
}
return builder;
}


}



이렇게 3가지 방법이 있다.


<activity_main.xml>

<?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:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="salmon.notificatiionapp.MainActivity">

<Button
android:id="@+id/basic"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="bHandler"
android:text="basic" />

<Button
android:id="@+id/expanded"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="bHandler"
android:text="expanded"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true" />

<Button
android:id="@+id/custom"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="bHandler"
android:text="custom"
android:layout_alignParentTop="true"
android:layout_alignParentEnd="true" />
</RelativeLayout>



<custom_notification.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="match_parent"
android:orientation="horizontal">

<TextView
android:id="@+id/title"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="match_parent" />

<ImageView
android:id="@+id/img"
android:scaleType="centerInside"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="match_parent" />

<TextView
android:id="@+id/message"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="match_parent" />

</LinearLayout>