본 포스팅은 아래 글을 바탕으로 하고 있습니다.
https://developer.android.com/training/basics/intents/result.html?hl=ko#ReceiveResult
A 라는 Activity에서 B라는 Activity로 전환하고, 이후 다시 Activity A로 돌아올 때
Activity B에서 처리한 작업 결과를 가져와서 Activity A를 표현해야할 필요가 있습니다.
Activity 전환을 위해 Intent와 함께 startActivity() 메서드를 사용합니다.
하지만 지금과 같이 전환하는 Activity B로부터 결과를 받기 위해서는 조금 다른 메서드를 사용합니다.
1. Activity A > B 호출
1 2 3 4 5 6 7 | static final int PICK_CONTACT_REQUEST = 1; // The request code ... private void pickContact() { Intent pickContactIntent = new Intent(Intent.ACTION_PICK, Uri.parse("content://contacts")); pickContactIntent.setType(Phone.CONTENT_TYPE); // Show user only contacts w/ phone numbers startActivityForResult(pickContactIntent, PICK_CONTACT_REQUEST); } | cs |
startActivity와 다른 점은 activity를 요청할 때 정수 값을 인자로 넣어 준다는 겁니다.
Request Code라고 하며, 요청을 식별하기 위한 인자입니다.
2. Activity B > A 결과 회신
요청을 받은 B Activity에서는 할 일을 한 후 다음과 같이 Activity를 종료시키며 결과를 A로 반환할 수 있습니다.
(예제 코드는 상기 예제와 무관하며, 어떤 식으로 쓰이는지 감만 잡으시는데 확인하시기 바랍니다.)
1 2 3 4 | // Create intent to deliver some kind of result data Intent result = new Intent("com.example.RESULT_ACTION", Uri.parse("content://result_uri")); setResult(Activity.RESULT_OK, result); finish(); | cs |
3. Activity A에서 결과를 받아 처리하기
Activity B에서 A가 다시 호출되어 A가 시작할 때, 그 결과를 처리하기 위해서
onActivityResult() 메서드가 불립니다.
따라서 이 메서드를 override 하여 B로 부터 받은 결과를 어떻게 활용할지 작성해야 합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { // Check which request it is that we're responding to if (requestCode == PICK_CONTACT_REQUEST) { // Make sure the request was successful if (resultCode == RESULT_OK) { // Get the URI that points to the selected contact Uri contactUri = data.getData(); // We only need the NUMBER column, because there will be only one row in the result String[] projection = {Phone.NUMBER}; // Perform the query on the contact to get the NUMBER column // We don't need a selection or sort order (there's only one result for the given URI) // CAUTION: The query() method should be called from a separate thread to avoid blocking // your app's UI thread. (For simplicity of the sample, this code doesn't do that.) // Consider using CursorLoader to perform the query. Cursor cursor = getContentResolver() .query(contactUri, projection, null, null, null); cursor.moveToFirst(); // Retrieve the phone number from the NUMBER column int column = cursor.getColumnIndex(Phone.NUMBER); String number = cursor.getString(column); // Do something with the phone number... } } } | cs |
본 예제만 그대로 따라하면 큰 문제가 없습니다.
그런데 초보 개발자들, 익숙하지 않은 경우 실수를 할 수 있는데요. (다름 아닌 제 실수담입니다.)
Activity B에서 경우에 따라서는 결과를 리턴하지 않는 경우도 있을 수 있습니다.
(반드시 결과를 리턴할 필요는 없죠.)
그리고 Activity A에서 ResultCode 체크를 하지 않고 코드를 작성한 경우.
이런 경우 Activity A에서 결과로 온 Intent 객체에 접근하면서 NullPointerException이 발생할 수 있습니다.
요약하자면
startActivityForResult() 메서드를 사용한다고 하면,
onActivityResult() 메서드를 override 하면서
Request Code, Result Code 체크 로직을 꼭 추가하자는 겁니다.
댓글
댓글 쓰기