#android #kotlin #flutter #android-notifications
#Android #kotlin #флаттер #android-уведомления
Вопрос:
В настоящее время, когда пользователь получает уведомление, когда приложение flutter свернуто, и нажимает на уведомление, оно перенаправляет пользователя screen A
каждый раз. Но я хочу, чтобы пользователь заходил, скажем screen C
, через deeplink, который создается вручную. Кроме того, если пользователь сворачивает приложение с любого экрана, нажатие на уведомление переводит пользователя на этот экран. Но независимо от того, где пользователь сворачивает приложение или когда приложение находится в фоновом режиме, нажатие на уведомление должно перенаправлять пользователя screen C
всегда. Я не реализовывал уведомления ранее, поэтому я впервые сталкиваюсь с этой проблемой, поэтому ищу помощь в этом отношении. Код класса уведомлений ниже:
companion object {
const val CHAT_REQUEST_NOTIFICATION_ID = 1775
const val CHAT_CHANNEL_ID = "com.example.com.CHAT_CHANNEL_ID"
const val CHAT_CHANNEL_NAME = "Demo Notifications"
fun showChatNotification(context: Context, userName: String?, body: String?) {
createChatNotificationChannel(context);
val chatIntent = Intent();
val deeplink = generateDeepLink(userName);
chatIntent.setAction(Intent.ACTION_VIEW);
chatIntent.setData(Uri.parse(deeplink));
val chatPendingIntent = PendingIntent.getActivity(context, 100, chatIntent, PendingIntent.FLAG_ONE_SHOT)
val notification: Notification
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
notification = Notification.Builder(context, CHAT_CHANNEL_ID)
.setContentIntent(chatPendingIntent)
.setSmallIcon(R.drawable.notification_icon)
.setLargeIcon(BitmapFactory.decodeResource(context.resources, R.drawable.ic_app_icon))
.setAutoCancel(true)
.setContentTitle("Message")
.setContentText(body)
.setOngoing(false)
.setVisibility(Notification.VISIBILITY_PUBLIC)
.build()
} else {
notification = Notification.Builder(context)
.setContentIntent(chatPendingIntent)
.setSmallIcon(android.R.drawable.btn_star)
.setLargeIcon(BitmapFactory.decodeResource(context.resources, R.mipmap.app_icon))
.setAutoCancel(true)
.setVibrate(chatVibrationPattern)
.setVisibility(Notification.VISIBILITY_PUBLIC)
.setContentTitle("Message")
.setOngoing(false)
.setContentText(body)
.build()
}
val manager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
manager.notify(CHAT_REQUEST_NOTIFICATION_ID, notification)
}
fun generateDeepLink(userId: String?): String {
return "https://demo.page.link/?link=https://demo.com/chat?user=$userIdamp;apn=com.example.comamp;efr=1";
}
private fun createChatNotificationChannel(context: Context) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val notificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
notificationManager.deleteNotificationChannel(CHAT_CHANNEL_ID)
val importance = NotificationManager.IMPORTANCE_HIGH
val notificationChannel = NotificationChannel(CHAT_CHANNEL_ID, CHAT_CHANNEL_NAME, importance)
notificationChannel.description = "Message"
notificationChannel.lockscreenVisibility = Notification.VISIBILITY_PUBLIC
notificationManager.createNotificationChannel(notificationChannel)
}
}
}
Я использую эмуляторы Android (6.0).
Ответ №1:
@Dk15 Вы делаете правильную работу, что вам нужно сделать для конкретного перенаправления, отправьте событие в свои данные с сервера, например, при создании уведомления отправьте событие типа JOB_ACCEPTED, чтобы вы могли проверить свое при создании
if (getIntent().getExtras() != null)
затем перенаправьте на оператор switch и проверьте, какое событие вы получили, а затем перенаправьте пользователя, куда бы вы ни захотели
switch (getIntent().getStringExtra("EVENT_TYPE")){
Match your case here and redirect user in your case to SCREEN C
case "JOB_ACCEPTED":
OPEN SCREEN C;
break;
}
Ответ №2:
Попробуйте это:
/**Creates an explicit intent for an Activity in your app**/
Intent resultIntent = new Intent(mContext , SomeOtherActivity.class);
resultIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
PendingIntent resultPendingIntent = PendingIntent.getActivity(mContext,
0 /* Request code */, resultIntent,
PendingIntent.FLAG_UPDATE_CURRENT);
mBuilder = new NotificationCompat.Builder(mContext);
mBuilder.setSmallIcon(R.mipmap.ic_launcher);
mBuilder.setContentTitle(title)
.setContentText(message)
.setAutoCancel(false)
.setSound(Settings.System.DEFAULT_NOTIFICATION_URI)
.setContentIntent(resultPendingIntent);
mNotificationManager = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O)
{
int importance = NotificationManager.IMPORTANCE_HIGH;
NotificationChannel notificationChannel = new NotificationChannel(NOTIFICATION_CHANNEL_ID, "NOTIFICATION_CHANNEL_NAME", importance);
notificationChannel.enableLights(true);
notificationChannel.setLightColor(Color.RED);
notificationChannel.enableVibration(true);
notificationChannel.setVibrationPattern(new long[]{100, 200, 300, 400, 500, 400, 300, 200, 400});
assert mNotificationManager != null;
mBuilder.setChannelId(NOTIFICATION_CHANNEL_ID);
mNotificationManager.createNotificationChannel(notificationChannel);
}
assert mNotificationManager != null;
mNotificationManager.notify(0 /* Request Code */, mBuilder.build());
}