옆에 김대리가 구현하는 도중에
onReceive 과 onUpdate 두군데 모두 Service 를 호출하는 로직을 넣어서 프로그램이 로딩되면서 Service 가 두 번 호출되는 문제가 있다고 도움을 요청한다.
그래서 그럼 둘중에서 한군데는 빼면 되지 않냐고 물어보니 그렇게 하면 바탕화면의 위젯에서 터치를 해도 동작하지 않는 오류가 있다고..
소스를 보니 바탕화면의 위젯에서 버튼을 터치하면 중앙부분의 숫자가 바뀌는 로직이 Service 에 들어가 있다.
그리고 그 Service 를 manifest 에 정의해 놓았다.
위젯은 태생적으로 Service 를 기본으로 하고 있지만 현재 개발하고 있는 위젯 프로그램은 Service 기능을 사용하지 않는다. 있다면 하루에 한번 기본 그림을 랜덤으로 바꿔주는 정도.
API 를 보니
onReceive 메소드는 호출되는 위젯 프로바이더의 다양한 메소드를 구현해 주는데 Service 기능이 아니면 이곳에 구현해 주면 된다.
onUpdate 메소드는 위젯의 RemoteView 가 요청될때 위젯 프로바이더가 ACTION_APPWIDGET_UPDATE broadcast 에 응답하기 위해서 호출된다.
이말은 Service 가 broadcast 한 것을 받아서 처리해 줄 기능이 있으면 Service 밑에 구현해주면 된다는 뜻인데, 여기서는 매일 한번씩 그림을 랜덤으로 바꿔 주어야 하니 그 부분에 대한 기능만 구현해주면 된다.
Service 밑에 있던, 버튼을 터치하면 그림을 바꿔주는 로직을 onReceive 로 옮기고 RemoteViews 도 하나 만들어 주었다. onUpdate 에는 껍데기만 남겨 두었다.
테스트해보니 잘 돌아간다.
위젯은 Service 를 기본으로 하고 있다. 대표적인 것이 날씨를 받아서 보여주는 프로그램인데 Service 로 띄워야지 사용자의 의도와는 상관없이 시스템에 항상 떠 있으면서 날씨서버에서 데이터를 받아서(1시간에 한번씩 접속한다던지.) 필요하면 밑에서 가공해서 바탕화면의 위젯으로 보여준다.
그래서 위젯과 Service 는 뗄래야 뗄수 없는 관계인데 그렇다고 해서 반드시 모든 기능을 Service 로 구현해 주어야 하는 것은 아니다.
바탕화면의 위젯아이콘에서 받은 이벤트만 처리하면 되는 프로그램일 경우 Service 에서 구현해줄 필요는 없고 onReceive 에서 필요한 기능들을 구현해주면 된다.
이렇게 onReceive 와 onUpdate 를 구분해 주어야 하는 이유는,
두 메소드 모두 안드로이드 callback 메소드로써 프로그램이 처음 로딩될때 호출되는 메소드들이다.
그리고 onReceive 메소드는 바탕화면의 위젯 아이콘에서 이벤트가 발생하면 받아오는 메소드인데 만약 모든 로직을 Service 에 구현해 놓으면 onReceive 에서 Service 를 호출하고 onUpdate 메소드에서도 Service 를 호출해야 하는 사태가 발생한다.
그렇기 때문에 broadcast 해야 할 필요가 없은 기능은 모두 onReceive 에 구현해 주고(필요하면 메소드를 몇개 더 만들어서 불러오면 된다.) 자기 자신을 포함해서 다른 위젯이나 애플들에게 broadcast 할 필요가 있는 기능만 onUpdate 에 구현해 주면 된다.
onReceive 과 onUpdate 두군데 모두 Service 를 호출하는 로직을 넣어서 프로그램이 로딩되면서 Service 가 두 번 호출되는 문제가 있다고 도움을 요청한다.
그래서 그럼 둘중에서 한군데는 빼면 되지 않냐고 물어보니 그렇게 하면 바탕화면의 위젯에서 터치를 해도 동작하지 않는 오류가 있다고..
소스를 보니 바탕화면의 위젯에서 버튼을 터치하면 중앙부분의 숫자가 바뀌는 로직이 Service 에 들어가 있다.
그리고 그 Service 를 manifest 에 정의해 놓았다.
위젯은 태생적으로 Service 를 기본으로 하고 있지만 현재 개발하고 있는 위젯 프로그램은 Service 기능을 사용하지 않는다. 있다면 하루에 한번 기본 그림을 랜덤으로 바꿔주는 정도.
API 를 보니
onReceive 메소드는 호출되는 위젯 프로바이더의 다양한 메소드를 구현해 주는데 Service 기능이 아니면 이곳에 구현해 주면 된다.
onUpdate 메소드는 위젯의 RemoteView 가 요청될때 위젯 프로바이더가 ACTION_APPWIDGET_UPDATE broadcast 에 응답하기 위해서 호출된다.
이말은 Service 가 broadcast 한 것을 받아서 처리해 줄 기능이 있으면 Service 밑에 구현해주면 된다는 뜻인데, 여기서는 매일 한번씩 그림을 랜덤으로 바꿔 주어야 하니 그 부분에 대한 기능만 구현해주면 된다.
Service 밑에 있던, 버튼을 터치하면 그림을 바꿔주는 로직을 onReceive 로 옮기고 RemoteViews 도 하나 만들어 주었다. onUpdate 에는 껍데기만 남겨 두었다.
테스트해보니 잘 돌아간다.
위젯은 Service 를 기본으로 하고 있다. 대표적인 것이 날씨를 받아서 보여주는 프로그램인데 Service 로 띄워야지 사용자의 의도와는 상관없이 시스템에 항상 떠 있으면서 날씨서버에서 데이터를 받아서(1시간에 한번씩 접속한다던지.) 필요하면 밑에서 가공해서 바탕화면의 위젯으로 보여준다.
그래서 위젯과 Service 는 뗄래야 뗄수 없는 관계인데 그렇다고 해서 반드시 모든 기능을 Service 로 구현해 주어야 하는 것은 아니다.
바탕화면의 위젯아이콘에서 받은 이벤트만 처리하면 되는 프로그램일 경우 Service 에서 구현해줄 필요는 없고 onReceive 에서 필요한 기능들을 구현해주면 된다.
이렇게 onReceive 와 onUpdate 를 구분해 주어야 하는 이유는,
두 메소드 모두 안드로이드 callback 메소드로써 프로그램이 처음 로딩될때 호출되는 메소드들이다.
그리고 onReceive 메소드는 바탕화면의 위젯 아이콘에서 이벤트가 발생하면 받아오는 메소드인데 만약 모든 로직을 Service 에 구현해 놓으면 onReceive 에서 Service 를 호출하고 onUpdate 메소드에서도 Service 를 호출해야 하는 사태가 발생한다.
그렇기 때문에 broadcast 해야 할 필요가 없은 기능은 모두 onReceive 에 구현해 주고(필요하면 메소드를 몇개 더 만들어서 불러오면 된다.) 자기 자신을 포함해서 다른 위젯이나 애플들에게 broadcast 할 필요가 있는 기능만 onUpdate 에 구현해 주면 된다.
'Development > Android' 카테고리의 다른 글
특별한 갤럭시S. (0) | 2010.08.05 |
---|---|
Android Life Cycle 다른 그림. (0) | 2010.08.03 |
Android Activity Life Cycle. (0) | 2010.07.26 |
리스트 출력하고 그 중에서 원하는 하나의 정보를 가져오기. (0) | 2010.07.22 |
Android 에서 Thread 생성하고 사용하기. (0) | 2010.07.21 |