Home > Software design >  Refresh activity from notification, without recreating it
Refresh activity from notification, without recreating it

Time:11-25

i am trying to implement notifications in my android application. when the user clicks on the notification i run the activity if it isn't already running .. but if the activity is already running i don't want to recreate it, i just want to refresh the data by intercepting the intent from the onNewIntent function. the problem is that every time I click on the notification, the activity is recreated, and the onNewIntent function is not called.

the problem occurs when I create the notification from a service. but when I create the notification from the same activity that I am going to run, everything works fine.

I searched the internet and tried all the solutions I found, but it still doesn't work

I tried several combinations of intent flags, but nothing works

this is my code

    val intent : Intent = Intent(this, HomeActivity::class.java)
    finalIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP)

    val pendingIntentFlags : Int = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S)
    {
        PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_MUTABLE
    }
    else
    {
        PendingIntent.FLAG_UPDATE_CURRENT
    }

    val pendingIntent : PendingIntent? = TaskStackBuilder.create(context).run {
        addNextIntentWithParentStack(finalIntent)
        getPendingIntent(0, pendingIntentFlags)
    }

    val notification = NotificationCompat.Builder(context, type.channelId)
        .setBadgeIconType(NotificationCompat.BADGE_ICON_SMALL)
        .setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
        .setPriority(NotificationCompat.PRIORITY_MAX)
        .setCategory(Notification.CATEGORY_SERVICE)
        .setDefaults(Notification.DEFAULT_ALL)
        .setAllowSystemGeneratedContextualActions(true)
        .setOnlyAlertOnce(true)
        .setAutoCancel(true)
        .setLocalOnly(true)
        .setOngoing(false)
        .setSilent(false)
        .setSmallIcon(R.drawable.icon_notification)
        .setContentIntent(pendingIntent)
        .build()

    notificationManager?.notify(NOTIFICATION_ID, notification)

CodePudding user response:

Let your notification send a broadcast. In your activity you should register a dynamic broadcast receiver. This will allow you to refresh the content in the activity without reloading it.

For the case that the activity is not running, you should define a broadcast receiver in the manifest which starts the activity. when your activity starts, disable the broadcast receiver and re-enable it when your activity stops.

CodePudding user response:

You can just set launch mode attribute to singleInstance in the manifest on your activity and start it with FLAG_ACTIVITY_NEW_TASK only.

  • Related