안녕하세요?

지난번 포스팅에서 앱에서 서비스를 만들고 나서, 그 서비스에다가 인텐트를 통해서 데이터를 전달하는 것을 한번 실습해 보았습니다. 그리고 이번 시간에는 서비스에서 인텐트를 통해 액티비티에다가 데이터를 전달하는 것을 실습해 보았고, 그 내용을 포스팅 하고자 합니다.




먼저 MyService.java에 있는 processCommand()메서드를 정의하는 곳 아래에다가 위 스크린샷에 나와 있는 것 처럼 코딩을 합니다.


Intent 변수1 = new Intent(getApplicationContext(),MainActivity.class);


우선 위 코딩을 하여서, 새로운 인텐트를 생성되도록 합니다. 여기서 변수1은 당연 기존의 다른 인텐트를 지정하는 변수명과 다르게 지정해야 합니다. 왜냐하면 받는 인텐트 따로이며, 보내는 인텐트는 마치 새로운 편지봉투를 준비하는 것 처럼 일일히 준비해 두어야 하기 때문입니다.


그리고 이어지는 코딩은 다음과 같습니다.


변수1.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK|

Intent.FLAG_ACTIVITY_SINGLE_TOP|Intent.FLAG_ACTIVITY_CLEAR_TOP);


여기서 먼저 플래그라는 것을 생성하라는 의미가 됩니다. 저도 정확하게 플래그가 무엇인지는 잘은 모르지만, 일단은 액티비티의 순서를 정리한다는 것은 알고 있습니다. 아무튼 각각의 플래그는 다음과 같은 의미를 지니고 있습니다.


Intent.FLAG_ACTIVITY_NEW_TASK


먼저 서비스는 액티비티처럼 화면이 없기 때문에, 인텐트를 보내기 위해서는 새로 Task를 만들어야 한다고 합니다. 그래서 위 명령어는 Task를 새로 만들어라는 의미입니다.


Intent.FLAG_ACTIVITY_SINGLE_TOP

Intent.FLAG_ACTIVITY_CLEAR_TOP


위 두개의 플래그는 정확하게 제가 그 의미는 모르지만, 설명이 되어 있는 것으로 미루어 보아서는 MainActivity를 다시 재사용 하기 위해서 추가하는 플래그라고 합니다.



다음에 추가되는 구문은 이전 포스팅에서 언급한 것과 마찬가지로 putExtra()메서드를 사용해서 인텐트안에 데이터를 집어넣는 과정을 거치게 됩니다. 그리고 이번에는 서비스가 아니기 때문에, startActivity()메서드를 사용하게 됩니다.



아까전까지 MyService.java에서 인텐트에 데이터를 집어 넣어서 보내기 위한 과정이었다고 하면, 이번에는 MainActivity.java에서 인텐트를 받기 위한 과정을 거칩니다.


먼저 onCreate()는 액티비티가 생성되자 마자 바로 실행이 되는 메서드이기 때문에, 여기서는 getIntent()메서드가 사용이 되었습니다.


Intent 변수1 = getIntent();


이 코딩은 순전히 새로 액티비티가 생성이 되었을 때, 인텐트를 만드는 것이 아니라, MainActivity.java로 전달된 인텐트가 있으면 받으라는 의미입니다. 무엇에 비유를 해야 할까요? 가판대를 설치하자 마자 배달되는 소포를 받을 준비를 하라는 명령어라고 해야 할까요?


그리고 이어지는 processIntent(변수1); 라는 코딩은 액티비티가 시작되자 마자 받은 인텐트를 가지고서 임의로 지정된 메서드에서 처리하라는 명령어입니다. 아직 processIntent()라는 메소드를 정의하지 않았기 때문에, 아직은 빨간색 글씨가 뜨면서 에러라는 의미를 내포하고 있는 것을 볼 수 있습니다.



그 다음으로는 onCreate()메소드 밖에서 마우스 우클릭을 한 다음, generate항목을 선택한 다음 Override Methods항목을 선택에서 onNewIntent()라는 메서드를 선택하도록 합니다.



이 onNewIntent()라는 메서드는 기존의 액티비티를 재사용해서 인텐트를 받을 때 사용하는 메서드라고 나와있습니다. 그래서 이런 onCreate()에서 getIntent()를 지정해서 액티비티가 시작되자 마자 오는 인텐트를 받도록 하고, 이번에는 재사용했을 경우.... 즉, 액티비티를 종료하지 않은채 인텐트를 받는 경우라면 사용되는 메서드로 이해를 하고 있습니다.



이번에는 아까부터 계속해서 내용을 지정하지 않은 processIntent()라는 메서드를 정의할 시간입니다. 먼저 if구문으로 인텐트가 비어있는 상황이 아닌지 여부를 체크하도록 합니다.

그리고 이어지는 getStringExtra()메서드는 part1에서 언급한 적이 있기 때문에 생략하도록 하겠습니다. 여기까지의 의미는 인텐트에서 각각 문자열을 찾아서, 메세지 상자에 그 값을 띄우라는 의미입니다. 그렇게 한 결과는 다음과 같습니다.



먼저 앱을 실행하자 마자입니다. 입력상자에 '홍길동'이라고 입력을 한 다음 버튼을 누르면, 데이터가 인텐트를 타고서 서비스로 배달이 됩니다. 그리고 나서 서비스에서 이 내용이 다시 MainActivity로 돌아오기 까지 몇 초가 걸리긴 했습니다. 아무튼 몇 초를 기다리면...........



위 스크린샷과 같이 서비스에서 MainActivity.java로 전달이 된 인텐트를 처리해서 메세지가 뜬 것을 볼수 있습니다. 이것으로 제대로 서비스에서 액티비티로 데이터를 전달한 것을 볼 수 있었습니다.

+ Recent posts

티스토리 툴바