Android 는 startActivity ForResult 를 이용 하여 이전 Activity 로 데 이 터 를 되 돌려 줍 니 다.

Android 에 서 는 하나의 Activity 에서 다른 Activity 로 건 너 뛰 고 되 돌아 오 며 이전 Activity 는 기본적으로 데이터 와 상 태 를 저장 할 수 있 습 니 다.하지만 이번 에는 startActivity ForResult 를 이용 하여 같은 목적 을 달성 하고 싶 습 니 다.복잡 해 보이 지만 startActivity ForResult 뒤의 원리 와 사용 주의사항 을 탐색 할 수 있 습 니 다.
실현 하고 자 하 는 기능 은 다음 과 같다.
액 티 비 티 A 에서 액 티 비 티 B 로 데 이 터 를 전송 한 뒤 액 티 비 티 B 에서 데 이 터 를 가 져 온 뒤 다시 액 티 비 티 A 로 전송 한다.Activity B 에'이전 페이지 로 돌아 가기'버튼 을 추가 하고 Activity A 로 돌아 간 후 이전에 입력 한 관련 정 보 를 유지 해 야 합 니 다.우 리 는 startActivity ForResult 로 Activity B 를 끌 어 올 립 니 다.그러면 Activity A 는 Activity B 가 돌아 오 기 를 기다 리 고 있 습 니 다.
구체 적 인 절 차 는 다음 과 같다.
  • Activity A 에 Button 이 있 습 니 다.Button 을 클릭 한 후에 Activity B 에 전 달 될 데 이 터 를 얻 고 데 이 터 를 Bundle 에 밀봉 한 다음 에 startActivity ForResult 를 호출 하여 데 이 터 를 Activity B 에 전달 합 니 다
  • Activity A 는 onActivity Result 함 수 를 재 작성 하여 requestCode 와 resultCode 가 우리 가 예상 한 결과 인지 판단 합 니 다.만약 그렇다면 Bundle 에서 데 이 터 를 얻어 Activity A 에 다시 표시 합 니 다
  • Activity B 에서 Activity A 가 전 달 된 Intent 대상 을 가 져 오고 Bundle 대상 을 꺼 낸 다음 Bundle 에서 데이터 필드 를 꺼 내 현재 페이지 에 표시 합 니 다
  • Activity B 에 도 Button 이 있 습 니 다.Button 을 클릭 한 후에 setResult 를 호출 하여 결 과 를 전달 하고 현재 페이지 를 닫 습 니 다.그래서 보 이 는 효 과 는 바로 Activity A 로 돌아 간 것 이다.
  • 원본 코드 는 다음 과 같 습 니 다.
    1.Activity A 의 실현:
    
    public class ExampleActivity extends Activity {
    
     private EditText mEditText;
     private RadioButton mRb1;
     private RadioButton mRb2;
    
     @Override
     protected void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.main_page_layout);
    
     Button button = findViewById(R.id.buttonGoToLayout2);
     button.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
      mEditText = findViewById(R.id.editText);
      //        
      double height = Double.parseDouble(mEditText.getText().toString());
    
      //     
      String gender = "";
      mRb1 = findViewById(R.id.radioButtonMale);
      mRb2 = findViewById(R.id.radioButtonFemale);
      if (mRb1.isChecked()) {
       gender = "M";
      } else {
       gender = "F";
      }
    
      Intent intent = new Intent(ExampleActivity.this, SecondActivity.class);
      //         Activity
      Bundle bundle = new Bundle();
      bundle.putDouble("height", height);
      bundle.putString("gender", gender);
      intent.putExtras(bundle);
    
      startActivityForResult(intent, 0);
      }
     });
     }
    
     @Override
     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
     super.onActivityResult(requestCode, resultCode, data);
     if (resultCode == RESULT_OK && requestCode == 0) {
      Bundle bundle = data.getExtras();
      double height = bundle.getDouble("height");
      String gender = bundle.getString("gender");
    
      mEditText.setText("" + height);
      if (gender.equals("M")) {
      mRb1.setChecked(true);
      } else {
      mRb2.setChecked(true);
      }
     }
     }
    }
    
    2.레이아웃 파일 mainpage_layout.xml:
    
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:layout_gravity="center">
    
     <TextView
      android:id="@+id/textView1"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:text="      "
      android:paddingTop="20dp"
      android:paddingLeft="20dp"
      android:textSize="30sp"/>
    
     <TextView
      android:text="  :"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content" android:id="@+id/textView3"
      android:layout_alignStart="@id/textView1" android:layout_marginTop="38dp"
      android:layout_below="@id/textView1" android:layout_marginStart="46dp"/>
    
     <TextView
      android:text="  :"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content" android:id="@+id/textView4"
      android:layout_alignStart="@id/textView1" android:layout_marginStart="46dp"
      android:layout_below="@id/textView3" android:layout_marginTop="29dp"/>
    
     <EditText android:layout_width="wrap_content" android:layout_height="wrap_content"
      android:id="@+id/editText"
      android:layout_toEndOf="@id/textView4"
      android:layout_marginStart="36dp"
      android:autofillHints="@string/app_name"
      android:hint="0"
      android:layout_alignBaseline="@id/textView4"/>
    
     <TextView android:layout_width="wrap_content" android:layout_height="wrap_content"
      android:text="  "
      android:layout_alignBaseline="@id/editText"
      android:layout_toRightOf="@id/editText"
      android:layout_marginStart="10dp" />
    
     <RadioButton
      android:layout_below="@id/textView1"
      android:id="@+id/radioButtonMale"
      android:text=" "
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_alignStart="@id/textView1" android:layout_marginTop="30dp"
      android:layout_marginStart="113dp"/>
    
     <RadioButton
      android:id="@+id/radioButtonFemale"
      android:text=" "
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_below="@id/textView1"
      android:layout_toEndOf="@id/radioButtonMale"
      android:layout_marginLeft="15dp" android:layout_marginTop="30dp" android:layout_marginStart="49dp"/>
    
     <Button
      android:text="  "
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:id="@+id/buttonGoToLayout2"
      android:layout_marginTop="90dp"
      android:layout_below="@id/radioButtonMale"
      android:layout_alignStart="@id/textView1" android:layout_marginStart="92dp"/>
    </RelativeLayout>
    
    3.Activity B 의 실현:
    
    public class SecondActivity extends Activity {
     private Intent mIntent;
     private Bundle mBundle;
    
     @Override
     protected void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.second_layout);
    
     mIntent = getIntent();
     mBundle = mIntent.getExtras();
    
     //     
     if (mBundle == null) {
      return;
     }
    
     //   Bundle    
     double height = mBundle.getDouble("height");
     String gender = mBundle.getString("gender");
    
     //     
     String genderText = "";
     if (gender.equals("M")) {
      genderText = "  ";
     } else {
      genderText = "  ";
     }
    
     //       
     String weight = getWeight(gender, height);
    
     //            
     TextView textView = findViewById(R.id.textView2);
     textView.setText("    " + genderText + "
    " + height + "
    " + weight + " "); Button button = findViewById(R.id.buttonGoBack); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // , setResult(RESULT_OK, mIntent); finish(); } }); } // private String format(double num) { NumberFormat formatter = new DecimalFormat("0.00"); return formatter.format(num); } // private String getWeight(String gender, double height) { String weight = ""; if (gender.equals("M")) { weight = format((height - 80) * 0.7); } else { weight = format((height - 70) * 0.6); } return weight; } }
    4.Activity B 의 레이아웃:
    
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
      android:layout_width="match_parent"
      android:layout_height="match_parent">
     <TextView
      android:text="This is the second layout"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:id="@+id/textView2"
      android:paddingTop="30dp"
      android:paddingStart="50dp"/>
     <Button android:layout_width="wrap_content" android:layout_height="wrap_content"
      android:id="@+id/buttonGoBack"
      android:text="     "
      android:layout_alignStart="@id/textView2"
      android:layout_below="@id/textView2"
      android:layout_marginTop="54dp" android:layout_marginStart="52dp"/>
    </RelativeLayout>
    
    하지만 여기 에는 주의해 야 할 세 가지 가 있다.
    1.startActivity ForResult 의 두 번 째 매개 변 수 는 requestCode 가 0 으로 전 달 된 것 입 니 다.그러면 우 리 는 전달 하 는 값 이 0 보다 적 고 0 보다 큰 것 이 어떤 결과 인지 살 펴 보 겠 습 니 다.
    (1)0 보다 작은 값 을 전달 합 니 다.예 를 들 어-1:startActivity 를 호출 하 는 것 과 같 습 니 다.onActivity Result 는 호출 되 지 않 습 니 다.
    (2)0 이상 의 값 을 전달 합 니 다.예 를 들 어 1:효 과 는 0 과 같 습 니 다.onActivity Result 의 첫 번 째 매개 변 수 는 바로 우리 가 startActivity ForResult 를 통 해 전달 하 는 requestCode 입 니 다.
    2.onActivity Result 의 두 번 째 매개 변수 resultCode:두 번 째 activity 가 setResult 를 통 해 되 돌 아 왔 습 니 다.자주 사용 하 는 값 은 2 개 입 니 다:RESULTCANCELED、RESULT_OK
    (1)RESULT_CANCELED:Activity B 당 김 실패,예 를 들 어 crash
    (2)RESULT_OK:Activity B 조작 성공 후 반환 값
        자주 사용 되 지 않 는 수치 가 하나 더 있 습 니 다:RESULTFIRST_USER,Android 소스 코드 는 이 수치 에 대한 정 의 는"user-defined activity results"(사용자 정의)입 니 다.저 는 소스 코드 에서 전역 적 으로 검색 해 보 았 습 니 다.사용 할 곳 이 많 지 않 고 사용 할 곳 을 한두 개 골 랐 습 니 다.
    (1)PackageInstaller 아래 InstallFailed.java(apk 설치 실패 관련 페이지)
    
    protected void onCreate(@Nullable Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     int statusCode = getIntent().getIntExtra(PackageInstaller.EXTRA_STATUS,
      PackageInstaller.STATUS_FAILURE);
     if (getIntent().getBooleanExtra(Intent.EXTRA_RETURN_RESULT, false)) {
      // …….. 
      setResult(Activity.RESULT_FIRST_USER, result);
      finish();
     }
    
    (2)PackageInstaller 아래 InstallStaging.java
    
    private void showError() {
     (new ErrorDialog()).showAllowingStateLoss(getFragmentManager(), "error");
     // ……. 
     setResult(RESULT_FIRST_USER, result);
    }
    
        Package Installer 아래 Uninstaller Activity.java(apk 마 운 트 해제 관련 페이지):onCreate 방법 에 RESULT 로 여러 군데 설정 되 어 있 습 니 다.FIRST_USER。
    따라서 제 이 해 는 업무 자체 가 잘못 되 거나 무효 한 장면 에서 사용 하고 업무 자체 가 정의 하 는 것 입 니 다.
        3.Activity B 를 시작 할 때 new 설정task 시작 모드,Activity B 에 들 어가 면 Activity A 는 즉시 onActivity Result 를 되 돌려 주 고 resultCode 는 0 입 니 다.Activity B setResult 에서 돌아 온 후,onActivity Result 의 반전 이 없습니다!
    이상 은 안 드 로 이 드 가 startActivity ForResult 를 이용 하여 이전 Activity 로 데 이 터 를 되 돌려 주 는 상세 한 내용 입 니 다.안 드 로 이 드 가 이전 Activity 로 데 이 터 를 되 돌려 주 는 데 관 한 자 료 는 다른 관련 글 을 주목 하 세 요!

    좋은 웹페이지 즐겨찾기