startActivity ForResult複数のActivity間で値を渡す際の注意すべき使い方

10134 ワード

  • requestCode要求コード、すなわちstartActivity ForResult()を呼び出して過去の値
  • を渡す.
  • resultCode結果コード、結果コードは、返されるデータがどの新しいActivity
  • から来るかを識別するために使用される.
    例を挙げるともっとわかります.
    1.Activityで新しく開いたActivityが閉じて戻ってきたデータを取得する
    package com.google_acmer.activitys;
    
    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.View;
    import android.widget.Button;
    
    public class MainActivity extends Activity {
        private final static String TAG="MainActivity";
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
    
            Button btnOpen=(Button)this.findViewById(R.id.btnOpen);
            btnOpen.setOnClickListener(new View.OnClickListener(){
                public void onClick(View v) {
                    // Activity 
                    // , 
                    startActivityForResult(new Intent(MainActivity.this, OtherActivity.class), 1);
                }
            });
        }
    
        /**
         *  , Activity ( MainActivity ) onActivityResult 
         * 
         * requestCode  , startActivityForResult() 
         * resultCode  , Activity
         */
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            String result = data.getExtras().getString("result");// Activity  
            Log.i(TAG, result);
        }
    }

    2.新しいActivityが閉じる前に前のActivityにデータを返す必要がある
    package com.google_acmer.activitys;
    
    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    
    public class OtherActivity extends Activity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.other);
    
            Button btnClose=(Button)findViewById(R.id.btnClose);
            btnClose.setOnClickListener(new View.OnClickListener(){
                public void onClick(View v) {
                    // Intent 
                    Intent intent = new Intent();
                    // Intent
                    intent.putExtra("result", "My name is gu");
                    // 
                    OtherActivity.this.setResult(RESULT_OK, intent);
                    // Activity
                    OtherActivity.this.finish();
                }
            });
    
        }
    
    }//setResult() 

    リクエストコードの役割


    startActivity ForResult(Intent intent,int requestCode)メソッドを使用して新しいActivityを開き、startActivity ForResult()メソッドにリクエストコード(2番目のパラメータ)を入力する必要があります.要求コードの値は、業務の必要に応じて自己設定され、要求ソースを識別するために使用される.たとえば、1つのActivityには2つのボタンがあり、この2つのボタンをクリックすると同じActivityが開きます.そのボタンが新しいActivityを開いても、この新しいActivityがオフになると、前のActivityのonActivity Result(int requestCode,int resultCode,Intent data)メソッドが呼び出されます.onActivity Result()メソッドでは、新しいActivityがそのボタンで開いていることを知り、対応するビジネス処理を行う必要がある場合は、次のようにします.
     @Override  public void onCreate(Bundle savedInstanceState) {
            ....
            button1.setOnClickListener(new View.OnClickListener(){
                public void onClick(View v) {
                    startActivityForResult (new Intent(MainActivity.this, NewActivity.class), 1);
    
               }
    
            });
            button2.setOnClickListener(new View.OnClickListener(){
                public void onClick(View v) {
                     startActivityForResult (new Intent(MainActivity.this, NewActivity.class), 2);
    
                }
    
            }); 
    
    
           @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {
                   switch(requestCode){
                       case 1:
                       // 1 , 
                       case 2:
                       // 2 , 
                    }
              }
    }

    結果コードの役割


    1つのActivityでは、startActivity ForResult()メソッドを使用して複数の異なるActivityを開いて異なるビジネスを処理する場合があります.これらの新しいActivityがオフになると、前のActivityのonActivity Result(int requestCode,int resultCode,Intent data)メソッドが呼び出されます.返されたデータがどの新しいActivityから来たかを知るには、onActivity Result()メソッドで次のようにします(ResultActivityとNewActivityは開く新しいActivityです):
    public class ResultActivity extends Activity {
           .....
           ResultActivity.this.setResult(1, intent);
           ResultActivity.this.finish();
    }
    public class NewActivity extends Activity {
           ......
            NewActivity.this.setResult(2, intent);
            NewActivity.this.finish();
    }
    public class MainActivity extends Activity { //  Activity ResultActivity NewActivity
           @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {
                   switch(resultCode){
                       case 1:
                       // ResultActivity 
                       case 2:
                        // NewActivity 
                    }
              }
    } 

    startActivity ForResultを呼び出すとonActivity Resultがすぐに応答し、現在のページに戻るとonActivity Resultが応答しない問題について


    私は長い間この問題に悩まされていたが、2回目はlaunchModeに植えられた......最後についに実験を通じてこの問題の所在を発見した!2つのケースがあります.1つ目はresultCode=0の場合、ActivityのlaunchModeを「singleTask」またはsingleInstanceに設定する必要があります.そうしないとエラーが発生します.これは、Taskの観点から見ると、Androidは異なるTask間のActivityではデータを伝達できないと考えているため、NEW_TASK IDですが、forResultメソッドを呼び出します.
    2つ目:resultCode!=0の場合、ActivityのlaunchModeはstandardでなければなりません(launchMode属性を削除するとデフォルトではstandardモードになります).理由は同じです.