Android Ottenere un risultato da un'altra attività


Esempio

Utilizzando startActivityForResult(Intent intent, int requestCode) è possibile avviare un'altra Activity e quindi ricevere un risultato da tale Activity nel onActivityResult(int requestCode, int resultCode, Intent data) . Il risultato sarà restituito come Intent . Un intento può contenere dati tramite un pacchetto


In questo esempio, MainActivity avvierà un'attività DetailActivity e quindi si aspetta un risultato da essa. Ogni tipo di richiesta deve avere il proprio int codice di richiesta, in modo che nel sovrascritto onActivityResult(int requestCode, int resultCode, Intent data) metodo MainActivity , può essere determinato che chiedono di elaborare confrontando valori di requestCode e REQUEST_CODE_EXAMPLE (anche se in questo esempio, ce n'è solo uno).

Attività 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();
    }
}

Alcune cose che devi sapere:

  • I dati vengono restituiti solo dopo aver chiamato finish() . Devi chiamare setResult() prima di chiamare finish() , altrimenti non verrà restituito alcun risultato.

  • Assicurati che la tua Activity non stia utilizzando android:launchMode="singleTask" , altrimenti l' Activity verrà eseguita in un'attività separata e pertanto non riceverai un risultato da essa. Se la tua Activity utilizza singleTask come modalità di avvio, chiamerà onActivityResult() immediatamente con un codice risultato di Activity.RESULT_CANCELED .

  • android:launchMode="singleInstance" attenzione quando usi android:launchMode="singleInstance" . Sui dispositivi prima di Lollipop (Android 5.0, Livello API 21), le attività non restituiscono un risultato.

  • È possibile utilizzare intenti espliciti o impliciti quando si chiama startActivityForResult() . Quando si avvia una delle proprie attività per ricevere un risultato, è necessario utilizzare un intento esplicito per assicurarsi di ricevere il risultato previsto. Un intent esplicito viene sempre consegnato al suo obiettivo, indipendentemente da cosa contenga; il filter non viene consultato. Ma un intento implicito viene consegnato a un componente solo se può passare attraverso uno dei filtri del componente.