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를 통해 메시지를 주고 받았습니다.


+ Recent posts