5장. 두 번째 액티비티 만들기

다른 액티비티 실행하기

public void startActivity(Intent intent);

메서드를 통해서 다른 액티비티를 실행할 수 있다.

정확하게는 안드로이드 운영체제에 있는 ActivityManager 에게 startActivity 메서드로 요청하고

ActivityManager 가 실행해주는 것이다.

다른 액티비티를 실행하며 데이터를 함께 전달하기

public Intent(Context packageContent, Class<?> cls)

Intent 클래스 생성자를 사용하여 데이터를 함께 전달할 수 있다.

Intent는 안드로이드의 컴포넌트가 운영체제와 통신하는데 사용할 수 있는 객체이며,

안드로이드의 컴포넌트는 Acticity 이외에도 Service와 broadcast receiver, content provider 가 있다.

ActivityManager는 실행할 액티비티를 AndroidManifest 파일에서 찾기 때문에, 반드시 모든 액티비티가

매니페스트 파일에 정의되어 있어야한다.

하나의 애플리케이션에 존재하는 액티비티끼리 직업 호출하지 않고, 운영체제에게 요청하여 실행을 하는 이유는

다른 애플리케이션의 액티비티와 함께 동작하는 것이 쉽기 때문이다.

단, 같은 애플리케이션 내에서 호출할 때에는 명시적 인텐트를 사용하고,

다른 애플리케이션의 액티비티를 호출할 때에는 암시적 인텐트를 사용한다.

Intent 클래스의 인자는 순서대로 실행될 액티비티를 찾을 수 있는 패키지와, 실행될 액티비티 클래스이다.

Intent Extra

Intent 클래스에는 key와 value를 쌍으로 가지는 Extra 가 있다.

public Intent putExtra(String name, boolean valaue)

putExtra 메서드를 사용하여 Intent에 키와 밸류를 저장할 수 있고,

호출된 액티비티에서도 Extra를 확인하여 데이터를 꺼내 쓸 수 있다.

다른 액티비티 실행 후 결과 받기

만약 어떤 액티비티를 실행하고나서 그 결과를 돌려받아야한다면?

startActivity(Intent intent);

대신에

public void startActivityForResult(Intent intent, int requestCode)

메서드를 사용한다.

Intent는 startActivity 메서드와 동일한 인자이며, requestCode는 자식 액티비티를 구분하기 위한

상수값이다.

자식 액티비티에서는 다음과 같은 메서드로 결과를 설정할 수 있다.

public final void setResult(int resultCode)
public final void setResult(int resultCode, Intent data)

일반적으로 resultCode는 0또는 -1이다. -1은 Activity.RESULT_OK, 0은 Acticity.RESULT_CANCELED 이며,

RESULT_OK를 인자값으로 넘기게되면, 부모 액티비티가 결과를 받을 수 있다.

자식 액티비티가 종료되면 부모 액티비티는 아래와 같은 메서드로 Intent를 받는다.

protected void onActivityResult(int requestCode, int resultCode, Intent data)

첫 번째 인자는 부모 액티비티에서 자식 액티비티를 구분하기 위해 설정했던 인자를 그대로 받는 것이고,

두번째와 세번째는 자식 액티비티에서 setResult() 메서드를 통해 설정해준 값을 받는 것이다.