상세 컨텐츠

본문 제목

[안드로이드] Notification 알림창에 댓글(Reply) 기능 추가

안드로이드

by aries574 2020. 12. 29. 15:51

본문


2020/12/28 - [안드로이드] - [안드로이드]Notification 알림창에 액션기능 추가하기


이번 시간에는 알림창에 reply(댓글) 기능을 넣어서 메시지를 화면에 보내보도록 하겠습니다.

알림창 아래에 reply 액션을 넣고 액션을 클릭하면 메시지를 입력할 수 있습니다.

메시지를 입력하고 보내면 화면에 메시지가 전송이 됩니다.


1. 메인화면 구현(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/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="알림 호출"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>


2. 메인기능 구현(MainActivity.java)


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

import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;

import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

public final String CHANNEL_ID = "my_notification_channel";
public static final int NOTIFICATION_ID = 101;

public static final String TEXT_REPLY = "text_reply";

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

Button notificationBtn = findViewById(R.id.button);
notificationBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
displayNotification(v);
}
});
}


//알림 설정
public void displayNotification(View v){

createNotificationChannel();

//MainActivity 설정
Intent mainIntent = new Intent(this, MainActivity.class);
mainIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TASK);
PendingIntent MainPendingIntent = PendingIntent.getActivity(this , 0, mainIntent, PendingIntent.FLAG_ONE_SHOT);


//알림설정
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID);
builder.setSmallIcon(R.drawable.ic_sms);
builder.setContentTitle("알림예제");
builder.setContentText("알림이 왔습니다.");
builder.setPriority(NotificationManagerCompat.IMPORTANCE_DEFAULT);
builder.setAutoCancel(true);
builder.setContentIntent(MainPendingIntent);


//버전이 누가(7.0)이거나 누가보다 높으면
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N){

RemoteInput remoteInput = new RemoteInput.Builder(TEXT_REPLY).setLabel("Reply").build();

//인텐트 생성
Intent replyIntent = new Intent(this, RemoteRecevier.class);

//플래그 설정
replyIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);

//펜딩 인텐드 생성
PendingIntent replyPendingIntent = PendingIntent.getActivity(this, 0, replyIntent, PendingIntent.FLAG_ONE_SHOT);

//액션 설정
NotificationCompat.Action action = new NotificationCompat.Action.Builder(R.drawable.ic_sms, "Reply"
,replyPendingIntent).addRemoteInput(remoteInput).build();

//액션 추가
builder.addAction(action);
}


NotificationManagerCompat notificationManagerCompat = NotificationManagerCompat.from(this);
notificationManagerCompat.notify(NOTIFICATION_ID, builder.build());
}

//채널 셋팅
private void createNotificationChannel(){

//오레오부터는 알림을 채널에 등록해야 한다.

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
CharSequence name = "채널이름";
String description = "채널설명";
int importance = NotificationManager.IMPORTANCE_DEFAULT;

//채널생성
NotificationChannel notificationChannel = new NotificationChannel(CHANNEL_ID, name, importance);

notificationChannel.setDescription(description);

//알림매니저 생성
NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

//알림매니저에 채널등록록
notificationManager.createNotificationChannel(notificationChannel);
}
}
}


3. 댓글 액티비티 만들기

액티비티 이름은 RemoteReceiver 로 만들었습니다.


3-1 댓글 액티비티 화면구현(activity_remote_receiver.xml)

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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=".RemoteRecevier">

<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:textSize="30sp"
android:text="TextView" />
</RelativeLayout>


3-2 댓글 액티비티 코드구현(RemoteReceiver.java)


import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.RemoteInput;
import android.app.NotificationManager;
import android.os.Bundle;
import android.widget.TextView;

public class RemoteRecevier extends AppCompatActivity {

private TextView textView;

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

textView = findViewById(R.id.textView);

Bundle remoteReply = RemoteInput.getResultsFromIntent(getIntent());

if(remoteReply != null){

String message = remoteReply.getCharSequence(MainActivity.TEXT_REPLY).toString();
textView.setText(message);
}

NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
notificationManager.cancel(MainActivity.NOTIFICATION_ID);
}
}


4. 실행화면






반응형

관련글 더보기

댓글 영역