본문 바로가기

소프트웨어/Android/Java/Ndk

안드로이드 새로운 창 띄우기(안드로이드 intent)

애플리케이션을 만들면서 단일 화면인 앱을 만드는 경우는 거의 없다.

 

이때 새로운 화면을 띄우는 작업은 intent를 이용한다.

Intent intent = new Intent(   getApplicationContext(), secondActivity.class  );

 위와같이 Intent를 이용해 새로운 intent객체를 생성할 수 잇다. 여기서 secondActivity.class는 개발자가 새로 띄우고자 하는 화면의 activity class이다.

 

intent라는 객체를 생성하였으므로 이제 이동을 해야한다. 이때는 startActivity를 이용하면 된다.

Intent intent = new Intent( getApplicationContext(), secondActivity.class );
startActivity(intent);
 
//finish(); //finish를 시켜주면 해당 Activity는 버려지므로 다시 돌아오지 못한다..

이렇게 해서 secondActivity를 부르면 원래 화면이었던 mainActivity는 Activity Stack에 쌓이게 된다. 그래서 secondActivity에서 BackButton을 누르면 Activity가 pop되면서 다시 mainActivity가 불려오게 된다. 이때 secondActivty는 사라지게 되는데 자동적으로 finish()가 수행된다.

(Activity Stack을 보고싶으면 커멘드창에 adb shell dumpsys activity를 치면 hist#0~~~에 쌓은 Activity정보가 나오게 된다)

(관련링크 http://mydevromance.tistory.com/16)

//보내는 쪽
Intent intent = new Intent( getApplicationContext(), secondActivity.class );
intent.putExtra("KEY1", "Stringgggg");
intent.putExtra("PHONE1", "Galaxy");
intent.putExtra("PHONE2", "iPhone");
intent.putExtra("Int1",1234);
 
 
startActivity(intent);

이제 새로운 Activity를 띄우거나 삭제할 수 있게 되었다. 그렇다면 Activity 이동간 value는 어떻게 이동시킬까?

단순하게 static변수를 써서 클래스간 변수를 공유를 해도 된다. 그러나 intent에서는 heshTable와 비슷한 기능을 제공한다.



보내는 Activity는 위와 같다. intent.putExtra( key, value )를 이용해서 intent에 정보를 넣을 수 있다.

 

주는쪽이 put이었으므로 받는쪽은 get을 이용해서 받는다.

//받는쪽 
Intent intent = getIntent();
 
String _KEY1 = intent.getExtras().getString("KEY1");   //String값을 받을때
int      _Int1   = intent.getExtras().getInt("int1");          //int값을 받을때 

단순하게 불려진 Activity의 경우에는 따로 intent를 생성하지 않아도 되지만 새로 불려진 Activity에서 정보를 받고자 하는 경우에는

intent intent = getIntent()로 새로운 intent 객체를 생성해준다. 그리고 받고자 하는 value가 문자열이면 getString을, value가 정수형이면 getInt()를 사용하여 값을 받는다. 이때 입력변수를 key값이다.

 

 

 

 

 

 지금까지는 mainActivity-> secondActivity 간의 value이동을 살펴 보았는데, 그렇다면 main-> second-> main은(다시 이전 Activty로 복귀시 데이터 반환)은 어떻게할까?

 이때는 앞에서 intent를 실행할때 사용한 startActivity()말고 startActivtyForResult(intent, RequestCode)를 사용해서 secondActivty를 부르면 된다. 함수의 이름과 같이 mainActivity는 second의 결과값을 기다린다. 여기서 RequestCode는 사용자가 임의로 정해주면 된다. 어떻게 사용되는지는 아래의 소스에서 확인해보자.



//보내는 쪽
Intent intent = new Intent( getApplicationContext(), secondActivity.class ); 
....
 
 startActivityForResult(intent, 777); //777은 개발자가 임의로 정한 코드



protected void onActivityResult(int requestCode, int resultCode, Intent data) {
 
if(requestCode==777){
   if(resultCode==RESULT_OK){
           원하는 동작;
   }
}
 
} 

받는쪽의 소스에서와 같이 intent를 하나 생성해주고 putExtra로 key와 value를 intent에 넣은후 setResult로 이전 Activity에 값을 넘겨주면 된다. 여기서  RESULT_OK는 android Activity에서 제공해주는 public final static 상수로서 이상없이 잘 보냈다는 의미(-1)이다.

 

이렇게해서 이전 Activity가 intent값을 넘겨받으면 그 값 은 onActivityResult함수를 이용해서 활용하게 된다.

이 함수는 Android Activity에서 상속받는 매서드로서 사용할때 오버라이딩 해주면 된다. (사용하고자 하는 오버라이딩 매서드의 이름이 확실히 기억나지 않는다면 api를 찾아보거나, 이 카테고리에 게시한 '쉽게 오버라이딩(맞나?)하는방법'을 보면 될것이다...)

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

함수의 첫 인자는 requestCode로서 startActivityForResult에서 정해준 777코드이고

resultCode는 위에서 설명한 RESULT_OK이다.

함수는 간략하게 아래와 같이 사용할 수 있다.


이렇게 분기를 시켜주면 전달받은 값을 이용할 수 있다.

 

 

 

이 글에서는 intent.putExtra( key, value)로 값을 전달했지만, 찾아보니깐 Bundle bundle;로 bundle객체를 생성해서 그곳에 데이터를 넣고 intent.putExtra(bundle);로 보내는 방법도 있다고 한다.

 

끝.