인텐트 - Intent
다른 액티비티를 호출 해보자! (startActivity)
인텐트(Intent) : 메인 액티비티에서 다른 액티비티를 호출하기 위해 필요한 정보를 전달하는 역할.
앱에서 액티비티 이동을 하는경우가 많은데 이 때 인텐트를 이용하여 액티비티를 전환을 할 수 있다.
loginButton.setOnClickListener {
var startMainActivityIntent = Intent(this@LoginActivity, MainActivity::class.java)
startActivity(startMainActivityIntent)
}
위 코드는 loginButton 버튼을 클릭하면 메인 액티비티를 실행하는 코드이다.
먼저 Intent를 생성한다.
Intent 생성 시 필요한 인자는 Intent(Context packageContext, Class<?> cls)
첫번째 인자는 현재 액티비티의 context, 두번째 인자는 불러올 액티비티를 입력한다.
생성한 Intent를 startActivity로 호출하면 다른 액티비티를 호출할 수 있다.
위처럼 다른 액티비티를 호출하면 기존 액티비티 위에 새로운 액티비티가 그려지는데 새로 그린 액티비티가 호출 된 후 이전 액티비티를 종료하려면 액티비티 호출 후 finish()를 호출하면 이전 액티비티는 종료된다.
loginButton.setOnClickListener {
var startMainActivityIntent = Intent(this@LoginActivity, MainActivity::class.java)
startActivity(startMainActivityIntent)
finish() // 액티비티 호출 후 현재 액티비티 종료
}
액티비티 호출 시 데이터를 넘겨보자! (putExtra)
Intent로 다른 액티비티 호출 시 기존 액티비티의 정보를 새로운 액티비티로 넘겨야 하는 경우가 있다.
이 때 데이터를 넘기고 새로운 액티비티에서 넘어온 데이터를 받을수 있다.
// 기존 액티비티
loginButton.setOnClickListener {
var startMainActivityIntent = Intent(this@LoginActivity, MainActivity::class.java)
startMainActivityIntent.putExtra("key", "value") // 데이터 담기
startActivity(startMainActivityIntent)
finish() // 액티비티 호출 후 현재 액티비티 종료
}
// 새로운 액티비티
override fun onCreate(savedInstanceState: Bundle?) {
..
// 결과를 전달 받는다.
var result = getIntent().getIntExtra("key", 0) // int 타입을 받을 경우
var nickname = getIntent().getStringExtra("key") // string 타입을 받을 경우
}
액티비티 호출 시 putExtra에 Map 형식으로 데이터를 담은 후 새로운 액티비티에서 get[Type]Extra로 데이터를 받을 수 있다.
데이터를 넘길 시에는 putExtra로 타입 구분없이 넘기지만, 데이터를 받을 시 타입을 구분하여 getIntExtra / getStringExtra / getBooleanExtra ... 타입명을 명시하여 데이터를 받아온다.
※ getIntExtra의 두번째 인자는 값이 없을 경우 default 값이다.
호출한 액티비티에서 결과 데이터를 넘겨주자! (startActivityForResult)
액티비티를 호출 한 후 새로운 액티비티에서 어떠한 작업을 한 후 결과를 기존 액티비티로 리턴하여 사용하는 경우가 있다.
웹의 팝업창 처럼 새로운 창에서 작업을 실행 한 후 결과값을 원래 페이지에서 사용하는 경우인데 이때도 Intent를 사용하여 처리할 수 있다.
기존 Intent를 액티비티를 호출 할 때 startActivity를 호출하였는데 위와 같은 경우에는 startActivityForResult를 호출하여 액티비티를 불러온다.
// 기존 액티비티
loginButton.setOnClickListener {
var startMainActivityIntent = Intent(this@LoginActivity, MainActivity::class.java)
startActivityForResult(startLoginActivityIntent, 100)
}
startActivity대신 startAcitivtForResult로 액티비티를 호출한다.
이때 넘기는 인자가 다른데 두번째 인자가 추가된다.
해당 인자의 값은 새로운 액티비티에서 결과값을 리턴해 줄 때 구분할 수 있는 요청코드이다.
// 새로운 액티비티
Intent intent = new Intent();
intent.putExtra("key", "value");
setResult(RESULT_OK, intent);
finish();
새로운 액티비티에서 작업이 완료되면 Intent를 생성하여 넘겨줄 결과값들을 저장 후 setResult로 결과값을 리턴해준다.(setResult의 첫번째 인자는 Activity의 맴버 변수이다. 성공인 경우 RESULT_OK, 실패인 경우 RESULT_CANCEL을 넘길 수 있다.)
// 기존 액티비티
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
when(100){
Login2Activity.REQUEST_CODE -> {
if(resultCode === Activity.RESULT_OK){
Toast.makeText(this, "성공 : " + data.getStringExtra("key"), Toast.LENGTH_SHORT).show()
}else{
Toast.makeText(this, "실패 : " + data.getStringExtra("key"), Toast.LENGTH_SHORT).show()
}
}
}
}
기존 액티비티에서 onActivityResult메소드를 오버라이드 한다.
해당 메소드는 startActivityForResult로 호출한 액티비티에서 setResult로 결과값을 리턴하면 해당 메소드가 호출되어 결과값을 받을 수 있다.
인자의 reqeustCode는 startActivityForResult를 호출하면서 같이 전달한 요청코드이다.
해당 액티비티에서 여러가지의 액티비티를 호출할 수 있으므로 어느 액티비티에서 결과값이 리턴되었는지 구분할 수 있는 코드로 결과값을 받기 위해 사용된다.
resultCode는 setResult에서 전달한 첫번째 인자값이다. Activity의 멤버 변수인 RESULT_OK or RESULT_CANCEL값을 받는다. 실패와 성공 유무를 판단할 수 있다.
마지막 인자인 data는 결과값을 담은 intent이다.
해당 intent에서 전달한 결과값을 받아서 사용할 수 있다.
'IT > Android' 카테고리의 다른 글
안드로이드 앱 버전 가져오기 (0) | 2019.12.01 |
---|---|
안드로이드 데이터바인딩 (0) | 2019.12.01 |
안드로이드 - 간단한 주사위 게임 앱 만들기 (2) | 2019.11.24 |
안드로이드 - 코틀린으로 프로젝트 생성 (0) | 2019.11.24 |
댓글