λ°νμ : μ‘μμ
λ°νμΌμ : 2018-09-28
λ°νμ£Όμ : Service
[TOC]
- λ λκΉμ§ μλλ‘μ΄λ(μ€μ€μ μ§μ)
- https://developer.android.com/guide/components/services?hl=ko
- https://developer.android.com/guide/components/bound-services#Lifecycle
μλΉμ€: λ°±κ·ΈλΌμ΄λμμ μ€λ μ€νλλ μμ μ μνν μ μλ μ ν리μΌμ΄μ κ΅¬μ± μμ
-
μλΉμ€λ μ΄λ¦ κ·Έλλ‘ λ€λ₯Έ μ»΄ν¬λνΈμκ² μλΉμ€λ₯Ό μ 곡νλ €λ λͺ©μ μΌλ‘ μ¬μ©
-
μ€λ 걸리λ μμ μ λ°±κ·ΈλΌμ΄λμμ μ€ννκ² νκ³ , λμ 보μ΄λ νλ©΄μ κ°μ§μ§ μλλ€.
- ex) νμΌ λ€μ΄λ‘λ, μμ μ¬μ
-
https://github.com/taeiim/Android-Study/tree/master/study/week14/Service/BadThreadExam
-
μλΉμ€ μ»΄ν¬λνΈλ₯Ό μ¬μ©νλ©΄ μ μμ μ κ°μ λ¬Έμ λ₯Ό ν΄κ²°ν μ μλ€!
μλΉμ€λ μ€ννΈ μλΉμ€μ λ°μΈλ μλΉμ€, λ κ°μ§ λ°©μμ μ 곡
λ κ°μ§ μ€ μ ννμ¬ μ¬μ©ν μλ μκ³ , λ λ€ μ¬μ©ν μλ μλ€.
- μ€ννΈ μλΉμ€
- μμν΄ λλ©΄ μμ ν λ 립μ μΌλ‘ μνλλ μμ μ νλ€.
- λ€λ₯Έ μ»΄ν¬λνΈκ° μ€κ°μ μ’ λ£μν¬ μ μλ€.
- λ°μΈλ μλΉμ€
- μλΉμ€μ λ€λ₯Έ μ»΄ν¬λνΈμ μ°κ²°κ³ 리λ₯Ό λ§λ λ€.
- λ°λΌμ μ°κ²°λ μ»΄ν¬λνΈμ μνμ λ°λΌ μλΉμ€μ λμμ μ μ΄ν μ μλ€.
- λ 립μ μ΄μ§ μκ³ λ€λ₯Έ μ»΄ν¬λνΈμ μμ‘΄νλ€.
μ€ννΈ μλΉμ€λ νμΌ λ€μ΄λ‘λ, μμ μ¬μκ³Ό κ°μ κΈ°λ₯μ ꡬνν λ μ¬μ©(λ¬Όλ‘ λμ€μ μ’ λ£ κ°λ₯)
μ±μ μ’ λ£νλ€κ° λ€μ μμνλλΌλ μλΉμ€λ κ³μ λμνμ¬ λ€μ΄λ‘λ μμ μ λ©μΆμ§ λ§μμΌ νλ€.
https://github.com/taeiim/Android-Study/tree/master/study/week14/Service/ServiceExamΒ
=> μλΉμ€λ μ‘ν°λΉν°μ λ 립μ μΌλ‘ λμνλ―λ‘ μ±μ μ’ λ£νκ³ λ€μ μ€νν΄λ μλΉμ€μ μλͺ μ£ΌκΈ°μλ μ무 μν₯μ΄ μλ€.
A. μλΉμ€λ νμν λλ§ μμ±νλ κ² μ’λ€.
- λ°±κ·ΈλΌμ΄λμμ μννμ§λ§ μ¬μ©μκ° μ±μ μ¬μ© μ€μΌ λλ§ λμν΄μΌ νλ μν©μλ μλΉμ€ λμ μ€λ λ!
- μλΉμ€λ₯Ό μ¬μ©ν λ μ£Όμν μ μΌλ‘λ λͺ¨λ μ»΄ν¬λνΈλ λ©μΈ μ€λ λμμ λμνλ―λ‘ μλΉμ€κ° μννλ μμ μ΄ λ©μΈ μ€λ λλ₯Ό μ μ νλ μΌμ΄λΌλ©΄ UIλ₯Ό μ°¨λ¨νμ§ μλλ‘ μλΉμ€ λ΄μμ μ€λ λλ₯Ό μμ±νμΌ νλ€λ μ
μλλ‘μ΄λ μμ€ν μ μμμ΄ λΆμ‘±νλ©΄ λ°±κ·ΈλΌμ΄λμμ μ€νλλ νλ‘μΈμ€λ₯Ό νλμ© κ°μ λ‘ μ’ λ£νλ―λ‘ μλΉμ€ μμ κ°μ μ’ λ£ λμμ΄ λ μ μλ€!
onStartCommand() λ©μλκ° λ°ννλ μμκ° κ·Έλ° μν μ νλ€. κ°μ μ’ λ£λ μλΉμ€λ₯Ό μ΄λ¦΄ μ μλ λ€μν μ΅μ
μμ | μλ―Έ |
---|---|
START_NOT_STICKY | μ λ¬ν μΈν νΈκ° μμ λλ₯Ό μ μΈνκ³ , μλΉμ€κ° μ€λ¨λλ©΄ μ¬μμ±νμ§ μλλ€. κ°μ₯ μΌλ°μ μΈ μ΅μ |
START_STICKY | μλΉμ€κ° μ€λ¨λλ©΄ μλΉμ€λ₯Ό μ¬μμνμ§λ§, μΈν νΈλ λ€μ μ λ¬νμ§ μλλ€. λ―Έλμ΄ νλ μ΄μ΄μ κ°μ΄ μλΉμ€κ° 무기νμΌλ‘ λμν΄μΌ ν λ μ ν© |
START_REDELIVER_INTENT | START_STICKYμ λ€λ₯΄κ², μΈν νΈμ ν¨κ» μλΉμ€λ₯Ό μ¬μμνλ€. νμΌ λ€μ΄λ‘λμ κ°μ΄ 무μμ λ€μ΄λ‘λ νμλμ§ μμμΌ ν λ μ ν© |
μλΉμ€λ₯Ό ν¬ν¨ν μλλ‘μ΄λ 4λ μ»΄ν¬λνΈλ λ©μΈ μ€λ λμμ μ€νλλ―λ‘ μ€λ 걸리λ μ²λ¦¬λ₯Ό νκ² λλ©΄ νλ©΄μ΄ λ²λ² λλ©΄μ ANRμ΄ λ°μν μ μλ€. ANR λ°μμ λ§μΌλ €λ©΄ μλΉμ€ λ΄μμ μ€λ λλ₯Ό μμ±ν΄μΌ νλ€.
μλΉμ€μ μ’ λ£λ μ‘ν°λΉν°μ κ°μ μ»΄ν¬λνΈμμ stopService() λ©μλλ₯Ό μ¬μ©νμλλ°, μλΉμ€ λ΄μμ stopSelf() λ©μλλ₯Ό μ¬μ©ν΄λ λλ€.
λλΆλΆμ μλΉμ€λ μ¬λ¬ μμ²μ λμμ μ²λ¦¬νμ§ μμλ λκΈ° λλ¬Έμ, μΌλ°μ μΌλ‘ Serviceλ₯Ό νμ₯ν IntentService ν΄λμ€λ₯Ό μ¬μ©νλ€. μ΄ ν΄λμ€λ κΈ°λ³Έ Service ν΄λμ€μ λΉκ΅νμ¬ λ€μκ³Ό κ°μ μμ μ μννλ€.
- onStartCommand() λ©μλμ μ λ¬λ μΈν νΈλ§λ€ λ³λμ μ€λ λλ₯Ό μλμΌλ‘ μμ±ν΄ μ€λ€.
- ν λ²μ νλμ μΈν νΈλ₯Ό μ²λ¦¬νλ onHandleIntent() λ©μλλ₯Ό μ 곡νλ€.
- λͺ¨λ μνμ΄ λλλ©΄ μλμΌλ‘ stopSelf() λ©μλλ₯Ό νΈμΆνμ¬ μ’ λ£λλ€.
κ°μ₯ ν° νΉμ§μ μΈν νΈ μλΉμ€λ κΈ°λ³Έμ μΌλ‘ μμ μ€λ λμμ λμνλ―λ‘ μΌλ° μλΉμ€λ³΄λ€ μ½λλ₯Ό κ°κ²°νκ² μμ±!!
-
MyIntentService ν΄λμ€ μμ±
-
μμ±μ, onHandleIntent() λ©μλλ§ λ¨κΈ°κ³ λλ¨Έμ§ μ½λ μ κ±°(μΈν νΈ μλΉμ€ κΈ°λ³Έμ μΈ μ¬μ©λ°©λ²μ μκΈ° μν΄)
-
onHandleIntent() λ©μλ(μμ μ€λ λλ‘ λμνλ―λ‘)μ μ€λ 걸리λ μ²λ¦¬λ₯Ό μμ±
@Override protected void onHandleIntent(Intent intent) { for (int i = 0; i < 5; i++) { try { // 1μ΄λ§λ€ μ¬κΈ° Thread.sleep(1000); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } // 1μ΄λ§λ€ λ‘κ·Έ λ¨κΈ°κΈ° Log.d("MyIntentService", "μΈν νΈ μλΉμ€ λμ μ€ " + i); } }
-
xmlμ μΈν νΈ μλΉμ€ μμ λ²νΌ μμ±
-
λ©μΈ μ‘ν°λΉν°μ μΈν νΈ μλΉμ€λ₯Ό μμνλ onStartIntentService() λ©μλ μμ±
-
λ‘κ·ΈμΊ£ νμΈ(μΈν νΈ μλΉμ€ μμ μ¬λ¬λ² ν΄λ¦)
μμ λ§νλ€ μνΌ μν νΈ μλΉμ€λ μ°¨λ‘λλ‘ μ€νλ¨μ νμΈν μ μλ€!!!!!
μΈν νΈ μλΉμ€λ μμλλ‘ μΌμ μ²λ¦¬νκ³ μ€μ€λ‘ stopSelf() λ₯Ό νΈμΆνλ―λ‘ λμ€μ stopService() λ©μλ νΈμΆ X
- μλΉμ€λ κΈ°λ³Έμ μΌλ‘ λ°±κ·ΈλΌμ΄λμμ λμνλ κ²μ΄ κΈ°λ³Έ!μ΄μ§λ§~ ν¬κ·ΈλΌμ΄λμμλ μ€νλκ² ν μ μμ!
- ν¬κ·ΈλΌμ΄λ μλΉμ€λ λ©λͺ¨λ¦¬κ° λΆμ‘±ν λλ μλλ‘μ΄λ μμ€ν μ΄ κ°μ λ‘ μ’ λ£ν μ μκ³ , μλΉμ€λ₯Ό μ€λ¨νκ±°λ μλ¦Όμμ μ κ±°λμ΄μΌλ§ μ’ λ£μν¬ μ μλ€.
- ν¬κ·ΈλΌμ΄λ μλΉμ€λ₯Ό λ§λ€λ €λ©΄
- μν νμμ€μ νμλλ μλ¦Ό(Notification)μ μ 곡ν΄μΌ νλ€.
- μλ¦Όμ idκ° 0μ΄ μλμ΄μΌ νλ€.
- μλΉμ€ λ΄λΆμμ startForeground() λ©μλλ₯Ό νΈμΆνμ¬ ν¬κ·ΈλΌμ΄λ μλΉμ€ μμ
- MyServiceμ ν¬κ·ΈλΌμ΄λ μλΉμ€ λ§λ€κΈ°
... μλ΅ ...
private void startForegroundService() {
// default μ±λ IDλ‘ μλ¦Ό μμ±
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, "default");
builder.setSmallIcon(R.mipmap.ic_launcher);
builder.setContentTitle("ν¬κ·ΈλΌμ΄λ μλΉμ€");
builder.setContentText("ν¬κ·ΈλΌμ΄λ μλΉμ€ μ€ν μ€");
Intent notificationIntent = new Intent(this, MainActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
builder.setContentIntent(pendingIntent);
// μ€λ μ€μμλ μλ¦Ό μ±λμ 맀λμ μ μμ±ν΄μΌ νλ€
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationManager manager = (NotificationManager)
getSystemService(NOTIFICATION_SERVICE);
manager.createNotificationChannel(new NotificationChannel("default", "κΈ°λ³Έ μ±λ",
NotificationManager.IMPORTANCE_DEFAULT));
}
// ν¬κ·ΈλΌμ΄λλ‘ μμ
startForeground(1, builder.build());
}
}
- μ€λ μ€λΆν°λ μλ¦Όμ μ±λ IDλ₯Ό μ§μ ν΄ μ€μΌ νλ€.
- μ¬κΈ°μλ defaultλΌλ μ±λ IDλ₯Ό μ§μ , μ±λ IDλ μΉ΄ν κ³ λ¦¬λΌκ³ μκ°νλ©΄ λλ€.
- NotificationManagerμ μ±λ μμ±μ μμ²ν΄μΌ μ±λμ΄ μμ± λ¨(μ±λ ID, μ±λ μ΄λ¦, μ€μλ)
- μ±λμ μμ±νλ createNotificationChannel() λ©μλλ μ΄μ λ²μ μ μκΈ° λλ¬Έμ λ²μ λΆκΈ° μ²λ¦¬ν¨
- μ£Όμν μ μ startForeground(int, Notification)μ 첫 λ²μ§Έ νλΌλ―Έν°μΈ μλ¦Ό IDλ 0μ΄λ©΄ μλ¨!
- μλ¦Όμ νμ μμμΈ μμ΄μ½, μ λͺ©, λ΄μ©μ κΌ μμ΄μΌν¨(νλλΌλ μμΌλ©΄ μλ¦Ό λ±λ‘ X)
-
μΈν νΈμ μ‘μ μ μ€μ νκ³ ν΄λΉ μ‘μ μ μ²λ¦¬ν μ μλλ‘ onStartCommand() λ©μλ μμ
@Override public int onStartCommand(Intent intent, int flags, int startId) { if ("startForeground".equals(intent.getAction())) { // ν¬κ·ΈλΌμ΄λ μλΉμ€ μμ startForegroundService(); } else if (mThread == null) { ... μλ΅ ... } return START_STICKY; }
-
xml νμΌμ ν¬κ·ΈλΌμ΄λ μλΉμ€ μμ λ²νΌ μΆκ°
-
λ©μΈμ‘ν°λΉν°μ ν¬κ·ΈλΌμ΄λ μλΉμ€ μμ λ²νΌμ λμ μ μ(μ¬κΈ°μ μΈν νΈμ startForeground μ‘μ μΆκ°)
public void onStartForegroundService(View view) { Intent intent = new Intent(this, MyService.class); intent.setAction("startForeground"); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { startForegroundService(intent); } else { startService(intent); } }
-
λ²μ λΆκΈ° μν(μ€λ μ€μμλ ν¬κ·ΈλΌμ΄λ μλΉμ€λ₯Ό μμνκΈ° μν΄ startForegroundService() λ©μλ νΈμΆ ν 5μ΄ μ΄λ΄ μλΉμ€μμ startForeground() λ©μλλ₯Ό νΈμΆν΄μΌ ν¨)
- stopForeground() λ©μλ μ¬μ©νκΈ°
- stopForeground() λ©μλκ° μλΉμ€λ₯Ό μ’ λ£μν€λ κ² μλλΌ, μλΉμ€κ° μμ€ν μ μν΄ κ°μ μ’ λ£ λμμ΄ λλ κ²
- μλλ‘μ΄λ μ€λ μ€μμλ startService() λμ μ startForegroundService() λ©μλλ₯Ό μ¬μ©ν΄μΌ νλ©°, 5μ΄ μ΄λ΄μ startForeground() λ©μλλ₯Ό μλΉμ€μμ μ€νν΄μΌ νλ€.
- λ§μ½ 5μ΄ μ΄λ΄μ startForeground() λ©μλλ₯Ό νΈμΆνμ§ μμΌλ©΄ μμ€ν μ μλΉμ€κ° μλ΅νμ§ μλλ€κ³ νλ¨νμ¬ ANR μλ¬λ₯Ό λ°μμν¨λ€.
- μλ¦Ό μ±λμ΄ νμμ¬μ μ±λμ μμ±νμ§ μλ¦Ό νμκ° λμ§ μλλ€.
- μ΄λ¬ν λ³κ²½μ¬νμ μ΄μ λ²μ κ³Ό μλ‘μ΄ λ²μ μ λͺ¨λ μ μ©νλ €λ©΄ μ€μ΅μμμ²λΌ λ²μ λΆκΈ° μ²λ¦¬λ₯Ό ν΄μΌνλ€.
- μλλ‘μ΄λλ λ°±κ·ΈλΌμ΄λμμ μλνλ λͺ¨λ μλΉμ€λ μΈμ κ°λ κ°μ λ‘ μ’ λ£ν μ μλ€. ν¬κ·ΈλΌμ΄λ μλΉμ€λ₯Ό μ¬μ©νλ©΄ μ£½μ§ μλ μλΉμ€λ‘ μ¬μ©ν μ μλ€.
- λ¨, νμ μλ¦Όμ νμν΄μΌ νκ³ μ¬μ©μκ° μλ¦Όμ μ κ±°νλ©΄ μλΉμ€λ μ€μ§λ μ μλ€.
- Serviceλ λͺ¨λ μλΉμ€μ κΈ°λ³Έ ν΄λμ€μ΄λ©°, μ΄ ν΄λμ€λ₯Ό μμν κ²½μ° λͺ¨λ μμ μ Threadλ₯Ό μμ±νμ¬ μμ ν΄μΌ νλ€. μλΉμ€λ λ©μΈ μ€λ λμμ λμνλ―λ‘ μ‘ν°λΉν°μ μ±λ₯μ μν₯μ μ€ μ μκΈ° λλ¬Έμ΄λ€.
- IntentServiceλ Serviceμ μλΈν΄λμ€μ΄λ©°, λͺ¨λ μμ μ μμ μ€λ λμμ μννλ©° ν λ²μ νλμ©λ§ μννλ€. μλΉμ€κ° μ¬λ¬ κ°μ μμ μ λμμ ν νμκ° μμ λ μ΅μ μ μ ν!! onHandleIntent() λ§ κ΅¬ννλ©΄ λ¨.
μλΉμ€μ λ€λ₯Έ ꡬμ±μμλ₯Ό μλ‘ μ°κ²°νλ €λ©΄ λ€λ₯Έ ꡬμ±μμκ° μλΉμ€μ λ°μΈλν΄μΌ νλ€.
μ§κΈκΉμ§λ μΉ΄μ΄ν μ 보λ₯Ό λ‘κ·ΈμΊ£μμ νμΈνλλ°, μ¬κΈ°μλ μ‘ν°λΉν°λ₯Ό μλΉμ€μ μ°κ²°(λ°μΈλ)νμ¬ μλΉμ€λ‘λΆν° μΉ΄μ΄ν μ 보λ₯Ό μ 곡λ°μ ν μ€νΈ λ©μμ§λ‘ νμν΄ λ³΄κ² λ€!
- λ°μΈλ μλΉμ€λ₯Ό μ΄μ©νλ©΄ μ‘ν°λΉν°μ κ°μ λ€λ₯Έ μ»΄ν¬λνΈμ μ°κ²°νμ¬ μλ‘ λ°μ΄ν°λ₯Ό μ£Όκ³ λ°μ μ μλ€. μλΉμ€λ λ³λμ νλ‘μΈμ€λ‘ λμνκΈ° λλ¬Έμ μλΉμ€λΌλ¦¬ λ°μ΄ν°λ₯Ό μ£Όκ³ λ°μΌλ €λ©΄ 'λ°μΈλ(binder)'λ₯Ό μ¬μ©νλ€.
- 리λ μ€μ IPC(Inter Process Communication)κ³Ό RPC(Remote Procedure Call) κΈ°μ μ΄ λ°μΈλμ μ μ©λμ΄ λ€λ₯Έ νλ‘μΈμ€μμλ λ©μλλ₯Ό μ¬μ©ν μ μλ€.
- μλλ νλ‘μΈμ€λΌλ¦¬ μμμ 곡μ ν μ μλλ° κ·Έκ²μ κ°λ₯νκ² ν΄μ£Όλ κ²μ΄ λ°μΈλλΌκ³ μκ°νλ©΄ μ½λ€.
- IPC(Inter Process Communication)
리λ μ€μμλͺ¨λ νλ‘μΈμ€κ° 곡μ νλ λ©λͺ¨λ¦¬μ μ κ·Όν΄μ λ°μ΄ν°λ₯Ό μ½κ³ μΈ μ μκ²νλ κ°λ
- RPC(Remote Procedure Call)
λ€λ₯Έ νλ‘μΈμ€μ ν¨μ(λ©μλ)λ₯Ό νΈμΆν μ μλλ‘ νλ κΈ°μ
-
MyService.java νμΌ μμ
- λ°μΈλ μλΉμ€λ₯Ό μ 곡νλ €λ©΄ Service ν΄λμ€μ onBind() λ©μλμμ λ°μΈλ κ°μ²΄λ₯Ό λ°νν΄μΌ νλ€.
- λ°μΈλ κ°μ²΄λ Binderλ₯Ό μμνμ¬ λ§λ€κ³ μλΉμ€μ λ νΌλ°μ€λ₯Ό μ λ¬ν μ μλλ‘ getService() λ₯Ό λ§λ λ€.
... μλ΅ ... // MyServiceμ λ νΌλ°μ€λ₯Ό λ°ννλ Binder κ°μ²΄ private IBinder mBinder = new MyBinder(); public class MyBinder extends Binder{ public MyService getService(){ return MyService.this; } } // λ°μΈλλ μ»΄ν¬λνΈμ μΉ΄μ΄ν λ³μ«κ° μ 곡 public int getmCount() { return mCount; } ... μλ΅ ...
- onBind() μ½λ°± λ©μλλ λ€λ₯Έ ꡬμ±μμμ μλΉμ€κ° λ°μΈλ©(μ°κ²°)λλ©΄ νΈμΆλλ©°, μ΄λ Binderλ₯Ό λ°ννλ€.
- μ΄ κ°μ²΄λ₯Ό ν΅ν΄ μ‘ν°λΉν°μ μλΉμ€λ ν΅μ ν μ μκ² λλ€.
-
ServiceConnection κ°μ²΄ μ μ
- μ‘ν°λΉν°μ κ°μ μ»΄ν¬λνΈλ₯Ό μλΉμ€μ μ°κ²°νλ €λ©΄ ServiceConnection κ°μ²΄κ° νμνλ€.
- μ΄ κ°μ²΄λ λ κ°μ§ μ½λ°± λ©μλ μ 곡
- 첫 λ²μ§Έλ μλΉμ€μ μ°κ²°λμλμ§ μ μ μλ μ½λ°±
- λ λ²μ§Έλ μλΉμ€κ° μμ€ν μ μν΄ κ°μ λ‘ μ’ λ£λμμ λ κ°μ§ν μ μλ μ½λ°±
- λ©μΈμ‘ν°λΉν°μ ServiceConnection κ°μ²΄λ₯Ό μ μνκ³ ,
- onStart() λ©μλμμ bindService() λ©μλλ‘ μλΉμ€μ μ°κ²°νλ€.
- μ‘ν°λΉν°κ° ν¬κ·ΈλΌμ΄λμμ λμ μ€μ΄ μλ λλ μλΉμ€μ μ°κ²°μ ν΄μ ν΄μΌ νλλ°, onStop() λ©μλμμ unBindService() λ©μλλ‘ μ°κ²°μ ν΄μ νλ€.
@Override protected void onStart() { super.onStart(); // μλΉμ€μ λ°μΈλ© Intent intent = new Intent(this, MyService.class); bindService(intent, mConnection, BIND_AUTO_CREATE); } @Override protected void onStop() { super.onStop(); // μλΉμ€μ μ°κ²° ν΄μ if (mBound) { unbindService(mConnection); mBound = false; } } /** * bindService() λ₯Ό ν΅ν΄ μλΉμ€μ μ°κ²°λ λμ μ½λ°± μ μ */ private ServiceConnection mConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { // MyBinderμ μ°κ²°λ κ²μ΄λ©° IBinder νμ μΌλ‘ λμ΄μ€λ κ²μ μΊμ€ν νμ¬ μ¬μ© MyService.MyBinder binder = (MyService.MyBinder) service; mService = binder.getService(); mBound = true; } @Override public void onServiceDisconnected(ComponentName name) { // μκΈ°μΉ μμ μ’ λ£ } };
- μ¬κΈ°μ ServiceConnection κ°μ²΄μ μ½λ°± μ€μ onServiceDisconnected() λ©μλλ μλΉμ€μ μ°κ²°μ μ’ λ£ν λ νμ νΈμΆλλ μ½λ°±μ΄ μλλΌ, κ°μ μ’ λ£μ κ°μ μκΈ°μΉ μμ μ’ λ£μλ§ νΈμΆλλ€.
- onStart() λ©μλμμ bindService() λ©μλμ μΈ λ²μ§Έ νλΌλ―Έν°μΈ νλκ·Έλ‘ BIND_AUTO_CREATE κ° μ€μ λμ΄ μλ€. μλΉμ€μ μ°κ²°νλ €λ©΄ μλΉμ€κ° μμλμ΄μΌ νλλ° μ΄ νλκ·Έλ₯Ό μ€μ νλ©΄ μλΉμ€λ₯Ό λ°λ‘ μμνμ§ μκ³ λ λ°μΈλ μλΉμ€λ₯Ό μ¬μ©ν μ μλ€.
- onServiceConnected() λ©μλκ° νΈμΆλλ©΄ μλΉμ€μ μ μ°κ²°λ κ²μ΄λ©°, μ΄λ μλΉμ€μμ Binder κ°μ²΄κ° λμ΄μ€λ μ¬κΈ°μ getService() λ©μλλ₯Ό ν΅ν΄ μ°κ²°λ μλΉμ€μ μΈμ€ν΄μ€λ₯Ό μ°Έμ‘°ν μ μλ€.
-
λ°μΈλ© μν νμΈ
-
μ±μ μ€ννκΈ° μ μ μ‘ν°λΉν°μ μλΉμ€μ μ°κ²° μνλ₯Ό λͺ¨λν°λ§νκΈ° μν΄ λ‘κ·Έ μΆκ°
@Override public IBinder onBind(Intent intent) { Log.d(TAG, "onBind: "); return mBinder; } @Override public boolean onUnbind(Intent intent) { Log.d(TAG, "onUnbind: "); return super.onUnbind(intent); }
-
onBind() μ λ°λλ‘ onUnBind() λ μ°κ²°μ΄ λμ΄μ‘μ λ νΈμΆλλ λ©μλ
-
-
xml νμΌμ μΉ΄μ΄ν κ° μΆλ ₯ λ²νΌ μΆκ°
-
λ©μΈ μ‘ν°λΉν°μμ ν μ€νΈ κ°μ΄ λμ¬ μ μλλ‘ getCountValue() λ©μλ μμ
public void getCountValue(View view) { if (mBound){ Toast.makeText(this, "μΉ΄μ΄ν : " + mService.getCount(), Toast.LENGTH_SHORT).show(); } }
- μ±μ μ€ννμ¬ <μΉ΄μ΄ν κ° μΆλ ₯> λ²νΌμ λλ₯΄λ©΄ 0μ΄ νμλλ€.
- <μλΉμ€ μμ>μ λλ₯Έ ν <μΉ΄μ΄ν κ° μΆλ ₯> λ²νΌμ λλ₯΄λ©΄, μΉ΄μ΄ν κ°μ΄ λ³νλ κ²μ νμΈν μ μλ€.
- μ°Έκ³ λ‘ λ°μΈλ μλΉμ€κ° λ°μΈλ μ€μΌ λλ λ°μΈλ ν΄μ λ λκΉμ§ stopService() λ‘ μλΉμ€λ₯Ό μ’ λ£ν μ μλ€.
- startService() λ κ°λ₯νλ€. λ°λΌμ μ΄μ λΆν°λ μλΉμ€ μμ νμ <μλΉμ€ μ€μ§>λ₯Ό λλ¬λ μλΉμ€κ° μ’ λ£ X
public class ExampleService extends Service {
int mStartMode; // START_NOT_STICKY λ±μ νλκ·Έ
IBinder mBinder; // λ°μΈλ© κ°μ²΄
boolean mAllowRebind; // μ¬ λ°μΈλ©μ νμ©ν μ§ μ¬λΆ
@Override
public void onCreate() {
// μλΉμ€ μμ±
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// startService()μ μν΄ μλΉμ€ μμ
return mStartMode;
}
@Override
public IBinder onBind(Intent intent) {
// bindService()μ μν΄ ν΄λΌμ΄μΈνΈμ μλΉμ€ μ°κ²°
return mBinder;
}
@Override
public boolean onUnBind(Intent intent) {
// unBindService()μ μν΄ ν΄λΌμ΄μΈνΈμ μ°κ²° ν΄μ
return mAllowRebind;
}
@Override
public void onRebind(Intent intent) {
// bindService()μ μν΄ ν΄λΌμ΄μΈνΈμ μλΉμ€ μ°κ²° ν
// onUnbind() νΈμΆ ν λ€μ λ°μΈλ©
}
@Override
public void onDestroy() {
// μλΉμ€ μ’
λ£
}
}
- λ°μΈλ μλΉμ€λ λ°μΈλ©μ΄ ν΄μ λλ©΄ μλλ‘μ΄λ μμ€ν μ΄ μλΉμ€λ₯Ό μ’ λ£νλ―λ‘ κ°λ°μκ° μλͺ μ£ΌκΈ°λ₯Ό μ κ²½ μ°μ§ μμλ λλ€.
- νμ§λ§ onStartCommand() λ©μλλ‘ μμλ μ€ννΈ μλΉμ€λ λ°μΈλ© μ¬λΆμ κ΄κ³μμ΄, κ°λ°μκ° μλͺ μ£ΌκΈ°λ₯Ό κ΄λ¦¬ν΄μΌ νλ€.
- μ€ννΈ μλΉμ€λ stopSelf()λ stopService()λ©μλλ₯Ό νΈμΆνκΈ° μ κΉμ§ κ³μ μ€νλκΈ° λλ¬Έμ΄λ€.
- μ€ννΈ μλΉμ€κ° λ°μΈλ©μ νμ©ν λ λ€μμ λ°μΈλ© μ onRebind() λ©μλλ₯Ό νΈμΆλ°κ³ μΆλ€λ©΄ onUnbind() λ©μλμμ trueλ₯Ό λ°ννλλ‘ ν μ μλ€.
- μ΄ λλ ν΄λΌμ΄μΈνΈμμλ onServiceConnected() μ½λ°±μμ λ°μΈλλ₯Ό μ»κ² λλ κ²μ κ°λ€. μλΉμ€κ° ν΄λΌμ΄μΈνΈλ‘λΆν° νμ μλ‘μ΄ μ μμΌλ‘ μ·¨κΈνλλ, μλλ©΄ μ μκ³Ό μ¬μ μμ νμ©νλλμ μ°¨μ΄μ΄λ€.