본문 바로가기
IT/Android

인텐트(Intent) - 다른 액티비티 호출

by sgoho01 2019. 12. 9.

인텐트 - 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에서 전달한 결과값을 받아서 사용할 수 있다.

 

댓글