DEV_EASY_NOTES Telegram 59
В прошлом посте разобрали ситуацию как подключить Service к компоненту, чтобы обмениваться данными. Для этого мы использовали наследник класса Binder.
Возникает вопрос, что теперь делать если этот компонент и сервис находятся в разных процессах? Варианта два: Messenger и AIDL.

☝️Для начала рассмотрим вариант с Messenger. По сути Messenger это некая обертка над Handler, которая позволяет принимать сообщения из других процессов. У Messenger довольно простое API, рассмотрим на примере. Для начала делаем сервис:

class CalculatorMessengerService : Service() {

class IncomingHandler(private val context: Context, looper: Looper) : Handler(looper) {
override fun handleMessage(msg: Message) {
when (msg.what) {
MSG_SAY_HELLO -> Toast.makeText(context, "hello", Toast.LENGTH_SHORT).show()
else -> super.handleMessage(msg)
}
}
}

override fun onBind(intent: Intent?): IBinder? {
val messenger = Messenger(IncomingHandler(this))
return messenger.binder
}
}


👉 Затем уже известный код в Activity:

val intent = Intent(this, CalculatorMessengerService::class.java)
bindService(intent, object : ServiceConnection {

override fun onServiceDisconnected(name: ComponentName?) = Unit

override fun onServiceConnected(name: ComponentName?, service: IBinder?) {
val messenger = Messenger(service)
val message = Message.obtain(null, MSG_SAY_HELLO, 0, 0)
messenger.send(message)
}
}, BIND_AUTO_CREATE)

На этом все 👐, теперь можно отправлять сообщения в другой сервис. На практике Messenger используют крайне редко, функционал довольно ограничен, да и построено все на коллбэках.

Если мы захотим, чтобы такой сервис еще и отвечал обратно, т.е отправлял сообщения нам, то на клиенте мы тоже должны создавать объект Messenger, который нужно будет передавать в каждом сообщении. И опять-таки, сообщения мы будем принимать через Handler, что означает, что мы можем принимать сообщения только на том потоке, где этот Handler создан. Если кто-то хочет примеров код, то го сюда и сюда.

Чувствуете муторная фигня ☹️, очень много действий нужно сделать, и все общение при этом асинхронное. Мы же хотим, чтобы общение происходило синхронно, чтобы вызывать функции на другом процессе, как будто они в нашем, без этих сообщений и коллбэков.

Для этого опускаемся еще на уровень ниже ⤵️.
👍10



tgoop.com/dev_easy_notes/59
Create:
Last Update:

В прошлом посте разобрали ситуацию как подключить Service к компоненту, чтобы обмениваться данными. Для этого мы использовали наследник класса Binder.
Возникает вопрос, что теперь делать если этот компонент и сервис находятся в разных процессах? Варианта два: Messenger и AIDL.

☝️Для начала рассмотрим вариант с Messenger. По сути Messenger это некая обертка над Handler, которая позволяет принимать сообщения из других процессов. У Messenger довольно простое API, рассмотрим на примере. Для начала делаем сервис:

class CalculatorMessengerService : Service() {

class IncomingHandler(private val context: Context, looper: Looper) : Handler(looper) {
override fun handleMessage(msg: Message) {
when (msg.what) {
MSG_SAY_HELLO -> Toast.makeText(context, "hello", Toast.LENGTH_SHORT).show()
else -> super.handleMessage(msg)
}
}
}

override fun onBind(intent: Intent?): IBinder? {
val messenger = Messenger(IncomingHandler(this))
return messenger.binder
}
}


👉 Затем уже известный код в Activity:

val intent = Intent(this, CalculatorMessengerService::class.java)
bindService(intent, object : ServiceConnection {

override fun onServiceDisconnected(name: ComponentName?) = Unit

override fun onServiceConnected(name: ComponentName?, service: IBinder?) {
val messenger = Messenger(service)
val message = Message.obtain(null, MSG_SAY_HELLO, 0, 0)
messenger.send(message)
}
}, BIND_AUTO_CREATE)

На этом все 👐, теперь можно отправлять сообщения в другой сервис. На практике Messenger используют крайне редко, функционал довольно ограничен, да и построено все на коллбэках.

Если мы захотим, чтобы такой сервис еще и отвечал обратно, т.е отправлял сообщения нам, то на клиенте мы тоже должны создавать объект Messenger, который нужно будет передавать в каждом сообщении. И опять-таки, сообщения мы будем принимать через Handler, что означает, что мы можем принимать сообщения только на том потоке, где этот Handler создан. Если кто-то хочет примеров код, то го сюда и сюда.

Чувствуете муторная фигня ☹️, очень много действий нужно сделать, и все общение при этом асинхронное. Мы же хотим, чтобы общение происходило синхронно, чтобы вызывать функции на другом процессе, как будто они в нашем, без этих сообщений и коллбэков.

Для этого опускаемся еще на уровень ниже ⤵️.

BY Dev Easy Notes


Share with your friend now:
tgoop.com/dev_easy_notes/59

View MORE
Open in Telegram


Telegram News

Date: |

Telegram offers a powerful toolset that allows businesses to create and manage channels, groups, and bots to broadcast messages, engage in conversations, and offer reliable customer support via bots. In the “Bear Market Screaming Therapy Group” on Telegram, members are only allowed to post voice notes of themselves screaming. Anything else will result in an instant ban from the group, which currently has about 75 members. Concise To delete a channel with over 1,000 subscribers, you need to contact user support The imprisonment came as Telegram said it was "surprised" by claims that privacy commissioner Ada Chung Lai-ling is seeking to block the messaging app due to doxxing content targeting police and politicians.
from us


Telegram Dev Easy Notes
FROM American