안드로이드 스튜디오 프로그래밍_서비스에서 액티비티로 데이터 전달_예제포함
이번에는 안드로이드에서 서비스를 실행시키고 데이터를 액티비티로 전달하는 작업을 구현해볼 것입니다. 예제를 따라하기 위해서 앞서 선행되어야 하는 코드가 있으니 '서비스 이해하기1' 글에서 확인해주세요. 아래 링크 클릭하시면 됩니다.
https://bite-sized-learning.tistory.com/137
데이터를 서비스에서 액티비티로 전달하고 싶다면 서비스에서 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()
'컴퓨터 공학 > Android' 카테고리의 다른 글
[ 안드로이드 프로그래밍 ] 스레드 실행하기 ( 예제 포함 ) (1895) | 2020.04.08 |
---|---|
[ 안드로이드 프로그래밍 ] 토스트 메시지 위치 변경하기 (1452) | 2020.04.08 |
[ 안드로이드 프로그래밍] 간단한 예제로 서비스 이해하기1 (액티비티에서 서비스로 데이터 전달) (1066) | 2020.04.06 |
[안드로이드 스튜디오] 오류 해결_HardCoded (1843) | 2019.12.27 |
[안드로이드 스튜디오]로그캣 필터 사용 방법 (1648) | 2019.12.11 |
댓글