# 인텐트
- 각각의 화면은 별도의 액티비티로 구현됨
- 하나의 액티비티(화면)에서 다른 액티비티(화면)로 전환하려면? -> 인텐트

- 다른 액티비티를 시작하려면 액티비티의 실행에 필요한 여러가지 정보들을 보내줘야함
- 정볼르 인텐트에 실어서보냄
- 명시적 인텐트와 암시적인텐트로 나뉨
# 명시적인텐트
- 타깃 컴포넌트의 이름을 지정
- "애플리케이션 A의 컴포넌트 B를 구동시켜라"와같이 명확하게 지정
- 주로 애플리케이션 내부에서 사용
- 실행하고자 하는 액티비티의 이름을 적어줌 ex) NextActivity
- NextActivity.class는 NextActivity클래스에 대한 정보를 가지고 있는 객체
Intent intent = new Intent(this, NextActivity.class);
// 인텐트 객체에 실행하고 싶은 액티비티의 클래스 이름인 NextActivity를 지정
startActivity(intent);
// Intent 객체에 기술된 액티비티를 시작
# 암시적 인텐트
- 타깃 컴포넌트의 이름을 지정하지 않는다.
- 아주 암시적으로 컴포넌트를 지정
- "지도를 보여줄 수 있는 컴포넌트이면 어떤 것이라도 좋다"
- 일반적으로 다른 애플리케이션의 컴포넌트를 구동하는데 사용
- 어떤 작업을 하기를 원하지만 그 작업을 담당하는 컴포넌트의 이름을 명확하게 모르는 경우에 사용
- 특정한 타깃이 없으므로 안드로이드는 인텐트를 처리할 수 있는 가장 최적의 컴포넌트를 탐색하여야 함
- 안드로이드는 컴포넌트가 가지고 있는 인텐트 필터를 암시적인 인텐트와 비교하여 탐색을 수행
- 자신이 원하는 작업만을 기술
- 명확한 컴포넌트의 이름은 적지 않음
- 안드로이드가 이 인텐트를 받으면 모든 애플리케이션의 컴포넌트를 뒤져서 가장 알맞은 컴포넌트를 찾아냄
- 참조하는 정보가 애플리케이션의 매니페스트 파일
- 매니패스트 파일의 인텐틔 필터와 암시적 인텐트를 비교하여서 가장 일치하는 컴포넌트를 찾음
- 암시적 인텐트 생성하려면 인텐트 안에 액션과 데이터를 지정하여야 함
ex) 사용자가 이메일을 보낼 수 있는 화면을 표시하려면 다음과 같은 인텐트를 생성하고 해당 액티비티를 시작
- 인텐트의 엑스트라 필드에는 이메일 송신 주소가 저장됨
- 이메일 액티비티가 이 인텐트를 받으면 일단 이메일 작성 화면을 표시하고 엑스트라 필드에 있는 문자열을 읽어서 이메일의 "to"필드에 입력
- 사용자가 이메일 작성을 완료하고 이메일을 송신하면 이메일 액티비티는 종료되고, 중단되었던 액티비티가 다시 시작됨
Intent intent = new Intent(Intent.ACTION_SEND);
// 이메일 전송을 의미하는 인텐트 생성
intent.putExtra(Intent.EXTRA_EMAIL, recipientArray);
// 이메일의 송신자를 엑스트라 필드에 기술
startActivity(intent);
# 인텐트 객체
- 컴포넌트 이름 : 인텐트를 처리하는 타깃 컴포넌트의 이름
타깃 컴포넌트의 완전한 이름과 패키지 이름을 적으면 됨
컴포넌트의 이름이 없으면 암시적 인텐트가 되어서 안드로이드가 최적의 타깃 컴포넌트를 찾아줌
setComponent(), setClass(), setClassName()으로 설정할 수 있고 getComponent()로 읽을 수 있음
- 액션 : 액션은 수행되어야 하는 작업을 나타냄
ACTION_VIEW, ACTION_EDIT, ACTION_MAIN 등이 있음
많은 액션들이 Intent 객체 안에 String타입의 상수로 정의 되어 있음
자주 사용하는 액션들은 표를 참고
| 상수 | 타깃 컴포넌트 | 액션 |
| ACTION_VIEW | 액티비티 | 데이터를 사용자에게 표시 |
| ACTION_EDIT | 액티비티 | 사용자가 편집할 수 있는 데이터를 표시 |
| ACTION_MAIN | 액티비티 | 태스크의 초기 액티비티로 설정 |
| ACTION_CALL | 액티비티 | 전화 통화를 시작 |
| ACTION_SYNC | 액티비티 | 모바일 장치의 데이터를 서버 상의 데이터와 일치시킴 |
| ACTION_DIAL | 액티비티 | 전화번호를 누르는 화면을 표시 |
- 필요하다면 사용자가 나름대로 액션 문자열을 정의할 수 있음
-> 이 경우 애플리케이션 패키지를 앞에 붙여야 함
ex) kr.co.company.SHOW_COLOR
setAction()과 getAction() 메소드를 사용해서 인텐트 객체에 액션을 설정하고 접근할 수 있음
# 데이터
: 데이터는 작업에 필요한 데이터를 나타냄
ex ) 액션이 ACTION_VIEW라면 무엇을 사용자에게 표시할 것인지를 주어야 함
데이터는 URI 형식 사용
setData(), getData() 메소드를 사용해 인텐트 객체에 데이터를 설정하고 접근할 수 있음

ex) 전화를 거는 인텐트를 작성하여 발송하는 절차 코드
...
Intent intent = new Intent(Intent.ACTION_CALL);
// 액션이 ACTION_CALL인 인텐트를 생성
intent.setData(Uri.parse("tel:0102341234"));
// 0102341234번 전화번호를 데이터로 설정
startActivity(intent);
// 인텐트를 시작
# 액티비티로부터 결과받기
- 서브 액티비티로부터 결과를 받아야 하는 경우가 있음
- 이런 경우에는 startActivity()가 아닌 startActivityForResult()를 호출해서 서브 액티비티를 시작하여야 함
- 서브 액티비티가 결과를 보내면 메인 액티비티의 onActivityResult() 콜백메소드가 호출됨
- 전체적인 구조
...
public class MainActivity extends AppCompatActivity{
...
// 서브 액티비티를 시작
Intent in = new Intent(MainActivity.this, SubActivity.class);
startActivityForResult(in, COMMAND);
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data){
... //여기서 값을 전달 받음
}
}
- 서브 액티비티가 보내는 결과값은 인텐트 객체 안에 있는 엑스트라(extras)필드를 이용하여 전달됨
- 엑스트라 필드는 Bundle 타입의 객체로서 데이터를 "이름과 값"의 쌍으로 저장
- 엑스트라 필드에 값을 저장할 때는 putExtra()를 사용
- 엑스트라 필드에서 값을 추출할 때는 getIntExtra() 메소드 사용

# 멀티 태스킹
- 동시에 여러 태스크를 실행
- 현재의 태스크를 배경으로 보내고 다른 태스크를 전경에서 시작할 수 있음
- 이전에 실행한 화면은 배경 태스크로 넘어감
- 스택의 후입선출로 기존의 화면이 삭제되지 않고 스택에 쌓여있음
# 오버뷰 화면
- 최근에 사용된 액티비티들과 태스크들을 보여주는 화면
# 액티비티 생애주기
- 실행상태
: 액티비티가 전경에 위치하고 있으며 사용자의 포커스를 가지고 있음
- 일시멈춤 상태
: 다른 액티비티가 전경에 있으며 포커스를 가지고 있지만 현재 액티비티의 일부가 아직도 화면에서 보이고 있는 상태
- 정지 상태
: 액티비티는 배경에 위치함
# 중요한 콜백 메소드
* onCreate()
- 액티비티가 생성되면서 호출
- 중요한 구성 요소들을 초기화
* onPause()
- 사용자가 액티비티를 떠나고 있을 때, 이 메소드가 호출
- 그 동안 이루어졌던 변경사항을 저장
'Programming > Mobile' 카테고리의 다른 글
| [안드로이드스튜디오] 서비스와 방송수신자 (0) | 2021.10.03 |
|---|---|
| [안드로이드스튜디오] 액티비티로부터 결과받기 (0) | 2021.09.12 |
| [안드로이드스튜디오] 여러페이지로 구성된 애플리케이션 작성 (0) | 2021.09.12 |
| [안드로이드스튜디오] 명시적 인텐트 - 두개의 액티비티로 이루어진 애플리케이션 (0) | 2021.09.11 |
| [안드로이드스튜디오] 액티비티 (0) | 2021.09.11 |