안녕하세요?


이번 포스팅에서는 서비스(Service)라고 해서, 백 그라운드에서 실행되는 프로세스를 의미하는 것을 실습해 보았고, 그 내용을 포스팅하고자 합니다. 생각보다 실습해 보니까, 그 양이 많아져서 포스팅을 2개로 나누어서 올리고자 합니다. 이번 포스팅에서는 서비스를 생성하고, 거기다가 데이터를 전달하는 것을 포스팅하겠습니다.


먼저 SampleService라는 프로젝트를 생성하고, Package explorer에서 아래 스크린샷과 같이 java폴더에서 우클릭을 해서 서비스를 생성하는 메뉴를 불러 오도록 합니다.



New메뉴 아래에 있는 Service항목이 있으며, 거기서 저는 그냥 Service라고 되어 있는 항목을 클릭하였습니다. 서비스의 이름은 디폴트로 설정된 이름인 MyService라는 것으로 지정을 하고, 나머지는 하나도 건드리지 않고 그대로 생성을 시켰습니다.



서비스를 실행시키고 나면 위 스크린샷에서 보이는 것 처럼, MyService.java라는 파일이 생성이 되면서, 기본적인 몇 가직 코딩이 되어 있는 것을 볼 수 있습니다. 이제 아래의 스크린샷에서 보이는 것 처럼, MyService.java파일 안에다가 우클릭을 하고서, Generate메뉴를 눌러서 Override Methods를 클릭합니다.


onCreate(), onDestroy(), onStartCommand()라는 메소드를 선택한 다음 OK버튼을 눌러서 선택된 메서드 들이 실행이 되도록 합니다.



먼저 onStartCommand()메소드아래에서 위 스크린샷처럼 빨간줄이 쳐지면서 에러가 뜨는데, 이 부분만을 삭제하도록 하였습니다.



다음으로는 activity_main.xml의 design탭으로 가서 입력상자 하나와 버튼하나를 배치하도록 합니다. 이번에도 onClick속성을 지정하도록 합니다.



이번에는 MainActivity.java에서 위 스크린샷처럼 코딩을 시작합니다. 여기서 중요한 형식은 이전 같으면 startActivity()로 되었겠지만, 이번에는 서비스를 생성했기 때문에 startService()로 시작을 합니다.


Intent 변수1 = new Intent(this,서비스명.class);

startService(변수1);


이어서 인텐트에 데이터를 넣기 위해서 putExtra() 메소드가 사용된 것도 볼 수 있습니다. 


변수1.putExtra("데이터 이름", 데이터 내용);


여기서 데이터 이름이라는 것은 어떤 데이터인지 알 수 있도록 이름으로, 가령 일련의 두자리수 숫자를 입력할 경우 [시험성적]같은 식으로 지정할 수 있습니다. 그리고 당연 데이터 내용이란 실질적으로 들어가는 숫자나 문자열을 의미합니다.




다음으로는 MyService.java로 가서 위 스크린샷과 같이 코딩을 합니다. 여기서는 Log.d라고 해서 debug를 위해서 로그를 출력하는 메소드입니다. 이 메소드로 로그 출력을 위해서는 첫번째로 문자열을 써야 하는데, 여기서는 위 스크린샷에 보시는 것처럼 "MyService"라는 문자열을 사용하였습니다.


Private static final String TAG = "MyService";


위 구문에서 TAG란 MyService라는 것을 의미합니다. 그래서 아래에서 Log.d()메소드를 다음과 같이 작성하게 됩니다.


Log.d("문자열","로그에 출력할 문구");


위 스크린샷에서는 Log.d(TAG,"로그에 출력할 문구");로 되어 있지만, TAG항목 대신에 "MyService"를 입력해도 됩니다. 다만 일일이 이렇게 여러번 입력하는 것이 번거롭기 때문에 여기서는 TAG로 간단하게 바꾼 것으로 보입니다.



이어서 onStartCommand()메소드의 코딩을 시작합니다. 먼저 onStartCommand()메서드는 인텐트 객체를 전달 받는 메서드인데, 여기서 if 구문을 먼저 다음과 같이 두어서, 인텐트가 비었는지 여부를 체크하게 합니다.


if (변수1 == null){return Service.START_STICKY;}


여기서 변수1은 당연히 MainActivity.java에서 지정하였는 그 변수1로 startService(변수1); 에 들어가 있던 그 변수1입니다. 그리고 뒤에 따라오는 return Service.START_STICKY;는 서비스가 비정상적으로 종료되었을 시에 시스템을 자동으로 재시작하라는 의미입니다.


그리고 이어지는 else이하의 구문은 실질적으로 행동을 하는 구문인데, 너무 많은 코드를 쓰면 지저분해 보일 수 있으므로 따로 메서드를 임의로 지정-processCommand()라는 메서드로 지정해서 넣었습니다. 아직 이 메서드가 어떤 것인지 정의하지 않았기 때문에 에러라고 빨간줄이 켜져 있는 것을 볼수 있습니디ㅏ. 그리고 그 아래에 있는 return super.onStartCommand()는 그대로 두었습니다.



다음으로는 processCommand()라는 메소드를 정의하는 코딩을 하였습니다. 먼저 여기서는 인텐트를 받기 때문에 당연 (Intent 변수1)을 주어야 했습니다. 저는 정확하게는 모르지만, 실제로 해보니 저 구문을 안 쓰면 에러가 발생하였습니다. 아마 인텐트를 받는 메서드를 정의할 때는 어떤 인텐트인지도 지정을 해야 하는 가 봅니다.


String 변수2 = 변수1.getStringExtra("데이터 이름");


이 구문은 인텐트인 변수1에서 문자열(String)형태의 데이터를 가져오고자 할때 사용이 되는 구문입니다. 당연 여기서는 문자열을 가져오기 때문에 getStringExtra이며, 정수형태의 데이터라면 getIntExtra()메서드가 사용되게 됩니다. 그리고 이어서 아래에 이어지는 Log.d()메서드에서 이 변수2에 해당하는 command와 name을 가지고서 따로 출력할 로그를 작성하게 됩니다.



다음으로는 위 스크린샷과 같은 코딩을 이어가는데, 여기서는 for문이 등장하게 됩니다. 이 for문은 반복문인데, 다음과 같은 의미를 지니고 있습니다.


for(시작시 조건 ; 언제까지 반복할 것인지 정하는 조건 ; 반복되는 동안 할 것


이렇게 구성이 됩니다. 그래서 for(int i=0;i<5;i++)는 다음과 같은 의미가 됩니다.


시작시 조건 => 정수인 변수 i는 시작시 0이다.

언제까지 반복할 것인가? => i가 5 미만이면 계속 반복한다.

반복되는 동안 할 것 => i에 +1씩 더한다.


그리고 위 스크린샷에서 보시면 알 수 있는 것이 Thread.sleep(1000);이라는 것이 있는데, 이 구문의 의미는 다음과 같습니다.


Thread.sleep(밀리초);


밀리초(1000 = 1초)만큼 실행중에 잠시 대기를 하라 는 의미입니다. 


이제 준비는 갖추어 졌고, USB에 스마트폰을 연결해서 실제로 실행을 시켜 보았습니다. 서비스의 경우는 눈에 보이는 것이 아니라서, 안드로이드 스튜디오의 하단 화면에서 logcat이라는 것을 열어 보아야 합니다. 



위 스크린샷을 보시면 Android Monitor에서 logcat이라는 항목이 있는 것을 볼 수 있습니다. 그리고 위에서 코딩된 로그가 제댁로 나와서 [command : show, name : Name]이라는 항목이 뜨는 것도 볼 수 있습니다. 


이것으로 1차적으로 액티비티에서 서비스로 데이터를 보내는 것에는 성공하였습니다. 그럼 이제는 반대로 서비스에서 액티비티로 데이터를 보내서 처리하는 것을 실습해 봐야 하는데, 여기까지 하는데 많은 분량이 걸려서 포스팅을 부득이하게 반으로 나누게 되었습니다.

+ Recent posts

티스토리 툴바