Введение
Я сейчас работаю в проекте S , который претендует на создание службы Android, которая будет запущена в этом S проекте и из другого проекта B I хотите привязать к этой службе, работающей на S .
Я читал в официальной документации Сервис для Android , и я вижу, что сервис в Android поддерживает множественные соединения из разных клиентских приложений. Когда я запускаю службу на S и пытаюсь подключиться с B , все работает отлично, и я вижу в журнале S , что был вызван метод onBind
, Затем я закрываю B и вызывается метод onUnbind
, так что это идеально.
Первое наблюдение
Я создал другое приложение B1 для соединения со службой на S , и это моя проблема, потому что я извлекаю информацию, содержащуюся в намерении в onBind(intent: Intent?)
и onRebind(intent: Intent?)
, поэтому я заметил, что каждый раз, когда эти методы вызываются, информация в намерениях одинакова, даже если я закрываю B и открываюсь снова, или если я закрываю B и открыть B1 .
Второе наблюдение
Если я запускаю службу на S , а затем открываю B , если я открываю B1 , метод onBind
вызывается только когда я открываю B похоже на то, что S принимает только одно соединение.
Выводы
Мне нравится знать, что я оставляю что-то, чтобы понять о службе Android, или, возможно, у меня есть какая-то ошибка в моем коде ниже
MainActivity в S
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
startService(Intent(this, MyService::class.java))
}
}
MyService в S
class MyService: Service() {
override fun onBind(intent: Intent?): IBinder? {
Log.i("MyService", "***onBind ${intent?.extras?.get("applicationId")} : ${intent?.extras?.get("applicationToken")}")
return null
}
override fun onUnbind(intent: Intent?): Boolean {
Log.i("MyService", "***onUnbind ${intent?.extras?.get("applicationId")} : ${intent?.extras?.get("applicationToken")}")
return true
}
override fun onRebind(intent: Intent?) {
Log.i("MyService", "***onRebind ${intent?.extras?.get("applicationId")} : ${intent?.extras?.get("applicationToken")}")
}
}
MainActivity в B и B1
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
Log.i("MainActivity", "***onCreate ${BuildConfig.APPLICATION_ID}")
bindService(
Intent()
.putExtra("applicationId", BuildConfig.APPLICATION_ID)
.putExtra("applicationToken", UUID.randomUUID().toString())
.setComponent(
ComponentName(
"com.ec.zebra.service",
"com.ec.zebra.service.MyService"
)
),
mServiceConnection,
Context.BIND_AUTO_CREATE or Context.BIND_IMPORTANT)
}
private val mServiceConnection = object : ServiceConnection {
override fun onServiceConnected(cName: ComponentName, service: IBinder) {
Log.i("***", "onServiceConnected")
}
override fun onServiceDisconnected(cName: ComponentName) {
Log.i("***", "onServiceDisconnected")
}
}
}