Android 从另一个活动获得结果

示例

通过使用,startActivityForResult(Intent intent, int requestCode)您可以启动另一个对象Activity,然后从Activity该onActivityResult(int requestCode, int resultCode, Intent data)方法中接收结果。结果将作为返回Intent。意图可以通过捆绑包包含数据


在此示例中,MainActivity将启动一个DetailActivity,然后从中期望结果。每种请求类型都应具有自己的int请求代码,以便在中的重写 onActivityResult(int requestCode, int resultCode, Intent data)方法中MainActivity,可以通过比较requestCode和的  值来确定要处理的请求REQUEST_CODE_EXAMPLE(尽管在此示例中只有一个)。

主要活动:

public class MainActivity extends Activity {

    // 针对每个用例使用唯一的请求代码 
    private static final int REQUEST_CODE_EXAMPLE = 0x9345; 

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

        // 创建一个新的Intent实例以启动DetailActivity
        final Intent intent = new Intent(this, DetailActivity.class);

        // 使用请求代码启动DetailActivity
        startActivityForResult(intent, REQUEST_CODE_EXAMPLE);
    }

    // onActivityResult仅被调用 
    // 当其他活动先前使用startActivityForResult开始时
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        // 首先,我们需要检查requestCode是否与我们使用的匹配。
        if(requestCode == REQUEST_CODE_EXAMPLE) {

            // resultCode由DetailActivity设置
            // 按照惯例RESULT_OK表示无论
            // DetailActivity做到了成功执行
            if(resultCode == Activity.RESULT_OK) {
                // 从返回的Intent中获取结果
                final String result = data.getStringExtra(DetailActivity.EXTRA_DATA);

                // 使用数据-在这种情况下,将其显示在Toast中。
                Toast.makeText(this, "Result: " + result, Toast.LENGTH_LONG).show();
            } else {
                // setResult未由DetailActivity成功执行 
                //由于某些错误或控制流程。没有数据可检索。
            }
        }
    }
}

DetailActivity:

public class DetailActivity extends Activity {

    // 用于标识活动之间发送的数据的常数。
    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);
        // 单击此按钮后,我们要返回结果
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // 创建一个新的Intent对象作为结果的容器
                final Intent data = new Intent();

                // 添加所需的数据以返回到MainActivity
                data.putExtra(EXTRA_DATA, "一些有趣的数据!");
                
                // 将resultCode设置为Activity.RESULT_OKto 
                // 表示成功并附加意图
                // 包含我们的结果数据
                setResult(Activity.RESULT_OK, data); 

                // 使用finish()我们将DetailActivity关闭为 
                // 回到MainActivity
                finish();
            }
        });
    }

    @Override
    public void onBackPressed() {
        // 当用户点击后退按钮时,设置resultCode 
        // asActivity.RESULT_CANCELED指示失败
        setResult(Activity.RESULT_CANCELED);
        super.onBackPressed();
    }
}

您需要注意的几件事:

  • 仅在您致电后才返回数据finish()。您需要在致电setResult()之前先致电finish(),否则将不会返回任何结果。

  • 确保您Activity没有使用android:launchMode="singleTask",否则它将导致Activity单独运行一个任务,因此您不会收到结果。如果您Activity将其singleTask用作启动模式,它将onActivityResult()立即以结果代码调用Activity.RESULT_CANCELED。

  • 使用时要小心android:launchMode="singleInstance"。在Lollipop之前的设备(Android 5.0,API级别21)上,“活动”将不会返回结果。

  • 调用时可以使用显式或隐式意图startActivityForResult()。在开始自己的活动之一以接收结果时,应使用明确的意图来确保收到预期的结果。显式intent总是传递到其目标,无论其包含什么内容;在filter没有咨询。但是,仅当隐式意图可以通过组件的筛选器之一时,才会传递给它。