handleMessage()
에서 액션 지정import android.app.Service
import android.content.Intent
import android.os.*
import android.util.Log
class MyService : Service() {
// 메신저 객체
private lateinit var messenger: Messenger
// 핸들러
inner class IncomingHandler : Handler() {
override fun handleMessage(msg: Message) {
// 클라이언트로부터 메시지를 받아 처리
when (msg.what) {
MSG_SAY_HELLO -> {
Log.d(TAG, "Hello from client!")
// 클라이언트에게 응답
val reply = Message.obtain(null, MSG_REPLY, 0, 0)
msg.replyTo.send(reply)
}
else -> super.handleMessage(msg)
}
}
}
override fun onBind(intent: Intent): IBinder {
// 메신저 객체 생성 및 핸들러 연결
messenger = Messenger(IncomingHandler())
// 메신저 객체의 바인더 반환
return messenger.binder
}
companion object {
const val MSG_SAY_HELLO = 1
const val MSG_REPLY = 2
const val TAG = "MyService"
}
}
import android.content.ComponentName
import android.content.Context
import android.content.Intent
import android.content.ServiceConnection
import android.os.*
import android.util.Log
import androidx.appcompat.app.AppCompatActivity
class MainActivity : AppCompatActivity() {
private var messenger: Messenger? = null
private var bound = false
// 서비스와 연결될 때 호출되는 콜백 객체
private val connection = object : ServiceConnection {
override fun onServiceConnected(name: ComponentName?, service: IBinder?) {
// 여기서 service는 onServiceConnected 메서드의 매개변수로 전달된 서비스의 IBinder 객체임!
// Messenger 객체 생성을 위해 서비스 (IBinder 타입) 넣어줌
messenger = Messenger(service)
bound = true
}
override fun onServiceDisconnected(name: ComponentName?) {
messenger = null
bound = false
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// bindService()로 호출하는건 똑같다!
val intent = Intent(this, MyService::class.java)
bindService(intent, connection, Context.BIND_AUTO_CREATE)
}
override fun onDestroy() {
super.onDestroy()
if (bound) {
unbindService(connection)
bound = false
}
}
// 메신저 사용준비 완료, 이 함수 액티비티에서 호출해서 쓰는것임.
fun sendMessage() {
if (!bound) return
val message = Message.obtain(null, MyService.MSG_SAY_HELLO, 0, 0)
message.replyTo = Messenger(ResponseHandler())
try {
messenger?.send(message)
} catch (e: RemoteException) {
Log.e(TAG, "Failed to send message", e)
}
}
inner class ResponseHandler : Handler() {
override fun handleMessage(msg: Message) {
when (msg.what) {
MyService.MSG_REPLY -> {
Log.d(TAG, "Received reply from service")
}
else -> super.handleMessage(msg)
}
}
}
companion object {
const val TAG = "MainActivity"
}
}
val sendMessageButton = findViewById<Button>(R.id.sendMessageButton)
sendMessageButton.setOnClickListener {
sendMessage()
}
.aidl 파일 작성
서비스 컴포넌트
🔎 차이점
- 서비스 컴포넌트 (Service Component):
주로 백그라운드에서 실행되는 작업을 처리하기 위해 사용됩니다. 예를 들어, 오디오 재생, 파일 다운로드, 네트워크 호출 등의 작업을 수행할 때 서비스가 사용될 수 있습니다.
주로 애플리케이션 구성 요소 간의 통신에 사용됩니다. 다른 컴포넌트 (예: 액티비티)가 서비스에 요청을 보내고, 서비스는 그 요청을 처리하고 결과를 반환합니다.- 콘텐트 프로바이더 (Content Provider):
데이터를 관리하고 다른 애플리케이션에 안전하게 액세스할 수 있도록 합니다. 이는 데이터를 공유하거나 다른 앱과의 상호 작용을 용이하게 합니다.
일반적으로 데이터베이스에 연결되어 있으며, CRUD (Create, Read, Update, Delete) 작업을 수행하여 데이터를 관리합니다. 예를 들어, 연락처, 사진, 동영상 등의 데이터를 저장하고 다른 앱과 공유할 수 있습니다.
콘텐트 프로바이더는 주로 데이터 액세스 및 공유를 위한 목적으로 사용됩니다.
참고한 블로그
https://velog.io/@jaeyunn_15/Android-Handler
https://velog.io/@chc0331/Messenger-Handler%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%84%9C%EB%B9%84%EC%8A%A4-IPC
https://bada744.tistory.com/134