안드로이드 스튜디오 프로그래밍_액티비티에서 서비스로 데이터 전달_예제포함
유튜브를 보는 중에 카톡 알림을 받은 적이 있을 것입니다. 이렇게 카톡 앱을 화면에 띄우지도 않아도 카톡 알림을 받을 수 있는 이유는 화면 뒤의 공간인 백그라운드에서 실행되는 "서비스"가 있기 때문입니다. 오늘은 안드로이드 앱의 구성 요소의 하나이기도 한 "서비스"에 대해 알아보겠습니다.
우리는 "서비스"를 통해서 단말이 항상 실행되어 있는 상태로 데이터를 주고받을 수 있습니다.
이 "서비스"를 시작하기 위해서는 간단히 startService() 메소드를 호출하면 됩니다. 그럼 이렇게 메모리에 서비스가 생성이 됩니다.
만약 서비스 실행 후에도 이 메서드를 호출하면 어떻게 될까요? 여러 서비스가 실행될까요?
답은 아니요 입니다. 메서드를 여러 번 호출해도 서비스는 이미 메모리에 만들어진 상태로 유지됩니다.
따라서 startService() 메서드는 서버를 시작하는 목적 이외에 인텐트를 전달하는 목적으로 자주 사용됩니다.
startService() 메서드를 호출할 때는 인텐트 객체를 파라미터로 전달하게 되는데, 이 인텐트 객체 안에 어떤 서비스를 실행할 것인지에 대한 정보를 담고 있습니다.
대략적인 개념은 여기까지 설명하고, 서비스가 동작하는 방식을 이해하기 위해 간단한 예제를 따라해보도록 하겠습니다.
액티비티에서 데이터를 서비스로 보내서 실행시키겠습니다.
※ 코드는 이지스퍼블리싱 안드로이드 프로그래밍 개정10판 6-1장 부분을 참고했습니다.
새로운 프로젝트를 생성하고, 상단 메뉴바에서 [File] - [New] - [Service] - [Service] 클릭하세요.
다음에 나타나는 대화상자에서 클래스 이름을 넣고 만듭니다. 저는 MyService 그대로 하겠습니다.
새로운 서비스가 만들어지면 MyService.java 파일이 만들어지는 것뿐만 아니라 AndroidManifest.xml파일 안에 <service> 태그도 추가됩니다. 서비스는 시스템에서 관리하기 때문에 매니페스트에 넣어 앱 설치 시에 시스템이 알 수 있어야 합니다.
다음 MyService.java 파일을 보겠습니다. 여기에는 자동으로 만들어진 생성자 메서드와 onBind()메서드만 있습니다.
서비스의 수명주기를 관리하기 위해 onCreate(), onDestory(), 메서드와 인텐트 객체를 전달받기 위한 onStartCommand()메서드를 추가하겠습니다. (수명주기와 관련해서는 따로 글을 쓰겠습니다.)
클래스 안에 마우스 커서를 두고 마우스 오른쪽 버튼을 누릅니다. 팝업메뉴에서 [Generate -> Override..]
넣을 메서드들을 Ctrl 누른 채로 다중 선택해서 OK 버튼을 누릅니다.
이제 activity_main.xml 파일에 버튼와 입력상자를 만들어줍니다. 버튼을 누르면 입력 상자에 입력한 글자를 서비스에 전달하도록 만들 것입니다.
서비스에 데이터를 전달할 때는 startService() 메서드를 사용하여 인텐트 안에 부가 데이터를 추가하여 전달하면 됩니다. 코드를 보겠습니다.
MainActvity.java
MyService.java
onStartCommand에서 인텐트를 받아서 null이면 Service.START_STICKY를 반환합니다. 이 값은 서비스가 비정상적으로 종료되었다는 뜻이므로 시스템이 서비스를 재시작합니다.
null이 아니면 processCommand메서드를 실행시킵니다. 구현하고 싶은 기능은 바로 이 안에 넣어도 되지만 코드가 복잡하게 보일 수 있어 메서드를 따로 만들었습니다.
processCommand를 보시면 getStringExtra메서드를 통해서 인텐트에서 부가 데이터를 가져올 수 있게 하였습니다.
for문을 사용해 5초 동안 1초에 한 번씩 로그를 출력합니다.
그 아래 onBind() 메서드가 있는데요. 서비스가 서버 역할을 하면서 액티비티와 연결될 수 있도록 만드는 것을 바인딩이라고 합니다. 이를 위해서 이 메서드를 재정의해야 합니다. 하지만 여기서는 바인딩 기능을 사용하지 않으므로 메서드가 정의된 상태로 두면 됩니다.
이제 앱을 실행하고 화면에 보이는 버튼을 클릭하면 서비스가 실행됩니다. 서비스는 화면에 보이지 않으므로 안드로이드 스튜디오 창 하단에 보이는 [Logcat]탭에서 어떤 로그가 출력되는지 확인하면 됩니다.
잘 되네요. 오늘은 액티비티에서 서비스로 데이터를 전달하는 원리를 간단하게 살펴보았습니다.
그럼 다음 글에서는 서비스에서 액티비티로 데이터를 전달하는 방법에 대해 알아보겠습니다.
⁉️ 셀프 복습 질문 ⁉️
1. 새로운 서비스가 만들어지면 MyService.java 파일이 만들어지는 것뿐만 아니라 AndroidManifest.xml 파일 안에 <service> 태그도 추가되는 이유는?
2. 인텐트에 부가데이터 넣을 때 사용하는 메서드는?
( 답이 바로 생각나지 않는다면 한 번 더 이 글을 읽어보세요. 꼭이요!!!)
답
(드래그 하세요)
1 서비스는 시스템에서 관리하기 때문에 매니페스트에 넣어 앱 설치 시에 시스템이 알 수 있어야 하기 때문
2 putExtra()
'컴퓨터 공학 > Android' 카테고리의 다른 글
[ 안드로이드 프로그래밍 ] 토스트 메시지 위치 변경하기 (1452) | 2020.04.08 |
---|---|
[ 안드로이드 프로그래밍 ] 간단한 예제로 서비스 이해하기2 (서비스에서 액티비티로 데이터 전달) (1953) | 2020.04.07 |
[안드로이드 스튜디오] 오류 해결_HardCoded (1843) | 2019.12.27 |
[안드로이드 스튜디오]로그캣 필터 사용 방법 (1648) | 2019.12.11 |
[안드로이드 스튜디오] 데드락 발생 이유? (1971) | 2019.12.09 |
댓글