본문 바로가기
컴퓨터 공학/Android

[ 안드로이드 프로그래밍 ] 간단한 예제로 서비스 이해하기2 (서비스에서 액티비티로 데이터 전달)

by hahehohoo 2020. 4. 7.
반응형

안드로이드 스튜디오 프로그래밍_서비스에서 액티비티로 데이터 전달_예제포함

 

 

이번에는 안드로이드에서 서비스를 실행시키고 데이터를 액티비티로 전달하는 작업을 구현해볼 것입니다. 예제를 따라하기 위해서 앞서 선행되어야 하는 코드가 있으니 '서비스 이해하기1' 글에서 확인해주세요. 아래 링크 클릭하시면 됩니다.

 

https://bite-sized-learning.tistory.com/137

 

[ 안드로이드 프로그래밍] 간단한 예제로 서비스 이해하기

유튜브를 보는 중에 카톡 알림을 받은 적이 있을 것입니다. 이렇게 카톡 앱을 화면에 띄우지도 않아도 카톡 알림을 받을 수 있는 이유는 화면 뒤의 공간인 백그라운드에서 실행되는 "서비스"가 있기 때문입니다...

bite-sized-learning.tistory.com

 

데이터를 서비스에서 액티비티로 전달하고 싶다면 서비스에서 startActivity()를 사용합니다. startActivity() 메서드를 호출하면서 인텐트 객체를 전달하면 액티비티에서는 그 안에 들어 있는 부가데이터를 받아볼 수 있습니다. 

 

우리는 앞에서 작성한 MyService.java 파일 안의 processCommand 메서드를 수정해보겠습니다. 

1  액티비티를 띄우기 위해 인텐트 객체 만들기

- 인텐트 객체를 new 연산자로 생성했습니다. 

- 첫 번째 파라미터는 getApplicationContext() 메서드를 호출하여 Context 객체가 전달되도록 했습니다. 

- 두 번째 파라비터로는 MainActivity.class 객체가 전달되도록 했습니다. 

 

2 인텐트 안에 플래그 추가하기 

- 인텐트 객체에는 부가 데이터를 두 개 추가했으며 하나는 command, 다른 하나는 name 키를 갖고 있습니다. 

- 서비스에서 메서드를 호출할 때는 새로운 태스크(Task)를 생성하도록 FLAG_ACTIVITY_NEW_TASK 플래그 인텐트에 추가해야 합니다. 

화면이 없는 서비스에서 화면이 있는 액티비티를 띄우려면 새로운 태스크를 만들어야 합니다. 

- MainActivity 객체가 이미 메모리에 만들어져 있을 때 재사용하도록 FLAG_ACTIVITY_SINGLE_TOP과 FLAG_ACTIVITY_CLEAR_TOP 플래그도 인텐트에 추가합니다. 

 


 

이제 서비스에서 5초 후에 메인 액티비티에 전달한 인텐트는 메인 액티비티에서 받아 처리할 수 있습니다. 

 

- MainActivity가 이미 메모리에 만들어져 있다면 onCreate() 메서드는 호출되지 않고 onNewIntent() 메서드가 호출됩니다. 

- 그리고 인텐트는 onNewIntent 메서드의 파라미터로 전달됩니다. 

 

- 여기서는 onNewIntent() 메서드가 호출되었을 때 실행할 메서드로 processIntent()를 만들었습니다. 

processIntent() 메서드 안에서 인텐트로 전달받은 데이터는 토스트 메시지로 보이도록 했습니다. 

 

앱을 실행하고 버튼을 누르면 다음과 같은 결과를 볼 수 있습니다.

 


⁉️ 셀프 복습 질문 ⁉️

 

1. 서비스에서 메서드를 호출할 때 FLAG_ACTIVITY_NEW_TASK플래그를 인텐트에 추가하는 이유는?

2. MainActivity가 이미 메모리에 만들어져 있다면 어떤 메서드가 호출되나요?

 

( 답이 바로 생각나지 않는다면 한 번 더 이 글을 읽어보세요. 꼭이요!!!)

 

.

.

.

.

.

.

.

.

.

1  서비스는 화면이 없기 때문에 화면이 있는 액티비티를 띄우려면 새로운 태스크를 만들어야 합니다. 

2 onNewIntent()

 

 

 

반응형


댓글