[안드로이드 Intent] startActivity(), startActivityForResult()를 통한 페이지 넘어가기

2018. 9. 12. 00:23 안드로이드/개발 TIP
Android Intent를 통해 Activity, Service, BroadCast 등 여러 구성요소 사이에서 통신을 용이하게해줍니다. 오늘은 Acitivity사이에서 통신하는 명시적 Intent에 대해 알아보겠습니다.

1. Intent

Intent는 일종의 메시지 객체이다Intent를 통해 Activity 새 인스턴스를 시작하는 방법은 여러가지가 있다. 우선 Activity의 새 인스턴스(다른 액티비티 시작)를 시작하려면 Intent를 startActivity()로 전달해야한다. 새 인스턴스에 데이터를 넘겨주기 위해서는putExtra() 메서드를 이용한다. 또한 이전 Activity로 돌아와서 수행 결과를 받으려면 startActivity()를 통해 Activity 새 인스턴스를 시작하고 setResult()를 통해 새 Intent나 넘어온 Intent를 넘겨줘야한다. 결과를 받을 이전 Activity에서는 onActivityResult() 메서드를 ovrriding하여 결과를 처리한다.

2. startActivity()를 통한 Activity의 새 인스턴스 생성


MainActivity.class


MainActivity에서는 Intent객체와 putExtra()메서드를 이용해 Activity의 새 인스턴스를 시작하고 데이터를 넘겨준다. 즉MainActivity.class - > NextActivity.class의 과정이다. Intent객체의 인자로는 현재 Context(MainActivity.this)와 시작될Activity(NextActivity.class)를 넣어준다. putExtra()는 넘겨줄 데이터에 대한 key와 value를 하나의 세트로 MainActivity에 담는다.putExtra()의 value는 String, int, float등 여러 자료형의 데이터를 담을 수 있으며 배열이나 리스트를 담을 수 도 있다. 그리고 마지막으로 startActivity()를 통해 새 액티비티의 인스턴스를 시작한다.


* 주요 소스1
 
Intent intent = new Intent(현재 Context, 새로 시작될 Class);  
 intent.putExtra(key, value);  
 startActivity(intent);


// 인텐트 참조
Intent intent = new Intent(MainActivity.this, Main2Activity.class);
// 인텐트의 putExtra()로 넘길 데이터
ArrayList<String> strList = new ArrayList<String>();
strList.add("리스트1");
strList.add("리스트2");
// putExtra
intent.putExtra("strData", "문자열");
intent.putExtra("strListData", strList);
// 인텐트 대해 startActivity()수행
startActivity(intent);




NextActivity.class


MainActicity로부터 데이터를 받는 소스이므로 받을 데이터가 없다면 아래의 소스코드 없이 NextActivity를 구현하면된다.

* 주요 소스1
    Intent intent = getIntent();  
    String str = intent.getStringExtra(key);  
    ArrayList<String> strList = intent.getStringArrayExtra(key); 

Intent intent = getIntent();//이전 액티비티로부터 넘겨진 인텐트 = 현재 Activity인스턴스를 시작한 인텐트 반환
String getData = intent.getStringExtra("strData") + "\n" + intent.getStringArrayListExtra("strListData");




3. startActivityForResult()를 통한 결과 받기


MainActivity.class

MainActicity에서는 Intent를 startActivity()가 아닌 startActivityForResult()메서드를 사용해 Activity의 새 인스턴스를 생성했다. startActivityForResult()메서드의 첫번째 인자는 Intent가 들어가며 두번째 인자에는 결과를 요청할때 확인할 요청코드를 보낸다. 요청코드는 1과 같이 임의의 코드를 보낸다. 또한 새 인스턴스로 부터 결과를 받아오기 위해 onActivityResult()를 Overriding해야한다.


* 주요 소스1
    Intent intent = new Intent(현재 Context, 새로 시작될 Class);  
    startActivityForResult(intent, 요청코드);
* 주요 소스2                                      
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
           if(requestCode == 요청코드){
            if (resultCode == Activity.RESULT_OK){
                Log.e("LOG", "결과 받기 성공");
            }
        }
    }

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

// 위젯 참조.
bt_intent = (Button)findViewById(R.id.bt_intent);
    // 온클릭 리스너 처리.
bt_intent.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {

// 인텐트 참조.
Intent intent = new Intent(MainActivity.this, NextActivity.class);

// 인텐트 대해 startActivityForResult()수행.
startActivityForResult(intent, 1);
}
});
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);

if(requestCode == 1){
if (resultCode == Activity.RESULT_OK){
Log.e("LOG", "결과 받기 성공");
}
}
}



NextActivity.class


NextActivity에서는 받은 데이터를 처리하거나 setResult()를 통해 이전 액티비티로 결과를 돌려준다. setResult()의 첫번째 자로는 결과코드를 넣어준다. 두번째 인자에는 putExtra()로 데이터를 담은 Intent를 넣어줄 수 있고 비울 수 도있다. Intent를 넣어줄때 Intent객체는 setResult()되므로 인자에 Context와 Class를 비운다. 또한 Intent에 getIntent()로 이전 액티비티로부터 Intent를 얻은 경우에도 setResult()의 두번째 인자로 Intent를 넣을 수 있다. 그리고 그 안에 담긴 데이터도 전달된다.


* 주요 소스1

setResult(결과코드)


* 주요 소스2

Intent intent = new Intent(); // 객체 생성자의 인자에 아무 것도 넣지 않는다.

setResult(결과코드, intent);


* 주요 소스3
     Intent intent = getIntent(); 
     setResult(결과코드, intent)

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);

tv_outPut = (TextView)findViewById(R.id.tv_outPut);
bt_back = (Button)findViewById(R.id.bt_back);

bt_back.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
setResult(Activity.RESULT_OK); // 결과코드를 'RESULT_OK'로 세팅. 이후 이전 액티비티로 돌아가 onActivityResult()가 호출됨.
finish(); // 액티비티를 끝낸다.
}
});
}

출처 : http://mailmail.tistory.com/15