Как открыть определенный экран после нажатия на уведомление?

#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());
}
 

Ответ №3:

Я не обнаружил, что у вас есть упоминание активности, которую вы хотите открыть.

значение resultIntent = Намерение (это, ResultActivity::class.java )

Следуйте этому шаг за шагом, и вы получите свой ответ.

или вы можете попробовать это