[ANDROID] μ„œλΉ„μŠ€μ™€ μ‹œμž‘ νƒ€μž… μ„œλΉ„μŠ€ κ΅¬ν˜„

μ„œλΉ„μŠ€ κ°œλ…


μ„œλΉ„μŠ€λž€?

μ•ˆλ“œλ‘œμ΄λ“œ 4λŒ€ μ»΄ν¬λ„ŒνŠΈ 쀑 ν•˜λ‚˜
μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ κ°œλ°œν•˜λ‹€ 보면 μ‚¬μš©μž μΈν„°νŽ˜μ΄μŠ€ 없이 λ°±κ·ΈλΌμš΄λ“œμ—μ„œ μ‹€ν–‰λ˜λŠ” λ™μž‘μ΄ ν•„μš”ν•œ κ²½μš°κ°€ 있음 
Ex) λ°°κ²½ μŒμ•… μž¬μƒ, νŠΉμ •ν•œ μ›Ή μ‚¬μ΄νŠΈμ—μ„œ 주기적으둜 데이터λ₯Ό μ½μ–΄μ˜€λŠ” 경우
이런 경우 μ‚¬μš©ν•˜λŠ” 것이 λ°”λ‘œ μ„œλΉ„μŠ€

 

μ„œλΉ„μŠ€μ˜ νŠΉμ§• 

  • μ•‘ν‹°λΉ„ν‹°μ™€λŠ” 달리, μ‚¬μš©μž μΈν„°νŽ˜μ΄μŠ€λ₯Ό 가지지 μ•ŠμŒ 
  • μ„œλΉ„μŠ€λŠ” 일반적으둜 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ— μ˜ν•΄ μ‹œμž‘λ¨ 
  • ν•œλ²ˆ μ‹œμž‘λœ μ„œλΉ„μŠ€λŠ” μ‚¬μš©μžκ°€ λ‹€λ₯Έ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μœΌλ‘œ μ΄λ™ν•˜λ”λΌλ„ λ°±κ·ΈλΌμš΄λ“œμ—μ„œ 계속 싀행됨 
  • λͺ¨λ“  μ• ν”Œλ¦¬μΌ€μ΄μ…˜ ꡬ성 μš”μ†Œκ°€ ν•΄λ‹Ή μ„œλΉ„μŠ€λ₯Ό μ‚¬μš©ν•  수 있음(심지어 λ³„λ„μ˜ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œλ„ μ‚¬μš© κ°€λŠ₯)
  • μ„œλΉ„μŠ€λ₯Ό μ΄μš©ν•˜λ©΄ IPC(ν”„λ‘œμ„ΈμŠ€ κ°„ 톡신) κΈ°λŠ₯도 κ΅¬ν˜„ν•  수 있음
  • λ„€νŠΈμ›Œν¬ νŠΈλžœμž­μ…˜, μŒμ•… μž¬μƒ, 파일 μž…μΆœλ ₯, μ½˜ν…νŠΈ μ œκ³΅μžμ™€μ˜ 톡신을 μœ„ν•΄ 주둜 μ‚¬μš©λ¨

 

μ„œλΉ„μŠ€μ™€ μΈν…νŠΈ

  • μ„œλΉ„μŠ€λ„ 앑티비티와 λ§ˆμ°¬κ°€μ§€λ‘œ μΈν…νŠΈ 객체λ₯Ό μ΄μš©ν•˜μ—¬ μ‹œμž‘ν•¨ 
  • μ–΄λ– ν•œ νƒ€μž…μ˜ μ„œλΉ„μŠ€λ“  μΈν…νŠΈ 객체λ₯Ό 톡해 μ‹œμž‘

 

μ„œλΉ„μŠ€μ™€ λ©”λ‹ˆνŽ˜μŠ€νŠΈ 파일

  • μ„œλΉ„μŠ€λŠ” λ©”λ‹ˆνŽ˜μŠ€νŠΈ 파일 μ•ˆμ— 곡용으둜 μ„ μ–Έλ˜μ–΄μ•Ό μ‚¬μš©μ΄ κ°€λŠ₯함
  • 만일  λ©”λ‹ˆνŽ˜μŠ€νŠΈ νŒŒμΌμ—μ„œ μ„œλΉ„μŠ€λ₯Ό μ „μš©μœΌλ‘œ μ„ μ–Έν•˜λ©΄ λ‹€λ₯Έ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œλŠ” κ·Έ μ„œλΉ„μŠ€μ— μ ‘κ·Ό λΆˆκ°€

 

μ„œλΉ„μŠ€μ˜ μ’…λ₯˜


μ‹œμž‘ νƒ€μž… μ„œλΉ„μŠ€

  • μ•‘ν‹°λΉ„ν‹°κ°€ startService()λ₯Ό ν˜ΈμΆœν•˜μ—¬ μ„œλΉ„μŠ€λ₯Ό μ‹œμž‘ν•˜λ©΄ μ‹œμž‘ νƒ€μž… μ„œλΉ„μŠ€κ°€ 됨
  • μ‹œμž‘ νƒ€μž… μ„œλΉ„μŠ€λŠ” ν•œλ²ˆ μ‹œμž‘λ˜λ©΄ λ°±κ·ΈλΌμš΄λ“œμ—μ„œ λ¬΄ν•œμ • 싀행될 수 있음
  • ν•˜μ§€λ§Œ 보톡 μžμ‹ μ΄ 맑은 처리λ₯Ό μ™„λ£Œν•˜λ©΄ 슀슀둜 μ†Œλ©Έλ¨
  • μ‹œμž‘ νƒ€μž… μ„œλΉ„μŠ€λŠ” ν˜ΈμΆœμžμ—κ²Œ κ²°κ³Όλ₯Ό λ°˜ν™˜ν•  수 μ—†μŒ 
  • Ex) λ„€νŠΈμ›Œν¬μ—μ„œ νŒŒμΌμ„ λ‹€μš΄λ‘œλ“œ ν•˜λŠ” κΈ°λŠ₯

 

λ°”μΈλ“œ μ„œλΉ„μŠ€

  • μ•‘ν‹°λΉ„ν‹°κ°€ bindService()λ₯Ό ν˜ΈμΆœν•˜μ—¬μ„œ μ„œλΉ„μŠ€λ₯Ό μ‹œμž‘ν•˜λ©΄ λ°”μΈλ“œ μ„œλΉ„μŠ€κ°€ 됨 
  • λ°”μΈλ“œ μ„œλΉ„μŠ€λŠ” ν΄λΌμ΄μ–ΈνŠΈ-μ„œλ²„ ꡬ쑰와 같이 λ™μž‘ν•¨ 
  • μ•‘ν‹°λΉ„ν‹°λŠ” μ„œλΉ„μŠ€μ— μ–΄λ– ν•œ μš”μ²­μ„ μ „μ†‘ν•˜κ³ , κ²°κ³Όλ₯Ό 응닡 받을 수 있음
  • μ΄λŸ¬ν•œ 이유둜 IPCμ—μ„œ μ‚¬μš©μ΄ κ°€λŠ₯함  
  • μ‹œμž‘ νƒ€μž… μ„œλΉ„μŠ€μ™€ λ‹€λ₯΄κ²Œ μ—°κ²°λœ μ•‘ν‹°λΉ„ν‹°κ°€ 사라지면, μ„œλΉ„μŠ€λ„ μ†Œλ©Έλ¨
  • ν•˜λ‚˜μ˜ μ„œλΉ„μŠ€μ—λŠ” λ‹€μˆ˜μ˜ μ•‘ν‹°λΉ„ν‹°κ°€ 연결될 수 있음

 

μ°Έκ³ ) μ‹œμž‘ νƒ€μž… μ„œλΉ„μŠ€μ˜ νŠΉμ§•λŒ€λ‘œ λ¬΄ν•œμ • μ‹€ν–‰λ˜λ©΄μ„œ, λ°”μΈλ“œ μ„œλΉ„μŠ€μ˜ νŠΉμ§•λŒ€λ‘œ λ°”μΈλ“œλ„ ν—ˆμš©ν•  수 있음 

 

μ„œλΉ„μŠ€μ™€ μŠ€λ ˆλ“œ


μ„œλΉ„μŠ€μ™€ μŠ€λ ˆλ“œλŠ” λΉ„μŠ·ν•œ 것 같은데?

  • μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μ’…λ£Œλ˜κ³ λ„ λ°±κ·ΈλΌμš΄λ“œμ—μ„œ μˆ˜ν–‰λ  수 μžˆλŠ”λ°?
  • μ„œλΉ„μŠ€λŠ” κ·Έμ € λ°±κ·ΈλΌμš΄λ“œμ—μ„œ 싀행될 수 μžˆλŠ” ꡬ성 μš”μ†Œμž„ 
  • λ§Œμ•½ μ‚¬μš©μžκ°€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜κ³Ό μƒν˜Έμž‘μš©ν•˜λŠ” λ™μ•ˆ κΈ°λ³Έ μŠ€λ ˆλ“œ λ°–μ—μ„œ μž‘μ—…μ„ μˆ˜ν–‰ν•΄μ•Ό ν•˜λŠ” 경우, μ„œλΉ„μŠ€ 내에 μƒˆ μŠ€λ ˆλ“œλ₯Ό 생성해야함
  • onCreate()μ•ˆμ— μŠ€λ ˆλ“œλ₯Ό μƒμ„±ν•˜κ³ , onStart()μ—μ„œ μ‹€ν–‰ν•˜κΈ° μ‹œμž‘ν•œ λ‹€μŒ, onStop()μ—μ„œ 쀑단할 것 

 

μ„œλΉ„μŠ€μ˜ κ΅¬ν˜„ 


μ„œλΉ„μŠ€λ₯Ό μƒμ„±ν•˜λ €λ©΄ Service의 ν•˜μœ„ 클래슀λ₯Ό 생성해야함
μ„œλΉ„μŠ€ 수λͺ… μ£ΌκΈ°λ₯Ό μ²˜λ¦¬ν•˜λŠ” 콜백 λ©”μ„œλ“œλ₯Ό μž¬μ •μ˜ν•΄μ•Όν•¨ 
μ„œλΉ„μŠ€μ— 바인딩할 ꡬ성 μš”μ†Œμ— λŒ€ν•œ λ§€μ»€λ‹ˆμ¦˜μ„ μ œκ³΅ν•΄μ•Ό 함

 

onStartCommand()

  • ꡬ성 μš”μ†Œκ°€ μ„œλΉ„μŠ€λ₯Ό μ‹œμž‘ν•˜λ„λ‘ μš”μ²­ν•˜λŠ” 경우 호좜됨  (startService()λ₯Ό 호좜 ν•œ 경우)
  • 이 λ©”μ„œλ“œκ°€ μ‹€ν–‰λ˜λ©΄ μ„œλΉ„μŠ€κ°€ μ‹œμž‘λ˜κ³  λ°±κ·ΈλΌμš΄λ“œμ—μ„œ λ¬΄ν•œνžˆ 싀행됨 
  • μ„œλΉ„μŠ€λ₯Ό μ€‘λ‹¨ν•˜λŠ” 것은 개발자의 μ±…μž„μ΄λ©°, stopSelf() λ˜λŠ” stopService()λ₯Ό ν˜ΈμΆœν•˜λ©΄ 됨
  • λ°”μΈλ“œ μ„œλΉ„μŠ€λ₯Ό μ œκ³΅ν•˜λ €λ©΄, 이 λ©”μ„œλ“œλ₯Ό κ΅¬ν˜„ν•˜μ§€ μ•Šμ•„λ„ 됨

 

onBind()

  • λ‹€λ₯Έ ꡬ성 μš”μ†Œκ°€ ν•΄λ‹Ή μ„œλΉ„μŠ€μ— λ°”μΈλ”©λ˜κ³ μž ν•˜λŠ” κ²½μš°μ— 호좜됨 (bindService()λ₯Ό 호좜 ν•œ 경우)
  • ν΄λΌμ΄μ–ΈνŠΈμ™€ μ„œλΉ„μŠ€μ™€ 톡신을 μ£Όκ³ λ°›κΈ° μœ„ν•΄ μ‚¬μš©ν•  μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ œκ³΅ν•΄μ•Ό 함 
  • μ΄λ•Œ IBinderλ₯Ό λ°˜ν™˜ν•˜λ©΄ 됨 
  • 바인딩을 ν—ˆμš©ν•˜μ§€ μ•ŠμœΌλ €λ©΄ null을 λ°˜ν™˜ν•˜λ©΄ 됨  

 

onCreate()

  • μ„œλΉ„μŠ€κ°€ 처음 μƒμ„±λ˜μ—ˆμ„ λ•Œ(즉 onStartCommand(),onBind()λ₯Ό ν˜ΈμΆœν•˜κΈ° μ „) ν˜ΈμΆœλ˜μ–΄ μΌνšŒμ„± μ„€μ • 절차λ₯Ό μˆ˜ν–‰
  • μ„œλΉ„μŠ€κ°€ 이미 싀행쀑인 경우, ν˜ΈμΆœλ˜μ§€ μ•ŠμŒ 

 

onDestroy()

  • μ„œλΉ„μŠ€λ₯Ό 더 이상 μ‚¬μš©ν•˜μ§€ μ•Šκ³  μ†Œλ©Έμ‹œν‚¬ λ•Œ 호좜됨 
  • μŠ€λ ˆλ“œ, λ“±λ‘λœ λ¦¬μŠ€λ„ˆ λ˜λŠ” μˆ˜μ‹ κΈ° λ“±μ˜ 각쒅 λ¦¬μ†ŒμŠ€λ₯Ό μ •λ¦¬ν•˜κΈ° μœ„ν•΄ 이것을 κ΅¬ν˜„ν•΄μ•Ό 함 
  • μ„œλΉ„μŠ€κ°€ μˆ˜μ‹ ν•˜λŠ” λ§ˆμ§€λ§‰ 호좜 

 

μ„œλΉ„μŠ€μ˜ μ„ μ–Έ 


  • <service> μš”μ†Œλ₯Ό <application> μš”μ†Œμ˜ ν•˜μœ„λ‘œ μΆ”κ°€ν•˜λ©΄ 됨 
  • android:exported νŠΉμ„±μ„ ν¬ν•¨ν•˜κ³  이λ₯Ό false둜 μ„€μ •ν•˜λ©΄ μ™ΈλΆ€μ˜ μ•±μ—μ„œ μ‚¬μš©ν•  수 μ—†μŒ, λͺ…μ‹œμ  μΈν…νŠΈλ₯Ό μ‚¬μš©ν•˜λŠ” κ²½μš°μ—λ„ 적용

 

μ„œλΉ„μŠ€μ˜ μ„ μ–Έ

μ‹œμž‘λœ μ„œλΉ„μŠ€ κ΅¬ν˜„ 


 

μ„œλΉ„μŠ€λ₯Ό κ΅¬ν˜„ν•˜κΈ° μœ„ν•΄μ„  Serviceλ‚˜ IntentServiceλ₯Ό 상속받아 κ΅¬ν˜„ν•΄μ•Όν•¨ 
μ„œλΉ„μŠ€κ°€ μ‹œμž‘λ˜λ©΄ 이λ₯Ό μ‹œμž‘ν•œ ꡬ성 μš”μ†Œμ™€ 독립적인 수λͺ…μ£ΌκΈ°λ₯Ό 가짐 
ν•΄λ‹Ή μ„œλΉ„μŠ€λ₯Ό μ‹œμž‘ν•œ ꡬ성 μš”μ†Œκ°€ μ†Œλ©Έλ˜λ”λΌλ„ λ°±κ·ΈλΌμš΄λ“œμ—μ„œ λ¬΄ν•œνžˆ 싀행될 수 있음
ꡬ성 μš”μ†Œκ°€ μ„œλΉ„μŠ€λ₯Ό μ‹œμž‘ν•˜λ €λ©΄ startService()λ₯Ό ν˜ΈμΆœν•˜κ³ , Intentλ₯Ό μ „λ‹¬ν•˜λ©΄ 됨 
μΈν…νŠΈμ—μ„œ μ„œλΉ„μŠ€λ₯Ό μ§€μ •ν•˜κ³ , 이 μ„œλΉ„μŠ€κ°€ μ‚¬μš©ν•  λͺ¨λ“  데이터λ₯Ό 포함함 
μ„œλΉ„μŠ€λŠ” onStartCommand() λ©”μ„œλ“œμ—μ„œ 이 Intentλ₯Ό λ°›κ²Œλ¨

 

Service

  • λͺ¨λ“  μ„œλΉ„μŠ€μ˜ κΈ°λ³Έ 클래슀
  • 이 클래슀λ₯Ό ν™•μž₯ν•  λ•ŒλŠ” μ„œλΉ„μŠ€κ°€ λͺ¨λ“  μž‘μ—…μ„ μ™„λ£Œν•  수 μžˆλŠ” μƒˆ μŠ€λ ˆλ“œμ—μ„œ μƒμ„±ν•˜λŠ” 것이 μ€‘μš”ν•¨ 
  • μ„œλΉ„μŠ€λŠ” 기본적으둜 κΈ°λ³Έ μŠ€λ ˆλ“œλ₯Ό μ‚¬μš©ν•˜κΈ°μ— μ•‘ν‹°λΉ„ν‹°μ˜ μ„±λŠ₯을 μ €ν•˜μ‹œν‚¬ 수 있음
  • μ„œλΉ„μŠ€κ°€ λ©€ν‹° μŠ€λ ˆλ”©μ„ μˆ˜ν–‰ν•΄μ•Ό ν•˜λŠ” 경우 Service ν΄λž˜μŠ€λ₯Ό ν™•μž₯ν•˜μ—¬ κ΅¬ν˜„ 
  • μ•„λž˜ μ˜ˆμ‹œλŠ” IntentService 와 λ™μΌν•œ κΈ°λŠ₯을 κ΅¬ν˜„ν•œ κ²ƒμž„
  • 각 μš”μ²­μ— λŒ€ν•΄ μŠ€λ ˆλ“œλ₯Ό ν•˜λ‚˜μ”© μƒμ„±ν•œ λ‹€μŒ μ‹€ν–‰ν•˜λ©΄ λ™μ‹œμ— μˆ˜ν–‰ κ°€λŠ₯함

 

μΈν…νŠΈ μ„œλΉ„μŠ€μ™€ λ™μΌν•œ κΈ°λŠ₯을 κ΅¬ν˜„ν•˜κΈ° μœ„ν•΄μ„  ꡉμž₯히 κΈ΄ 과정이 ν•„μš”

 

IntentService

  • Service의 ν•˜μœ„ 클래슀둜 μž‘μ—… μŠ€λ ˆλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ λͺ¨λ“  μ‹œμž‘ μš”μ²­μ„ μ²˜λ¦¬ν•˜λ˜, ν•œλ²ˆμ— ν•˜λ‚˜μ”© μ²˜λ¦¬ν•¨ 
  • μ„œλΉ„μŠ€κ°€ μ—¬λŸ¬ 개의 μš”μ²­μ„ λ™μ‹œμ— μ²˜λ¦¬ν•˜μ§€ μ•Šμ•„λ„ λ˜λŠ” κ²½μš°μ— μ΅œμ„ μ˜ μ˜΅μ…˜
  • μš”μ²­μ΄ λͺ¨λ‘ 처리된 ν›„ μ„œλΉ„μŠ€λ₯Ό μ€‘λ‹¨ν•˜λ―€λ‘œ κ°œλ°œμžκ°€ stopSelft() λ₯Ό ν˜ΈμΆœν•  ν•„μš”κ°€ μ „ν˜€ μ—†μŒ 
  • Service ν΄λž˜μŠ€ κ΅¬ν˜„κ³Ό 달리, onBind()κ°€ 기본적으둜 null을 λ°˜ν™˜λ˜λ„λ‘ κ΅¬ν˜„λ˜μ–΄ 있음
  • ν•„μˆ˜μ μœΌλ‘œ onHandleIntent()λ₯Ό κ΅¬ν˜„ν•΄μ•Όν•¨

 

μ„œλΉ„μŠ€μ˜ κ΅¬ν˜„

  • 생λͺ… μ£ΌκΈ° 콜백 λ©”μ„œλ“œλŠ” λ°˜λ“œμ‹œ 슈퍼 클래슀의 본래 λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•΄μ•Όν•¨
  • κ·Έλž˜μ•Όλ§Œ IntentServiceκ°€ μž‘μ—… μŠ€λ ˆλ“œμ˜ 수λͺ…을 적절히 μ²˜λ¦¬ν•  수 있음 
  • onBind()λŠ” ν˜ΈμΆœν•˜μ§€ μ•Šμ•„λ„ 됨

 

μ„œλΉ„μŠ€μ˜ μ‹€ν–‰

  • IntentService λ©”μ„œλ“œλ₯Ό μ΄μš©ν•˜μ—¬ μ‹€ν–‰μ‹œν‚¬ 수 있음 μ‹œμž‘ νƒ€μž… μ„œλΉ„μŠ€λŠ” κ²°κ³Όλ₯Ό μ£Όκ³  λ°›λŠ” 것이 λΆˆκ°€λŠ₯ν•˜μ§€λ§Œ, λ§Œμ•½ ν΄λΌμ΄μ–ΈνŠΈκ°€ PendingIntentλ₯Ό λ§Œλ“€κ³  이λ₯Ό μ „λ‹¬ν•œλ‹€λ©΄, μ„œλΉ„μŠ€λŠ” 이 λΈŒλ‘œλ“œμΊμŠ€νŠΈλ₯Ό ν™œμš©ν•˜μ—¬ κ²°κ³Όλ₯Ό 전달할 수 있음

 

μΈν…νŠΈλŠ” μ‹œμž‘λœ μ•‘ν‹°λΉ„ν‹°μ˜ μœ μΌν•œ 톡신 μˆ˜λ‹¨

 

Reference

https://developer.android.com/guide/components/services?hl=ko

 

μ„œλΉ„μŠ€ κ°œμš”  |  Android 개발자  |  Android Developers

ServiceλŠ” λ°±κ·ΈλΌμš΄λ“œμ—μ„œ 였래 μ‹€ν–‰λ˜λŠ” μž‘μ—…μ„ μˆ˜ν–‰ν•  수 μžˆλŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜ ꡬ성 μš”μ†Œμ΄λ©° μ‚¬μš©μž μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ œκ³΅ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ‹€λ₯Έ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ ꡬ성 μš”μ†Œκ°€ μ„œλΉ„μŠ€λ₯Ό μ‹œμž‘ν•  수 있으�

developer.android.com