Intent(인텐트)
Intent
Intent란?
Intent는 ‘Component’를 실행하기 위해 시스템에 전달하는 Message이다.
즉 기능을 수행하는 함수를 제공하는 Class가 아니라 data를 담는 Class이다. 이 data는 Component를 실행하는 정보이며 이 정보가 담긴 Intent 객체를 시스템에 전달하면 Component가 실행된다.
Component Class는 시스템이 생성해서 실행하는 Class이므로 개발자가 작성하는 코드로 생명주기를 관리할 수 없다.
그렇기 때문에 MainActivity에서 임의의 DetailActivity라는 화면으로 전환하기 위해 DetailActivity Class의 객체를 생성해서 실행할 수 없고, MainActivity Class에서 DetailActivity Class를 실행하려면 시스템에 Intent를 전달해 줘야 한다.
이러한 Intent의 중재 역할은 같은 앱의 Component 뿐만 아니라 외부 앱의 Component와 연동할 때도 마찬가지로 적용된다.
MainActivity에서 DetailActivity를 실행하고자 Intent를 시스템에 전달하는 코드는 다음과 같다.
val intent: Intent = Intent(this, DetailActivity::class.java)
startActivity(intent)
startActivity() 함수가 Intent를 시스템에 전달한다. 이 함수의 매개 변수에는 시스템에 실행을 요청할 Component의 정보가 담긴 Intent 객체를 전달한다. 즉, DetailActivity를 실행해 달라는 정보를 Intent 객체에 대입한 것이다.
Intent를 이용해 Activity를 실행할 때 데이터를 전달해야 하는 경우
DetailActivity에 함수를 하나 선언하고 MainActivity에서 함수를 호출하면서 매개변수로 데이터를 넘기는 방법을 생각할 수 있다. 그러나 이 방법은 불가능한데, Component 객체는 System이 생성하므로 개발자 코드로 직접 접근할 수 없다. (OS가 직접 생성) 따라서 Compnent 객체로 어떤 함수를 호출할 수 없다.
Intent에 Compnent 실행을 요청할 때 데이터를 함께 전달하고자 한다면 extra data를 이용해야 한다. (system call과 같은 기능인 것 같다) MainActivity에서 Intent에 extra data를 추가해서 전달하고 DetailActivity에서 Intent에 담긴 extra data를 가져오는 구조이다. Intent에 data를 추가하는 함수는 putExtra()를 사용한다.
public Intent putExtra(String name, CharSequence value)
- String name: 데이터의 식별자
- CharSequence value: 매개변수가 전달할 데이터
Intent에 데이터를 추가하는 코드는 다음과 같다.
val intent: Intent = Intent(this, DetailActivity::class.java)
intent.putExtra("data1", "hello")
intent.putExtra("data2", 10)
startActivity(intent)
Intent로 실행된 Component에서 extra data를 가져오려면 Intent 객체의 프로퍼티(intent)를 이용하면 된다. 그리고 그 Intent 객체의 getIntExtra() 함수로 데이터를 가져오면 된다. 데이터를 가져오는 함수 또한 타입별로 여러 개 제공된다.
public int getIntExtra(String name, int defaultValue)
public String getStringExtra(String name)
public double getDoubleExtra(String name, double defaultValue)
extra data 가져오기
val data1 = intent.getStringExtra("data1")
val data2 = intent.getIntExtra("data2", 0)