woong's
Android service Message 전송하기 본문
Android service Message 전송하기
안녕하세요. Android Service 를 사용하다 보면 , Activity 에서 Service 의 메서드를 호출 해야 하는 경우가 있습니다 .
이경우 Aidl 을 통해서 Activity 에서 Service 의 메서드를 호출 할 수 있습니다 .
Service 를 호출 하기 위해서는 Aidl 이라는 파일이 필요 합니다 .
제가 사용한 Aidl 파일 입니다.
Service 와 통신을 하기위해서는 Aidl 파일이 필요 합니다 .
여기서 사용하고자 한 sayHello 메서드는 Service 에 구현 됩니다.
1 2 3 4 5 | package com.example.service; interface IMessageService { String sayHello(String name); } |
제가 사용한 Service 입니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | package com.example.service; import android.app.Service; import android.content.Intent; import android.os.IBinder; import android.os.RemoteException; public class TestService extends Service { @Override public IBinder onBind(Intent intent) { return serviceStub; } @Override public int onStartCommand(Intent intent, int flags, int startId) { System.out.println("서비스 Start"); return super.onStartCommand(intent, flags, startId); } @Override public void onDestroy() { super.onDestroy(); System.out.println("서비스 Finish"); } public IMessageService.Stub serviceStub = new IMessageService.Stub() { @Override public String sayHello(String name) throws RemoteException { System.out.println("메세지 수신 : " + name); return "Hello " + name; } }; } |
위 코드를 보시면 하단의 serviceStub 를 보시면 sayHello 가 구현 되어 있는 것을 볼 수 있습니다 .
Aidl 을 통해서 틀을 갖추고 Service 에 구현하여 Activity에서 위 구현 코드를 호출하게 됩니다.
Activity 에서 Service 를 호출 하는 부분 입니다 .
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | package com.example.servicetest; import android.app.Activity; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.os.Bundle; import android.os.IBinder; import android.os.RemoteException; import android.view.View; import com.example.service.IMessageService; import com.example.service.TestService; public class MainActivity extends Activity { private Intent intent; private IMessageService messageService; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Intent service = new Intent(MainActivity.this, TestService.class); startService(service); } public void startService(View view){ // 명시적 등록 intent = new Intent(MainActivity.this, TestService.class); //서비스 시작 startService(intent); bindService(intent,conn, Context.BIND_AUTO_CREATE); } public void finishService(View view){ //서비스 종료 stopService(intent); unbindService(conn); } public void sendMessage(View view){ try { messageService.sayHello("인웅"); } catch (RemoteException e) { e.printStackTrace(); } } /** * Bind 되는 시점에 호출 */ private ServiceConnection conn = new ServiceConnection (){ public void onServiceDisconnected(ComponentName name){} @Override public void onServiceConnected(ComponentName name, IBinder service) { messageService = IMessageService.Stub.asInterface(service); } }; } |
위 Activity 코드를 보면 service 를 등록 / 해제 하는 것을 볼 수 있습니다 .
이외의 하나의 메서드가 더 있는데 최하단의 Connection 이 있습니다 .
이 Connection 을 통해서 Service 를 제어 할수 있는 IBinder 를 넘겨 받습니다 .
IBinder 를 통해서 Service 의 메서드를 호출 할 수 있습니다 .
위 sendMessage 를 보면 sayHello 를 호출 하는 것을 볼 수 있습니다.
이번에 작성한 포스트는 Activity 에서 Service 메서드를 호출 하는 형태입니다 .
Service 에서 Activity를 호출하는 방법은 다음 포스트를 통해서 작성해 보도록 하겠습니다 .
첨부파일로 해당 프로젝트를 첨부 하였습니다 . 위 글로 이해가 안되신다면 한번
깔아서 설치 해보고 코드를 보시는것도 좋을것 같습니다 .
'Develop > Android' 카테고리의 다른 글
Android 내부 연락처 정보 가져오기 (1) | 2016.02.14 |
---|---|
Android service Message 전송하기(서비스 에서 액티비티 호출) (0) | 2016.02.14 |
Android Intent Flag 사용하기 (0) | 2016.02.14 |
Android 내장 Music 불러오기 (1) | 2016.02.14 |
Android Service 사용 하기 (0) | 2016.02.14 |