Android Obtenir un résultat d'une autre activité


Exemple

En utilisant startActivityForResult(Intent intent, int requestCode) vous pouvez démarrer une autre Activity , puis recevoir un résultat de cette Activity dans la onActivityResult(int requestCode, int resultCode, Intent data) . Le résultat sera renvoyé en tant Intent . Une intention peut contenir des données via un ensemble


Dans cet exemple, MainActivity lancera une DetailActivity et attendra un résultat. Chaque type de requête doit avoir son propre code de demande int , de sorte que dans la onActivityResult(int requestCode, int resultCode, Intent data) substituée onActivityResult(int requestCode, int resultCode, Intent data) de MainActivity , il soit possible de déterminer la demande de traitement en comparant les valeurs de requestCode et REQUEST_CODE_EXAMPLE Par exemple, il n'y en a qu'un).

Activité principale:

public class MainActivity extends Activity {

    // Use a unique request code for each use case 
    private static final int REQUEST_CODE_EXAMPLE = 0x9345; 

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

        // Create a new instance of Intent to start DetailActivity
        final Intent intent = new Intent(this, DetailActivity.class);

        // Start DetailActivity with the request code
        startActivityForResult(intent, REQUEST_CODE_EXAMPLE);
    }

    // onActivityResult only get called 
    // when the other Activity previously started using startActivityForResult
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        // First we need to check if the requestCode matches the one we used.
        if(requestCode == REQUEST_CODE_EXAMPLE) {

            // The resultCode is set by the DetailActivity
            // By convention RESULT_OK means that whatever
            // DetailActivity did was executed successfully
            if(resultCode == Activity.RESULT_OK) {
                // Get the result from the returned Intent
                final String result = data.getStringExtra(DetailActivity.EXTRA_DATA);

                // Use the data - in this case, display it in a Toast.
                Toast.makeText(this, "Result: " + result, Toast.LENGTH_LONG).show();
            } else {
                // setResult wasn't successfully executed by DetailActivity 
                // Due to some error or flow of control. No data to retrieve.
            }
        }
    }
}

DetailActivity:

public class DetailActivity extends Activity {

    // Constant used to identify data sent between Activities.
    public static final String EXTRA_DATA = "EXTRA_DATA";

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

        final Button button = (Button) findViewById(R.id.button);
        // When this button is clicked we want to return a result
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // Create a new Intent object as container for the result
                final Intent data = new Intent();

                // Add the required data to be returned to the MainActivity
                data.putExtra(EXTRA_DATA, "Some interesting data!");
                
                // Set the resultCode as Activity.RESULT_OK to 
                // indicate a success and attach the Intent
                // which contains our result data
                setResult(Activity.RESULT_OK, data); 

                // With finish() we close the DetailActivity to 
                // return back to MainActivity
                finish();
            }
        });
    }

    @Override
    public void onBackPressed() {
        // When the user hits the back button set the resultCode 
        // as Activity.RESULT_CANCELED to indicate a failure
        setResult(Activity.RESULT_CANCELED);
        super.onBackPressed();
    }
}

Quelques points à connaître:

  • Les données ne sont renvoyées qu'une fois que vous appelez finish() . Vous devez appeler setResult() avant d'appeler finish() , sinon aucun résultat ne sera renvoyé.

  • Assurez-vous que votre Activity n'utilise pas android:launchMode="singleTask" , android:launchMode="singleTask" l' Activity sera exécutée dans une tâche distincte et vous ne recevrez donc aucun résultat. Si votre Activity utilise singleTask comme mode de lancement, elle appellera onActivityResult() immédiatement avec un code de résultat Activity.RESULT_CANCELED .

  • Soyez prudent lorsque vous utilisez android:launchMode="singleInstance" . Sur les appareils avant Lollipop (Android 5.0, API niveau 21), les activités ne renverront aucun résultat.

  • Vous pouvez utiliser des intentions explicites ou implicites lorsque vous appelez startActivityForResult() . Lorsque vous démarrez l'une de vos activités pour recevoir un résultat, vous devez utiliser une intention explicite pour vous assurer de recevoir le résultat attendu. Une intent explicite est toujours transmise à sa cible, peu importe ce qu'elle contient; le filter n'est pas consulté. Mais une intention implicite est transmise à un composant uniquement si elle peut traverser l'un des filtres du composant.