2011년 6월 20일 월요일

Android - Activity에서 Service 호출하기

상황
어느 Activity 에서 특정 이벤트를 발생 시켰을때 자신이 생성한 Service를 호출 하고 싶은경우

예) 위젯 설정 Activity에서 위젯의 바탕화면 이나, 폰트 등을 설정하였을경우 이게 바로 위젯으로 적용되었으면 하는 경우


Activity와 Service와 호출 하기 위해 aidl 이란걸 사용한다.

1. aidl 정의 (jh/project/widget/digital/biorhythm/IBiorhythmClockService.aidl)


package jh.project.widget.digital.biorhythm;

interface IBiorhythmClockService {
void updateWidgetIF();
}



2. Service에서 aidl Interface 구현, onBind 구현

package jh.project.widget.digital.biorhythm;

public class BiorhythmClockService extends Service{
    ...
    ...
    ...
    public class BiorhythmClockServiceImple extends IBiorhythmClockService.Stub {
@Override
        public void updateWidgetIF() throws RemoteException {
readAgain = true;
updateWidget();
        }
    }

    public IBinder onBind(Intent intent) {
    return new BiorhythmClockServiceImple();
    }

    private void updateWidget() {
       //Do Something
    }
    ...
    ...
    ...
}



3. Activity에서 해당 Interface 호출

package jh.project.widget.digital.biorhythm;

public class Configuration extends{

//Interface, ServiceConnection 정의
private IBiorhythmClockService biorhythmClockService = null;
private ServiceConnection biorhythmClockConn = new ServiceConnection() {
public void onServiceDisconnected(ComponentName p_name) {
biorhythmClockService = null;
}

public void onServiceConnected(ComponentName name, IBinder service) {
biorhythmClockService = IBiorhythmClockService.Stub.asInterface(service);
//callService();
}
};
      
        //binding 시작
protected void onStart() {
super.onStart();
bindService(new Intent(IBiorhythmClockService.class.getName()), biorhythmClockConn, Context.BIND_AUTO_CREATE);
}

        //binding 종료
protected void onStop() {
super.onStop();
unbindService(biorhythmClockConn);
}

//Interface 함수 호출하는 함수
private void callService() {
try {
biorhythmClockService.updateWidgetIF();
} catch(RemoteException e) {
Toast toast = Toast.makeText(this, "ERROR - " + e.getMessage(), Toast.LENGTH_SHORT);
toast.show();
}
}

// 뭔가 이벤트가 발생하면 위에서 만든 함수를 실행해서 Service에 함수를 호출한다.
//(Configuration.onClick() -> Configuration.callService() -> IBiorhythmClockService.updateWidgetIF() -> BiorhythmClockService.updateWidget() 순으로 실행된다.)

public void onClick(View v) {
...
...
...
callService();
...
...
...
}

}


※ 알고있는것을 말, 글로 표현한다는건 엄청 어려운일.
혹시 추가 코멘트나, 잘못된 정보 지적등 댓글 받습니다.