【问题标题】:Will unbindService clean Notification icon automatically in Android Studio?unbindService 会在 Android Studio 中自动清除通知图标吗?
【发布时间】:2020-09-27 08:28:41
【问题描述】:

以下代码来自project

我启动bindService()时会显示通知图标,没关系。

但是当我启动unbindService()时通知图标不会被清除,为什么?我在以下代码中找不到任何代码来清理通知图标。

MainActivity.kt

class MainActivity : AppCompatActivity(), View.OnClickListener {
    val mTAG = MainActivity::class.java.simpleName
    // Variable for storing instance of our service class
    var mService: MyBoundService? = null

    // Boolean to check if our activity is bound to service or not
    var mIsBound: Boolean? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        startServiceButton?.setOnClickListener(this)
        stopServiceButton?.setOnClickListener(this)
        startActivityButton?.setOnClickListener(this)
    }


    private val serviceConnection = object : ServiceConnection {
        override fun onServiceConnected(className: ComponentName, iBinder: IBinder) {
            Log.d(mTAG, "ServiceConnection: connected to service.")
            // We've bound to MyService, cast the IBinder and get MyBinder instance
            val binder = iBinder as MyBinder
            mService = binder.service
            mIsBound = true
            getRandomNumberFromService() // return a random number from the service
        }

        override fun onServiceDisconnected(arg0: ComponentName) {
            Log.d(mTAG, "ServiceConnection: disconnected from service.")
            mIsBound = false
        }
    }

    /**
     * Method for listening to random numbers generated by our service class
     */
    private fun getRandomNumberFromService() {
        mService?.randomNumberLiveData?.observe(this
                , Observer {
            resultTextView?.text = "Random number from service: $it"
        })
    }

    override fun onDestroy() {
        super.onDestroy()
        // Unbinding to the service class
        unbindService()
    }


    private fun bindService() {
        Intent(this, MyBoundService::class.java).also { intent ->
            bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE)
        }
    }


    private fun unbindService() {
        Intent(this, MyBoundService::class.java).also { intent ->
            unbindService(serviceConnection)
        }
    }

    override fun onClick(v: View?) {
        when (v?.id) {
            R.id.startServiceButton -> {
                bindService()
            }
            R.id.stopServiceButton -> {
                if (mIsBound == true) {
                    unbindService()
                    mIsBound = false
                }
            }
            R.id.startActivityButton -> {
                val intent = Intent(this, ResultActivity::class.java)
                startActivity(intent)
            }
        }
    }
}

MyBoundService.kt

class MyBoundService : Service() {
    ...

    override fun onBind(intent: Intent): IBinder? {
        return mBinder
    }

    override fun onCreate() {
        super.onCreate()
        Log.d("MyBoundService", "onCreate called")
        startNotification()

        Handler().postDelayed({
            val randomNumber = mGenerator.nextInt(100)
            randomNumberLiveData.postValue(randomNumber)
        }, 1000)
    }

  
    private fun startNotification() {
        val channel = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            NotificationChannel(
                    CHANNEL_ID,
                    "My Channel",
                    NotificationManager.IMPORTANCE_DEFAULT
            )
        } else {
            TODO("VERSION.SDK_INT < O")
        }
        (getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager).createNotificationChannel(channel)
        val notification: Notification = NotificationCompat.Builder(this, CHANNEL_ID)
                .setContentTitle("A service is running in the background")
                .setContentText("Generating random number").build()
        startForeground(1, notification)
    }
}

【问题讨论】:

    标签: android android-service


    【解决方案1】:

    没错,MyBoundService 的代码调用了startForeground(),它允许MyBoundService 继续运行,即使MainActivity 被销毁或不在前台,直到Android 操作系统决定停止MyBoundService比如释放内存。

    要停止MyBoundService 并删除通知,它需要调用stopForeground(true),然后调用stopSelf()。您可以通过添加以下示例代码来实现这一点:

    MainActivity.kt

        private fun unbindService() {
            Intent(this, MyBoundService::class.java).also { intent ->
                unbindService(serviceConnection)
                mService.stopForeground(true)
                mService.stopSelf()
            }
        }
    

    【讨论】:

    • @hellocw 的答案解决了您的问题吗?
    【解决方案2】:

    您正在启动前台服务

    请查看此链接What is the proper way to stop a service running as foreground

    另外,您可能需要查看Stopping a service

    【讨论】:

      猜你喜欢
      • 2021-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-04
      • 1970-01-01
      相关资源
      最近更新 更多