android activity, service 에서 서로 데이터를 주고 받는 예제 입니다.
참고 url
https://bitbucket.org/alexfu/androidserviceexample/src
간단하게 서비스를 시작할때
bindService를 통해 내가 만든 Messenger를 서비스로 던져 놓고 데이터를 받는 방식입니다.
작업 내용 - MainActivity.java
public class MainActivity extends AppCompatActivity { private Messenger mServiceMessenger = null; private boolean mIsBound; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button send = (Button) findViewById(R.id.send); send.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // 메시지를 서비스로 전달 sendMessageToService("from main"); } }); // 서비스 시작 setStartService(); } /** 서비스 시작 및 Messenger 전달 */ private void setStartService() { startService(new Intent(MainActivity.this, ControlService.class)); bindService(new Intent(this, ControlService.class), mConnection, Context.BIND_AUTO_CREATE); mIsBound = true; } /** 서비스 정지 */ private void setStopService() { if (mIsBound) { unbindService(mConnection); mIsBound = false; } stopService(new Intent(MainActivity.this, ControlService.class)); } private ServiceConnection mConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName componentName, IBinder iBinder) { Log.d("test","onServiceConnected"); mServiceMessenger = new Messenger(iBinder); try { Message msg = Message.obtain(null, ControlService.MSG_REGISTER_CLIENT); msg.replyTo = mMessenger; mServiceMessenger.send(msg); } catch (RemoteException e) { } } @Override public void onServiceDisconnected(ComponentName componentName) { } }; /** Service 로 부터 message를 받음 */ private final Messenger mMessenger = new Messenger(new Handler(new Handler.Callback() { @Override public boolean handleMessage(Message msg) { Log.i("test","act : what "+msg.what); switch (msg.what) { case ControlService.MSG_SEND_TO_ACTIVITY: int value1 = msg.getData().getInt("fromService"); String value2 = msg.getData().getString("test"); Log.i("test","act : value1 "+value1); Log.i("test","act : value2 "+value2); break; } return false; } })); /** Service 로 메시지를 보냄 */ private void sendMessageToService(String str) { if (mIsBound) { if (mServiceMessenger != null) { try { Message msg = Message.obtain(null, ControlService.MSG_SEND_TO_SERVICE, str); msg.replyTo = mMessenger; mServiceMessenger.send(msg); } catch (RemoteException e) { } } } } }
ControlService.java
public class ControlService extends Service { public static final int MSG_REGISTER_CLIENT = 1; //public static final int MSG_UNREGISTER_CLIENT = 2; public static final int MSG_SEND_TO_SERVICE = 3; public static final int MSG_SEND_TO_ACTIVITY = 4; private Messenger mClient = null; // Activity 에서 가져온 Messenger @Override public void onCreate() { super.onCreate(); Button send_service = (Button) mView.findViewById(R.id.send_service); send_service.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { sendMsgToActivity(1234); } }); } @Override public IBinder onBind(Intent intent) { return mMessenger.getBinder(); } /** activity로부터 binding 된 Messenger */ private final Messenger mMessenger = new Messenger(new Handler(new Handler.Callback() { @Override public boolean handleMessage(Message msg) { Log.w("test","ControlService - message what : "+msg.what +" , msg.obj "+ msg.obj); switch (msg.what) { case MSG_REGISTER_CLIENT: mClient = msg.replyTo; // activity로부터 가져온 break; } return false; } })); private void sendMsgToActivity(int sendValue) { try { Bundle bundle = new Bundle(); bundle.putInt("fromService", sendValue); bundle.putString("test","abcdefg"); Message msg = Message.obtain(null, MSG_SEND_TO_ACTIVITY); msg.setData(bundle); mClient.send(msg); // msg 보내기 } catch (RemoteException e) { } } }
결과화면
각각 버튼을 눌러 messenger를 통해 메시지를 주고 받았습니다.
'Android' 카테고리의 다른 글
[안드로이드] App cash data 앱 캐시 지우기 예제 (1) | 2017.05.01 |
---|---|
[안드로이드] Directory 생성, file list 가져오기 (0) | 2017.05.01 |
[안드로이드] 최상단 위치에 View 뛰우기 (Service, overlay, M check permission) (4) | 2017.04.29 |
[안드로이드] AppCompatSeekBar 최소,최대,스텝(Min, Max, Setp) 설정하기 (0) | 2017.04.27 |
[안드로이드] org.apache.log4j.chainsaw.ControlPanel: can't find superclass or interface javax.swing.JPanel 오류 대응 (0) | 2017.04.25 |