【问题标题】:How To Stop Notification From Popping Up On A Single Activity?如何停止在单个活动上弹出通知?
【发布时间】:2021-08-26 10:51:42
【问题描述】:

所以我正在构建一个具有一个活动 (MainActivity) 并使用片段运行该应用的应用。

我有一个在 MainActivity 中调用的通知。

当我点击通知时,它会将我带到特定的片段。

我遇到的问题是每次点击通知时都会显示通知。如何阻止此通知弹出?

这是我的 MainActivity

package com.main.netwallet

import android.app.NotificationChannel
import android.app.NotificationManager
import android.app.PendingIntent
import android.content.Context
import android.content.Intent
import android.content.SharedPreferences
import android.os.Build
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.view.Menu
import android.view.MenuItem
import android.view.View
import androidx.core.app.NotificationCompat
import androidx.core.app.NotificationManagerCompat
import androidx.databinding.DataBindingUtil
import androidx.drawerlayout.widget.DrawerLayout
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager
import androidx.fragment.app.FragmentTransaction
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProvider
import androidx.navigation.findNavController
import androidx.navigation.ui.NavigationUI
import androidx.navigation.ui.setupWithNavController
import com.google.android.material.bottomnavigation.BottomNavigationView
import com.google.android.material.floatingactionbutton.FloatingActionButton
import com.google.android.material.navigation.NavigationView
import com.main.netwallet.addTransaction.AddTransactionFragment
import com.main.netwallet.database.NetWalletDatabase
import com.main.netwallet.databinding.FragmentReminderBinding
import com.main.netwallet.initialSetting.AddNewAccountFragment
import com.main.netwallet.reminder.ReminderFragementViewModel
import com.main.netwallet.reminder.ReminderFragementViewModelFactory
import java.text.SimpleDateFormat
import java.util.*


class MainActivity : AppCompatActivity() {
    val PREF_KEY_EMAIL = "email preference"
    lateinit var sharedPreferenceEmail : SharedPreferences
    private lateinit var drawerID : DrawerLayout
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val navController = this.findNavController(R.id.navHostFragment)
        
        //add bottomNavigation
        val bottomNavigationView = findViewById<BottomNavigationView>(R.id.bn_main)
        val fab = findViewById<FloatingActionButton>(R.id.fab)

        fab.setOnClickListener {
            findNavController(R.id.navHostFragment).navigate(R.id.addTransactionFragment)
        }

        bottomNavigationView.setOnItemSelectedListener(mOnNavigationItemSelectedListener)

        /**
         * These lines of codes below to check destination changed
         */
        navController.addOnDestinationChangedListener { _, destination, _ ->
            if(destination.id == R.id.loginFragment){
                bottomNavigationView.visibility = View.GONE
                fab.visibility = View.GONE
            }else if(destination.id == R.id.registerFragment){
                bottomNavigationView.visibility = View.GONE
                fab.visibility = View.GONE
            }else if(destination.id == R.id.initialSettingFragment) {
                bottomNavigationView.visibility = View.GONE
                fab.visibility = View.GONE
            }else if(destination.id == R.id.addTransactionFragment){
                fab.visibility = View.GONE
            }else{
                bottomNavigationView.visibility = View.VISIBLE
                fab.visibility = View.VISIBLE
            }
        }

        sharedPreferenceEmail = getSharedPreferences(PREF_KEY_EMAIL, Context.MODE_PRIVATE)
        val getEmail = sharedPreferenceEmail.getString("email_preference", null)
        val application = requireNotNull(this).application
        val dataSource = NetWalletDatabase.getInstance(application).netWalletDatabaseDao
        val viewModelProvider = ReminderFragementViewModelFactory(dataSource, application, getEmail.toString())
        val viewModel = ViewModelProvider(this, viewModelProvider).get(ReminderFragementViewModel::class.java)

        viewModel.getReminderDate.observe(this, Observer { list->
           list?.let {
               for (i in 0..list.size -1) {
                   if (i >= 0){
                   val getReminderDate = list.get(0).getReminderDate
                   val todayDate: String =
                       SimpleDateFormat("dd/MM/yyyy", Locale.getDefault()).format(Date())
                    val compare = getReminderDate.equals(todayDate)

                   if (getReminderDate == todayDate) {
                       notif()
                       Log.e("Notif", getReminderDate)
                       Log.e("Notif", todayDate)
                       Log.e("Notif", compare.toString())
                   }
               }
               }
           }
        })

        val toNotifFragment = intent.getStringExtra("toNotifFragment")
        if (toNotifFragment.equals("NotifFragment")){
            findNavController(R.id.navHostFragment).navigate(R.id.transactionNotificationFragment)
        }

        Log.e("Activity", "Main Activity")
    }

    private val mOnNavigationItemSelectedListener = BottomNavigationView.OnNavigationItemSelectedListener { menuItem ->
        when(menuItem.itemId){
            R.id.logout -> {
                val intent = Intent(this, LogoutActivity::class.java)
                startActivity(intent)
                return@OnNavigationItemSelectedListener true
            }
            R.id.account ->{
                findNavController(R.id.navHostFragment).navigate(R.id.accountFragment)
                return@OnNavigationItemSelectedListener true
            }
            R.id.homeBottom ->{
                findNavController(R.id.navHostFragment).navigate(R.id.homeFragment)
                return@OnNavigationItemSelectedListener true
            }
            R.id.settingBottom ->{
                findNavController(R.id.navHostFragment).navigate(R.id.settingsFragment)
                return@OnNavigationItemSelectedListener true
            }
            else -> false
        }
    }

    fun notif(){
        createNotificationChannel()

        val intent = Intent(this, MainActivity::class.java)
            .putExtra("toNotifFragment", "NotifFragment")
            .apply {
            flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
        }
        val pendingIntent : PendingIntent = PendingIntent.getActivity(this,0, intent, 0)

        var notifBuilder = NotificationCompat.Builder(this, "CHANNEL_ID")
            .setSmallIcon(R.drawable.ic_baseline_notifications_24)
            .setContentTitle("Test Notification")
            .setContentText("This is sample notification")
            .setPriority(NotificationCompat.PRIORITY_DEFAULT)
            .setContentIntent(pendingIntent)
            .setAutoCancel(true)
            .build()

        with(NotificationManagerCompat.from(this)){
            notify(1, notifBuilder)
        }
    }

    private fun createNotificationChannel(){
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
            val name = getString(R.string.channel_name)
            val descriptionText = getString(R.string.channel_description)
            val importance = NotificationManager.IMPORTANCE_DEFAULT
            val channel = NotificationChannel("CHANNEL_ID",name,importance).apply {
                description = descriptionText
            }

            val notificationManager : NotificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
            notificationManager.createNotificationChannel(channel)
        }
    }
}

我很确定可行的解决方案是创建一个响应点击通知的活动。但在我这样做之前,我想知道是否有任何方法可以将其保存在单个 Activity 中

【问题讨论】:

    标签: android kotlin android-fragments android-notifications


    【解决方案1】:

    您正在寻找的是当活动未通过声明为通知ContentIntent 的待处理意图打开时显示通知。这可以通过将 notif() 方法调用移动到 if 子句的 else 语句来轻松完成:

    setContentView(R.layout.activity_main)
    
    val toNotifFragment = intent.getStringExtra("toNotifFragment")
    if (toNotifFragment.equals("NotifFragment")) {
        findNavController(R.id.navHostFragment).navigate(R.id.transactionNotificationFragment)
    } else notif()
    

    【讨论】:

    • 对不起,我没有完全分享代码,因为我认为它太长了。我已经更新了 MainActivity 的源代码。问题是,有一个过程可以从数据库中获取数据,即日期,并将其与今天的日期进行比较。如果相等,则显示通知。 pastebin.com/v5nk7G7W 因此,当我单击通知并将我带到作为 MainActivity 的一部分的 transactionNotificationFragment 时,只要数据库中的日期等于今天,通知就会始终显示。那么还有其他解决方案吗?我试过上面的代码,但没有用
    猜你喜欢
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多