gpt4 book ai didi

android - unbindService 会在 Android Studio 中自动清除通知图标吗?

转载 作者:行者123 更新时间:2023-12-04 08:51:21 33 4
gpt4 key购买 nike

以下代码来自 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)
}
}

最佳答案

没错,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()
}
}

关于android - unbindService 会在 Android Studio 中自动清除通知图标吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64086425/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com