1. Action
알림(Notification)에는 버튼(Action)을 추가할 수 있고, 여러가지 이벤트를 추가하여 간편하게 사용할 수 있다.
Intent readPushIntent = new Intent(context, ActionPushReceiver.class);
readPushIntent.setAction("ReadPushIntent");
readPushIntent.putExtra("notificationId", notificationId);
PendingIntent readPushPendingIntent = null;
if (android.os.Build.VERSION.SDK_INT >= 31) {
readPushPendingIntent = PendingIntent.getBroadcast(context, 0, readPushIntent, PendingIntent.FLAG_MUTABLE);
} else {
readPushPendingIntent = PendingIntent.getBroadcast(context, 0, readPushIntent, PendingIntent.FLAG_UPDATE_CURRENT);
}
mCompatBuilder.addAction(R.drawable.notibar_chat,context.getString(R.string.read_button) ,readPushPendingIntent);
CompatBuilder에 addAction()으로 넣어주면 된다. addAction에는 순서대로 아이콘, 버튼이름, PendingIntent를 넣어주면 되는데 PendingIntent는 꼭 안드로이드 12기준으로 MUTABLE을 분기처리 해주도록 하자. Icon이 햇갈릴 수 있는데 setSmallIcon은 상단바에 있는 작은 아이콘이며, addAction은 버튼 아이콘인 점에서 차이가 있다. notificationId로 putExtra를 한 이유는 버튼 클릭시 해당 Notification을 바로 종료시키기 위함이다.
2. RemoteInput
알림(Notification)에는 버튼(Action)을 추가하여 버튼 클릭시 텍스트를 전송할 수 있게 텍스트 박스가 생성된다.
Intent replyPushIntent = new Intent(context, ActionPushReceiver.class);
replyPushIntent.setAction("ReplyPushIntent");
replyPushIntent.putExtra("notificationId", notificationId);
PendingIntent readPushPendingIntent, replyPushPendingIntent = null;
if (android.os.Build.VERSION.SDK_INT >= 31) {
replyPushPendingIntent = PendingIntent.getBroadcast(context, 0, replyPushIntent, PendingIntent.FLAG_MUTABLE);
} else {
replyPushPendingIntent = PendingIntent.getBroadcast(context, 0, replyPushIntent, PendingIntent.FLAG_UPDATE_CURRENT);
}
RemoteInput remoteInput = new RemoteInput.Builder("replyText")
.setLabel(context.getString(R.string.lb075))
.build();
NotificationCompat.Action action = new NotificationCompat.Action.Builder(
R.drawable.notibar_chat,
context.getString(R.string.lb075),
replyPushPendingIntent
)
.addRemoteInput(remoteInput)
.build();
mCompatBuilder.addAction(action);
단순 버튼클릭 Action과는 차이가 있다. PendingIntent까지는 동일하게 구현되나 Action 추가 부분에서 RemoteInput을 사용한다. RemoteInput은 버튼 클릭시 텍스트를 입력하여 Intent를 전송할 수 있게 해준다. RemoteInput을 NotificationCompat.Action에 추가하여 해당 Action을 addAction()에 추가한다. 단순 버튼Action과의 차이점은 addAction에서 Icon, 버튼이름, PendingIntent를 넣어주는것이 아니라 NotificationCompat에 추가하여 Action만 넣어준다.
(1) AndroidManifest.xml
<receiver android:name="com.ucware.activity.ActionPushReceiver" android:exported="false">
<intent-filter>
<action android:name="ReadPushIntent" />
<action android:name="ReplyPushIntent" />
</intent-filter>
</receiver>
(2) ActionPushReceiver.class
public class ActionPushReceiver extends BroadcastReceiver {
private final static String TAG = ActionPushReceiver.class.getSimpleName();
@Override
public void onReceive(Context context, Intent intent) {
int notificationId = intent.getIntExtra("notificationId", 0);
if ("ReadPushIntent".equals(intent.getAction())) {
Log.d(TAG, "#### onReceive: ReadPushIntent");
//Todo
NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.cancel(notificationId);
}else if("ReplyPushIntent".equals(intent.getAction())){
Log.d(TAG, "#### onReceive: ReplyPushIntent");
Bundle remoteInput = RemoteInput.getResultsFromIntent(intent);
CharSequence replyText = remoteInput.getCharSequence("replyText");
//Todo
NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.cancel(notificationId);
}
}
}
AndroidManifest.xml에 receiver를 추가한뒤 실행시킬 ActionPushReceiver.class를 작성한다. notificationId는 해당 알림의 Id를 확인하여 버튼 클릭시 바로 알림을 종료시켜 주기 위함이다. 답장 클릭 후 텍스트 입력후 전송을 클릭하면 Intent와 비슷하게 RemoteInput으로 텍스트를 받아올 수 있다. getCharSequence()로 텍스트를 받아 사용하도록 하자.
'Android > Android Java' 카테고리의 다른 글
[Android Java] 사진, 동영상 촬영(ActivityResultLauncher, Scoped Storage) (0) | 2023.11.22 |
---|---|
[Android Java] Scoped Storage 대응 (1) | 2023.11.21 |
[Android Java] Notification (0) | 2023.11.09 |
[Android Java] Clipboard 사용하기 (0) | 2023.11.03 |
[Android Java] Shortcuts (1) | 2023.11.03 |