μλλ‘μ΄λ 4λ μ»΄ν¬λνΈ κ°κ°μ μμ€ν μ΄λ μ¬μ©μκ° μ±μ μ§μ νλ μ§μ μ μν μ νλ©°, νΉμ κΈ°λ₯μ λ΄λΉνλ€.
μλλ‘μ΄λμμ μ 곡νλ μ£Όμ κ΅¬μ± μμλ λ€μκ³Ό κ°μ΄ λ€ κ°μ§λ‘ ꡬλΆλλ€.
- νλ(Activity) - μ¬μ©μ μΈν°νμ΄μ€λ₯Ό μ 곡νλ μμ
- μλΉμ€(Service) - λ°±κ·ΈλΌμ΄λ μμ μ μννλ μμ
- λΈλ‘λμΊμ€νΈ 리μλ²(Broadcast Receiver) - μμ€ν λ° μ±μ λΈλ‘λμΊμ€νΈ λ©μμ§λ₯Ό μ²λ¦¬νλ μμ
- μ½ν μΈ μ 곡μ(Content Provider) - λ°μ΄ν°λ₯Ό κ΄λ¦¬νκ³ κ³΅μ νλ μμ
1. νλ(Activity)
νλ(Activity)λ μ¬μ©μκ° μ±κ³Ό μνΈμμ©ν μ μλ νλ©΄μ λνλΈλ€. κ° μ‘ν°λΉν°λ μ± λ΄μμ λ 립μ μΌλ‘ μ‘΄μ¬ν μ μμΌλ©°, λ€λ₯Έ μ‘ν°λΉν° λλ μ±μμ νΈμΆλ μλ μλ€.
μ£Όμ νΉμ§
- μ¬μ©μ μΈν°νμ΄μ€(UI)λ₯Ό μ 곡: μ±μ κ° νλ©΄μ λνλΈλ€.
- μλͺ μ£ΌκΈ°λ₯Ό κ°μ§: μ‘ν°λΉν°λ μμ±, μμ, μΌμ μ μ§, μ€μ§, μ’ λ£ λ±μ μνλ₯Ό κ°μ§λ€.
- λ€λ₯Έ μ‘ν°λΉν° λ° μ±κ³Ό μνΈμμ© κ°λ₯: μΈν νΈλ₯Ό ν΅ν΄ λ€λ₯Έ μ‘ν°λΉν°λ μΈλΆ μ±μ νΈμΆν μ μλ€.
μμ
μ΄λ©μΌ μ±μ κ²½μ°:
- λ°μ νΈμ§ν¨μ νμνλ νλ
- μ΄λ©μΌμ μμ±νλ νλ
- μ΄λ©μΌ λ΄μ©μ μ½λ νλ
μ΄μ²λΌ μ¬λ¬ κ°μ μ‘ν°λΉν°κ° μ‘°ν©λμ΄ μ±μ μ¬μ©μ κ²½νμ ꡬμ±νκ² λλ€.
ꡬν λ°©λ²
μ‘ν°λΉν°λ Activity ν΄λμ€λ₯Ό μμνμ¬ κ΅¬ννλ€.
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
}
2. μλΉμ€(Service)
μλΉμ€(Service)λ λ°±κ·ΈλΌμ΄λμμ μ€νλλ μ»΄ν¬λνΈλ‘, UIλ₯Ό μ 곡νμ§ μλλ€. μλΉμ€λ μ¬μ©μμ μ§μ μνΈμμ©νμ§ μμ§λ§, λ°±κ·ΈλΌμ΄λμμ μ€μν μμ μ μννλ€.
μ£Όμ νΉμ§
- UI μμ΄ μ€νλ¨: μ¬μ©μ μΈν°νμ΄μ€ μμ΄ λ°±κ·ΈλΌμ΄λμμ μ€νλλ€. μ΄ν리μΌμ΄μ μ΄ μ’ λ£λμ΄λ λ°±κ·ΈλΌμ΄λμμ λμνλ€.
- μ₯κΈ° μ€ν μμ μ μ²λ¦¬: μμ μ¬μ, λ°μ΄ν° λκΈ°ν, μμΉ μΆμ λ±κ³Ό κ°μ μμ μ μννλ€.
- λ€λ₯Έ κ΅¬μ± μμμ μνΈμμ© κ°λ₯: μ‘ν°λΉν°μμ μλΉμ€λ₯Ό μμνκ±°λ, μλΉμ€μμ λΈλ‘λμΊμ€νΈλ₯Ό λ³΄λΌ μ μλ€.
μλΉμ€μ μ’ λ₯
- μμλ μλΉμ€(Started Service): νΉμ μμ μ μνν ν μλμΌλ‘ μ’ λ£λ¨ (μ: μμ μ¬μ)
- λ°μΈλλ μλΉμ€(Bound Service): λ€λ₯Έ μ»΄ν¬λνΈ(μ: μ‘ν°λΉν°)κ° μλΉμ€μ μ°κ²°λμ΄ μνΈμμ© κ°λ₯
μ£Όμ κΈ°λ₯
- μμ μ¬μ
- λ°±κ·ΈλΌμ΄λ λ°μ΄ν° λκΈ°ν
- μμΉ μΆμ
ꡬν λ°©λ²
μλΉμ€λ Service ν΄λμ€λ₯Ό μμνμ¬ κ΅¬ννλ€.
class MyService : Service() {
override fun onBind(intent: Intent?): IBinder? {
return null
}
}
μλλ‘μ΄λ 5.0(API 21) μ΄μμμλ JobSchedulerλ₯Ό νμ©νμ¬ μ΅μ νλ λ°±κ·ΈλΌμ΄λ μμ μ μννλ κ²μ΄ κΆμ₯λλ€.
3. λΈλ‘λμΊμ€νΈ 리μλ²(Broadcast Receiver)
λΈλ‘λμΊμ€νΈ 리μλ²(Broadcast Receiver)λ μμ€ν μ΄λ λ€λ₯Έ μ±μμ λ°μν μ΄λ²€νΈλ₯Ό κ°μ§νκ³ λ°μνλ μν μ νλ€. μ±μ΄ μ€ν μ€μ΄μ§ μμλ λΈλ‘λμΊμ€νΈλ₯Ό μμ ν μ μλ€.
μ£Όμ νΉμ§
- μμ€ν λ° μ±μ μ΄λ²€νΈ κ°μ§: λ€νΈμν¬ λ³κ²½, λ°°ν°λ¦¬ λΆμ‘±, κΈ°κΈ° λΆν μλ£ λ±μ μ΄λ²€νΈλ₯Ό κ°μ§ν μ μλ€.
- λ°±κ·ΈλΌμ΄λμμ μ€ν κ°λ₯: μ±μ΄ μ€νλμ§ μμλ λΈλ‘λμΊμ€νΈλ₯Ό λ°μ μ μλ€.
- λ€λ₯Έ κ΅¬μ± μμμ μ°κ³ κ°λ₯: μμ κΈ°λ₯Ό ν΅ν΄ λλ°μ΄μ€ μν©μ κ°μνλ€κ° νΉμ μ΄λ²€νΈ λ°μ μ ν΄λΉ μ΄λ²€νΈμ λ§λ μλΉμ€λ μ‘ν°λΉν°λ₯Ό μ€ννλ€.
μμ
- λ°°ν°λ¦¬ λΆμ‘± κ²½κ³ μμ
- λ€νΈμν¬ μν λ³κ²½ κ°μ§
- λΆν μλ£ μ΄λ²€νΈ κ°μ§
ꡬν λ°©λ²
λΈλ‘λμΊμ€νΈ 리μλ²λ BroadcastReceiver ν΄λμ€λ₯Ό μμνμ¬ κ΅¬ννλ€.
class MyReceiver : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
Toast.makeText(context, "Broadcast received!", Toast.LENGTH_SHORT).show()
}
}
AndroidManifest.xmlμμ λΈλ‘λμΊμ€νΈλ₯Ό λ±λ‘ν΄μΌ νλ€.
<receiver android:name=".MyReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
4. μ½ν μΈ μ 곡μ(Content Provider)
μ½ν μΈ μ 곡μ(Content Provider)λ μλ‘ λ€λ₯Έ μ± κ° λ°μ΄ν°λ₯Ό 곡μ ν μ μλλ‘ νλ μ»΄ν¬λνΈμ΄λ€. SQLite λ°μ΄ν°λ² μ΄μ€, νμΌ μμ€ν , μΉ λ± λ€μν μ μ₯μμμ λ°μ΄ν°λ₯Ό κ΄λ¦¬ν μ μλ€.
μ£Όμ νΉμ§
- λ°μ΄ν° κ΄λ¦¬ λ° κ³΅μ : λ°μ΄ν°λ₯Ό μμ νκ² μ 곡νκ³ μ μ΄ν μ μλ€.
- URIλ₯Ό ν΅ν΄ λ°μ΄ν° μ‘μΈμ€: content:// νμμ URIλ₯Ό μ¬μ©νμ¬ λ°μ΄ν°μ μ κ·Όνλ€.
- 보μ λ° κΆν κ΄λ¦¬ μ 곡: μ±μ΄ μ κ·Όν μ μλ λ°μ΄ν° λ²μλ₯Ό μ μ΄ν μ μλ€.
μ£Όμ κΈ°λ₯
- μ°λ½μ², μΊλ¦°λ, λ―Έλμ΄ νμΌ λ±μ λ°μ΄ν° 곡μ
- μ± κ° λ°μ΄ν° κ΅ν μ§μ
- 보μκ³Ό κΆν κ΄λ¦¬ κΈ°λ₯ μ 곡
μμ
μλλ‘μ΄λμ μ°λ½μ² μ±μ ContactsProviderλ₯Ό ν΅ν΄ μ°λ½μ² μ 보λ₯Ό μ 곡νλ€.
val cursor = contentResolver.query(
ContactsContract.Contacts.CONTENT_URI,
null, null, null, null
)
μ½ν μΈ μ 곡μλ ContentProvider ν΄λμ€λ₯Ό μμνμ¬ κ΅¬ννλ€.
class MyContentProvider : ContentProvider() {
override fun onCreate(): Boolean {
return true
}
override fun query(...): Cursor? {
return null
}
}
κ²°λ‘
- μλλ‘μ΄λ 4λ μ»΄ν¬λνΈλ₯Ό μ μ ν νμ©νλ©΄ μ μ§λ³΄μμ±κ³Ό νμ₯μ±μ΄ λ°μ΄λ μ±μ κ°λ°ν μ μλ€.
- νΉν μ± κ°μ λ°μ΄ν° 곡μ , λ°±κ·ΈλΌμ΄λ μμ , μ¬μ©μ μΈν°νμ΄μ€ μ€κ³ λ±μ λν κ°λ μ μ μ΅νλλ©΄ κ°λ°μ΄ ν¨μ¬ μμν΄μ§λ€.
- μ±μ κ°λ°ν λ κ° κ΅¬μ± μμμ μν μ κ³ λ €νλ©° μ μ ν ꡬ쑰λ₯Ό μ€κ³ν νμκ° μλ€.
'π€ μλλ‘μ΄λ > μν€ν μ²' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
μλλ‘μ΄λ 4λ μ»΄ν¬λνΈ κ°κ°μ μμ€ν μ΄λ μ¬μ©μκ° μ±μ μ§μ νλ μ§μ μ μν μ νλ©°, νΉμ κΈ°λ₯μ λ΄λΉνλ€.
μλλ‘μ΄λμμ μ 곡νλ μ£Όμ κ΅¬μ± μμλ λ€μκ³Ό κ°μ΄ λ€ κ°μ§λ‘ ꡬλΆλλ€.
- νλ(Activity) - μ¬μ©μ μΈν°νμ΄μ€λ₯Ό μ 곡νλ μμ
- μλΉμ€(Service) - λ°±κ·ΈλΌμ΄λ μμ μ μννλ μμ
- λΈλ‘λμΊμ€νΈ 리μλ²(Broadcast Receiver) - μμ€ν λ° μ±μ λΈλ‘λμΊμ€νΈ λ©μμ§λ₯Ό μ²λ¦¬νλ μμ
- μ½ν μΈ μ 곡μ(Content Provider) - λ°μ΄ν°λ₯Ό κ΄λ¦¬νκ³ κ³΅μ νλ μμ
1. νλ(Activity)
νλ(Activity)λ μ¬μ©μκ° μ±κ³Ό μνΈμμ©ν μ μλ νλ©΄μ λνλΈλ€. κ° μ‘ν°λΉν°λ μ± λ΄μμ λ 립μ μΌλ‘ μ‘΄μ¬ν μ μμΌλ©°, λ€λ₯Έ μ‘ν°λΉν° λλ μ±μμ νΈμΆλ μλ μλ€.
μ£Όμ νΉμ§
- μ¬μ©μ μΈν°νμ΄μ€(UI)λ₯Ό μ 곡: μ±μ κ° νλ©΄μ λνλΈλ€.
- μλͺ μ£ΌκΈ°λ₯Ό κ°μ§: μ‘ν°λΉν°λ μμ±, μμ, μΌμ μ μ§, μ€μ§, μ’ λ£ λ±μ μνλ₯Ό κ°μ§λ€.
- λ€λ₯Έ μ‘ν°λΉν° λ° μ±κ³Ό μνΈμμ© κ°λ₯: μΈν νΈλ₯Ό ν΅ν΄ λ€λ₯Έ μ‘ν°λΉν°λ μΈλΆ μ±μ νΈμΆν μ μλ€.
μμ
μ΄λ©μΌ μ±μ κ²½μ°:
- λ°μ νΈμ§ν¨μ νμνλ νλ
- μ΄λ©μΌμ μμ±νλ νλ
- μ΄λ©μΌ λ΄μ©μ μ½λ νλ
μ΄μ²λΌ μ¬λ¬ κ°μ μ‘ν°λΉν°κ° μ‘°ν©λμ΄ μ±μ μ¬μ©μ κ²½νμ ꡬμ±νκ² λλ€.
ꡬν λ°©λ²
μ‘ν°λΉν°λ Activity ν΄λμ€λ₯Ό μμνμ¬ κ΅¬ννλ€.
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
}
2. μλΉμ€(Service)
μλΉμ€(Service)λ λ°±κ·ΈλΌμ΄λμμ μ€νλλ μ»΄ν¬λνΈλ‘, UIλ₯Ό μ 곡νμ§ μλλ€. μλΉμ€λ μ¬μ©μμ μ§μ μνΈμμ©νμ§ μμ§λ§, λ°±κ·ΈλΌμ΄λμμ μ€μν μμ μ μννλ€.
μ£Όμ νΉμ§
- UI μμ΄ μ€νλ¨: μ¬μ©μ μΈν°νμ΄μ€ μμ΄ λ°±κ·ΈλΌμ΄λμμ μ€νλλ€. μ΄ν리μΌμ΄μ μ΄ μ’ λ£λμ΄λ λ°±κ·ΈλΌμ΄λμμ λμνλ€.
- μ₯κΈ° μ€ν μμ μ μ²λ¦¬: μμ μ¬μ, λ°μ΄ν° λκΈ°ν, μμΉ μΆμ λ±κ³Ό κ°μ μμ μ μννλ€.
- λ€λ₯Έ κ΅¬μ± μμμ μνΈμμ© κ°λ₯: μ‘ν°λΉν°μμ μλΉμ€λ₯Ό μμνκ±°λ, μλΉμ€μμ λΈλ‘λμΊμ€νΈλ₯Ό λ³΄λΌ μ μλ€.
μλΉμ€μ μ’ λ₯
- μμλ μλΉμ€(Started Service): νΉμ μμ μ μνν ν μλμΌλ‘ μ’ λ£λ¨ (μ: μμ μ¬μ)
- λ°μΈλλ μλΉμ€(Bound Service): λ€λ₯Έ μ»΄ν¬λνΈ(μ: μ‘ν°λΉν°)κ° μλΉμ€μ μ°κ²°λμ΄ μνΈμμ© κ°λ₯
μ£Όμ κΈ°λ₯
- μμ μ¬μ
- λ°±κ·ΈλΌμ΄λ λ°μ΄ν° λκΈ°ν
- μμΉ μΆμ
ꡬν λ°©λ²
μλΉμ€λ Service ν΄λμ€λ₯Ό μμνμ¬ κ΅¬ννλ€.
class MyService : Service() {
override fun onBind(intent: Intent?): IBinder? {
return null
}
}
μλλ‘μ΄λ 5.0(API 21) μ΄μμμλ JobSchedulerλ₯Ό νμ©νμ¬ μ΅μ νλ λ°±κ·ΈλΌμ΄λ μμ μ μννλ κ²μ΄ κΆμ₯λλ€.
3. λΈλ‘λμΊμ€νΈ 리μλ²(Broadcast Receiver)
λΈλ‘λμΊμ€νΈ 리μλ²(Broadcast Receiver)λ μμ€ν μ΄λ λ€λ₯Έ μ±μμ λ°μν μ΄λ²€νΈλ₯Ό κ°μ§νκ³ λ°μνλ μν μ νλ€. μ±μ΄ μ€ν μ€μ΄μ§ μμλ λΈλ‘λμΊμ€νΈλ₯Ό μμ ν μ μλ€.
μ£Όμ νΉμ§
- μμ€ν λ° μ±μ μ΄λ²€νΈ κ°μ§: λ€νΈμν¬ λ³κ²½, λ°°ν°λ¦¬ λΆμ‘±, κΈ°κΈ° λΆν μλ£ λ±μ μ΄λ²€νΈλ₯Ό κ°μ§ν μ μλ€.
- λ°±κ·ΈλΌμ΄λμμ μ€ν κ°λ₯: μ±μ΄ μ€νλμ§ μμλ λΈλ‘λμΊμ€νΈλ₯Ό λ°μ μ μλ€.
- λ€λ₯Έ κ΅¬μ± μμμ μ°κ³ κ°λ₯: μμ κΈ°λ₯Ό ν΅ν΄ λλ°μ΄μ€ μν©μ κ°μνλ€κ° νΉμ μ΄λ²€νΈ λ°μ μ ν΄λΉ μ΄λ²€νΈμ λ§λ μλΉμ€λ μ‘ν°λΉν°λ₯Ό μ€ννλ€.
μμ
- λ°°ν°λ¦¬ λΆμ‘± κ²½κ³ μμ
- λ€νΈμν¬ μν λ³κ²½ κ°μ§
- λΆν μλ£ μ΄λ²€νΈ κ°μ§
ꡬν λ°©λ²
λΈλ‘λμΊμ€νΈ 리μλ²λ BroadcastReceiver ν΄λμ€λ₯Ό μμνμ¬ κ΅¬ννλ€.
class MyReceiver : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
Toast.makeText(context, "Broadcast received!", Toast.LENGTH_SHORT).show()
}
}
AndroidManifest.xmlμμ λΈλ‘λμΊμ€νΈλ₯Ό λ±λ‘ν΄μΌ νλ€.
<receiver android:name=".MyReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
4. μ½ν μΈ μ 곡μ(Content Provider)
μ½ν μΈ μ 곡μ(Content Provider)λ μλ‘ λ€λ₯Έ μ± κ° λ°μ΄ν°λ₯Ό 곡μ ν μ μλλ‘ νλ μ»΄ν¬λνΈμ΄λ€. SQLite λ°μ΄ν°λ² μ΄μ€, νμΌ μμ€ν , μΉ λ± λ€μν μ μ₯μμμ λ°μ΄ν°λ₯Ό κ΄λ¦¬ν μ μλ€.
μ£Όμ νΉμ§
- λ°μ΄ν° κ΄λ¦¬ λ° κ³΅μ : λ°μ΄ν°λ₯Ό μμ νκ² μ 곡νκ³ μ μ΄ν μ μλ€.
- URIλ₯Ό ν΅ν΄ λ°μ΄ν° μ‘μΈμ€: content:// νμμ URIλ₯Ό μ¬μ©νμ¬ λ°μ΄ν°μ μ κ·Όνλ€.
- 보μ λ° κΆν κ΄λ¦¬ μ 곡: μ±μ΄ μ κ·Όν μ μλ λ°μ΄ν° λ²μλ₯Ό μ μ΄ν μ μλ€.
μ£Όμ κΈ°λ₯
- μ°λ½μ², μΊλ¦°λ, λ―Έλμ΄ νμΌ λ±μ λ°μ΄ν° 곡μ
- μ± κ° λ°μ΄ν° κ΅ν μ§μ
- 보μκ³Ό κΆν κ΄λ¦¬ κΈ°λ₯ μ 곡
μμ
μλλ‘μ΄λμ μ°λ½μ² μ±μ ContactsProviderλ₯Ό ν΅ν΄ μ°λ½μ² μ 보λ₯Ό μ 곡νλ€.
val cursor = contentResolver.query(
ContactsContract.Contacts.CONTENT_URI,
null, null, null, null
)
μ½ν μΈ μ 곡μλ ContentProvider ν΄λμ€λ₯Ό μμνμ¬ κ΅¬ννλ€.
class MyContentProvider : ContentProvider() {
override fun onCreate(): Boolean {
return true
}
override fun query(...): Cursor? {
return null
}
}
κ²°λ‘
- μλλ‘μ΄λ 4λ μ»΄ν¬λνΈλ₯Ό μ μ ν νμ©νλ©΄ μ μ§λ³΄μμ±κ³Ό νμ₯μ±μ΄ λ°μ΄λ μ±μ κ°λ°ν μ μλ€.
- νΉν μ± κ°μ λ°μ΄ν° 곡μ , λ°±κ·ΈλΌμ΄λ μμ , μ¬μ©μ μΈν°νμ΄μ€ μ€κ³ λ±μ λν κ°λ μ μ μ΅νλλ©΄ κ°λ°μ΄ ν¨μ¬ μμν΄μ§λ€.
- μ±μ κ°λ°ν λ κ° κ΅¬μ± μμμ μν μ κ³ λ €νλ©° μ μ ν ꡬ쑰λ₯Ό μ€κ³ν νμκ° μλ€.