Служба Android, принимает только одну привязку от внешнего приложения? - PullRequest
0 голосов
/ 03 июля 2019

Введение

Я сейчас работаю в проекте 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")
        }
    }
}
...