마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

Service와 Activity 통신 관련 질문

0 추천
안녕하세요.

 

구글링을 해 보니 Service와 Activity간의 데이터 전달은 BroadcastReceiver를 이용하라고 하던데요

검색실력이 부족해 간단한 예제를 찾지 못하고있습니다. 실력이 미천해 어려운 예제는 봐도 너무 헷갈리더라구요.. 잘모르겠고

 

그래서 이렇게 도움을 구하고자 글을 씁니다.

 

혹시 Service와 Activity간의 데이터 전달을 심플하게 해 줄 수 있는 예제같은것 구할 수 있는 URL 좀

알려주실 수 있을까요 ? 답변으로 알려주셔도 정말 감사하겠습니다.
음무 (17,820 포인트) 님이 2014년 6월 10일 질문

2개의 답변

+1 추천
 
채택된 답변

... 아직도 못하고 계시나보네요.

딱해보여서 핵심 sample code를 적습니다.

 

Service class 부분입니다.

public class TestService extends Service {
    private Messenger mRemote;

    @Override
    public IBinder onBind(Intent intent) {
        return new Messenger(new RemoteHandler()).getBinder();
    }

    // Send message to activity
    public void remoteSendMessage(String data) {
        if (mRemote != null) {
            Message msg = new Message();
            msg.what = 1;
            msg.obj = data;
            try {
                mRemote.send(msg);
            } catch (RemoteException e) {
                e.printStackTrace();
            }
        }
    }

    // Service handler
    private class RemoteHandler extends Handler {

        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
            case 0 :
                // Register activity hander
                mRemote = (Messenger) msg.obj;
                break;
            default :
                remoteSendMessage("TEST");
                break;
            }
        }
    }
}

Acitivity 부분 입니다.

public class MainActivity extends Activity {

    private Messenger mRemote;

    private ServiceConnection mConnection = new ServiceConnection() {
        
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            // service 하고 연결될때
            mRemote = new Messenger(service);

            // Activity handler를 service에 전달하기
            if (mRemote != null) {
                Message msg = new Message();
                msg.what = 0;
                msg.obj = new Messenger(new RemoteHandler());
                try {
                    mRemote.send(msg);
                } catch (RemoteException e) {
                    e.printStackTrace();
                }
            }
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            // service 하고 연결이 끊길때
            mRemote = null;
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // service 연결 시도
        Intent serviceIntent = new Intent(this, TestService.class);
        bindService(serviceIntent, mConnection, Context.BIND_AUTO_CREATE);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();

        // service 연결 해제
        unbindService(mConnection);
    }

    // Test 용 메세지 보내기
    public void testSendMessage() {
        if (mRemote != null) {
            Message msg = new Message();
            msg.what = 1;
            try {
                mRemote.send(msg);
            } catch (RemoteException e) {
                e.printStackTrace();
            }
        }
    }

    // Activity handler
    private class RemoteHandler extends Handler {

        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
        }
    }
}

unbind 하면 service는 그즉시 동작이 멈춥니다.

카라드레스 (2,910 포인트) 님이 2014년 6월 10일 답변
음무님이 2014년 6월 11일 채택됨
와 .. 감동 너무감사합니다 갈길이너무머네요
알려주신 소스코드로 열심히 사용하고있는데 질문이 있습니다.
서비스 -> 액티비티 데이터 전달시 remoteSendMessage() 있잖습니까,
이게 RemoteHandler 클래스 안에 case 0 에서는 전송이 되는데
임의지점에서 전송하려고하면 mRemote가 null값이 들어가있어서 전달이 안됩니다. mRemote가 최초 RemoteHandler에서 msg.obj를 받아서 넣고, 이후 초기화시키는부분이 없는데
왜 remoteSendMessage 하면 if(mRemote != null) { 이 false로 나오는지 모르겠습니다
예를들어 액티비티에 버튼을 넣고, 서비스가 연결된 상태에서
Service에 remoteSendMessage를 하는 메소드를 만든 다음
액티비티에서 그 메소드를 호출하면 remoteSendMessage가 호출이되면서
메시지가 날아와야하는데 mRemote가 null값으로 체크가 돼서 실행이 되지 않습니다.
0 추천

Activity와 Service bind 시에는 일정 시간이 필요 합니다.

곧 바로 연결되는게 아니라서 정상 연결까지는 1~2초간 딜레이가 발생 할 수도 있습니다.

따라서 Activity에서 onServiceConnected  메소드가 call 됬는지 확인 하시고 button을 enable 시키던지 해야 할 것 입니다.

카라드레스 (2,910 포인트) 님이 2014년 6월 11일 답변
...