Как открыть страницу фрагмента из уведомления, не взаимодействуя с MainActivity? - PullRequest
0 голосов
/ 29 марта 2019

Я написал код для создания уведомления.

Мне бы хотелось, чтобы уведомление открывало класс фрагмента с именем «StepsFragment».

Однако, когда я нажимаю на уведомление, ничего не происходит. В чем может быть проблема здесь?

Я перепробовал следующие решения по переполнению стека:

Получите уведомление о проблеме и откройте фрагмент

Как открыть текущий фрагмент из уведомления?

Открыть фрагмент диалога из дочернего фрагмента из Уведомления

Они привели к тому, что я столкнулся с синтаксическими ошибками, и в результате я не смог построить свой проект.

Это код, который я использовал для открытия фрагмента из уведомления.

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        String input = intent.getStringExtra("inputExtra");

        Intent notificationIntent = new Intent(this, StepsFragment.class);
        PendingIntent pendingIntent = PendingIntent.getActivity(this,0,notificationIntent,0);

        Notification notification = new NotificationCompat.Builder(this, CHANNEL_ID)
                .setContentTitle("Steps Tracker")
                .setContentText("Steps tracked : " + input )
                .setSmallIcon(R.drawable.steps)
                .setContentIntent(pendingIntent)
                .build();
        startForeground(1,notification);

        return START_NOT_STICKY;
    }

Как открыть уведомление, чтобы оно переместилось в StepsFragment вместо того, чтобы ничего не делать, когда я нажимаю на уведомление?

Ответы [ 2 ]

0 голосов
/ 29 марта 2019

Это код, который я использовал для открытия класса fragment при нажатии на уведомление.

Отмечено: Вам нужно вызвать Activity для вызова вашего класса фрагмента.

class MyFirebaseMessagingService : FirebaseMessagingService() {
    val TAG = "FirebaseService"

    // will run when app is running foreground
    override fun onMessageReceived(remoteMessage: RemoteMessage) {

        if (remoteMessage.data.size > 0) {
            showNotification(remoteMessage.notification?.title, remoteMessage.notification?.body, remoteMessage.data)
        }
    }

    private fun showNotification(title: String?, body: String?, data: Map<String?, String>) {

        val now = Date()
        val id = Integer.parseInt(SimpleDateFormat("ddHHmmss", Locale.US).format(now))

        val intent = Intent(this, MainActivity::class.java)
        intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP or Intent.FLAG_ACTIVITY_NEW_TASK)
        val pendingIntent = PendingIntent.getActivity(
            this, id, intent,
            PendingIntent.FLAG_ONE_SHOT
        )

        val soundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)
        val notificationBuilder = NotificationCompat.Builder(this)
            .setSmallIcon(R.mipmap.ic_launcher)
            .setContentTitle(title)
            .setContentText(body)
            .setAutoCancel(true)
            .setSound(soundUri)
            .setPriority(Notification.PRIORITY_HIGH)
            .setContentIntent(pendingIntent)
            .setChannelId("xxx")

        .....

        val notification = notificationBuilder.build()
        notificationManager.notify(id, notification)

    }
}

В MainActivtiy, переопределить onNewIntent функция

override fun onNewIntent(intent: Intent?) {
        super.onNewIntent(intent)
        receiveIntent(intent)
    }

Здесь функция receiveIntent

fun receiveIntent(intent: Intent?) {
      // open your fragment class here
   }
0 голосов
/ 29 марта 2019

Вы не можете открыть Fragment непосредственно из Intent - фрагменты прикреплены к Activity, поэтому вам нужно будет вызвать действие, которое затем будет содержать ваш фрагмент.

Есть несколько способов добиться этого. В качестве примера, вы можете переместить StepsFragment в свой Activity, а затем использовать Intent, чтобы вызвать Activity. Или вы можете добавить дополнительный элемент к Intent, вызвать MainActivity и использовать этот дополнительный элемент в своей активности в качестве подсказки, что он должен отображать только StepsFragment.

...