본문 바로가기

Programming

Android - 액티비티 <-> 서비스 통신

Messenger 클래스를 사용하여 액티비티와 서비스간에 통신을 위한 방법을 정리한다.


Messenger 클래스는 Handler를 Wrapping 하는 역할을 한다는데, 자세한건 검색 ㄱㄱ.



액티비티 코드

Messenger mOutputMessenger;

Messenger mInputMessenger;


protected void onCreate(Bundle savedInstanceState) {

Intent intent = new Intent(this, SocketService.class);

startService(intent);


mInputMessenger = new Messenger(mHandler);

}


@Override

protected void onResume() {

super.onResume();

Intent intent = new Intent("com.example.SOCKETSERVICE");

bindService(intent, mSockSrvCon, BIND_AUTO_CREATE);

}


@Override

protected void onPause() {

super.onPause();

unbindService(mSockSrvCon);

}


ServiceConnection mSockSrvCon = new ServiceConnection() {

@Override

public void onServiceDisconnected(ComponentName name) {

mOutputMessenger = null;

}

@Override

public void onServiceConnected(ComponentName name, IBinder service) {

mOutputMessenger = new Messenger(service);

Message msg = new Message();

msg.replyTo = mInputMessenger;

msg.what = ValueDefine.SERVICE_HANDLE_MSG_REGISTER_MESSENGER;

msg.arg1 = ValueDefine.LOGIN_ACTIVITY;

try {

mOutputMessenger.send(msg);

} catch (RemoteException e) {

e.printStackTrace();

}

}

};


Handler mHandler = new Handler(){

public void handleMessage(Message msg) {

switch(msg.what){

case 1:

break;

default:

break;

}

}

};



서비스 코드

HashMap<Integer, Messenger> mMessengerList = new HashMap<Integer, Messenger>();


@Override

public IBinder onBind(Intent intent) {

return new Messenger(mHandler).getBinder();

}


Handler mHandler = new Handler(){

public void handleMessage(Message msg) {

switch(msg.what){

case ValueDefine.SERVICE_HANDLE_MSG_REGISTER_MESSENGER:

mMessengerList.put(msg.arg1, msg.replyTo);

break;

default:

break;

}

}

};




액티비티 -> 서비스

Message msg = new Message();

msg.what = ValueDefine.SERVICE_HANDLE_MSG_SEND_DATA;

msg.arg1 = ValueDefine.MSG_ACCOUNT_REG_REQ;

msg.obj = data.toJSONByte();

try {

mOutputMessenger.send(msg);

} catch (RemoteException e) {

e.printStackTrace();

}


서비스 -> 액티비티

Messenger messenger = null;

Message msg = new Message();

messenger = mMessengerList.get(ValueDefine.REGISTER_ACTIVITY);

if(messenger != null){

msg.what = ValueDefine.MSG_ACCOUNT_REG_RSP;

msg.obj = data;

try {

messenger.send(msg);

} catch (RemoteException e) {

e.printStackTrace();

}

}