启动Activity并获取返回结果

启动另一个Activity并不是单向的操作,您也可以启动另一个Activity并获取返回结果。startActivity()只启动另一个Activity,startActivityForResult()启动另一个Activity且获取返回结果。

例如,您的APP可以启动相机APP,并获取捕获的照片。或者,您的APP启动联系人APP,以便用户选择联系人,然后您的APP将收到用户所选联系人的详细信息。

当然,另一个Activity必须设计为能返回结果,并用Intent对象来发送这个结果。您的Activity在onActivityResult()回调中接收返回结果。

注意:当您调用startActivityForResult()时,可以使用显式或隐式Intent。当您启动的是您APP内的Activity时,您应该使用显式Intent来确保您收到预期的结果。

启动Activity

要启动Activity并获取返回结果,只需给startActivityForResult()方法传递一个额外的整型参数,Intent的使用方法同startActivity()。整型参数是一个“request code”,用于标识您的请求。当您收到结果Intent时,回调函数提供相同的“request code”,以便您的APP可以正确识别结果并确定如何处理它。

例如,以下是启动一个让用户选择联系人的Activity:

static final int PICK_CONTACT_REQUEST = 1;  // The request code
...
private void pickContact() {
    Intent pickContactIntent = new Intent(Intent.ACTION_PICK, Uri.parse("content://contacts"));
    pickContactIntent.setType(Phone.CONTENT_TYPE); // Show user only contacts w/ phone numbers
    startActivityForResult(pickContactIntent, PICK_CONTACT_REQUEST);
}

接收结果

当用户在启动的Activity中完成操作并返回时,系统将调用您的Activity的onActivityResult()方法。这个方法包括三个参数:
•传递给startActivityForResult()的request code
•由第二个Activity指定的result code。如果操作成功,则为RESULT_OK,如果用户退出或由于某种原因操作失败,则为RESULT_CANCELED。
•携带返回数据的Intent

例如,以下展示如何处理“选择联系人”Intent的结果:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // Check which request we're responding to
    if (requestCode == PICK_CONTACT_REQUEST) {
        // Make sure the request was successful
        if (resultCode == RESULT_OK) {
            // The user picked a contact.
            // The Intent's data Uri identifies which contact was selected.

            // Do something with the contact here (bigger example below)
        }
    }
}

在此示例中,Android的“联系人”APP返回的结果Intent提供了用于标识用户所选联系人的Uri。

为了成功处理结果,您必须了解结果Intent的格式是什么。如果返回结果的Activity是自定义Activity,那么结果Intent的格式是自定义的;如果返回结果的Activity是Android平台提供的APP,则需要在其API中查阅Intent格式。例如,联系人APP返回的结果包含标识所选联系人的URI,而Camera应用程序会在“data”中返回一个Bitmap(请参阅有关 Capturing Photos的类)。

读取联系人信息

上面的代码显示了如何从联系人APP获取结果,并没有详细介绍如何从结果中读取数据,这涉及关于content providers的更高级的讨论。下面的代码显示如何查询结果数据,从所选联系人获取电话号码:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // Check which request it is that we're responding to
    if (requestCode == PICK_CONTACT_REQUEST) {
        // Make sure the request was successful
        if (resultCode == RESULT_OK) {
            // Get the URI that points to the selected contact
            Uri contactUri = data.getData();
            // We only need the NUMBER column, because there will be only one row in the result
            String[] projection = {Phone.NUMBER};

            // Perform the query on the contact to get the NUMBER column
            // We don't need a selection or sort order (there's only one result for the given URI)
            // CAUTION: The query() method should be called from a separate thread to avoid blocking
            // your app's UI thread. (For simplicity of the sample, this code doesn't do that.)
            // Consider using CursorLoader to perform the query.
            Cursor cursor = getContentResolver()
                    .query(contactUri, projection, null, null, null);
            cursor.moveToFirst();

            // Retrieve the phone number from the NUMBER column
            int column = cursor.getColumnIndex(Phone.NUMBER);
            String number = cursor.getString(column);

            // Do something with the phone number...
        }
    }
}

注意:在Android 2.3(API等级9)之前,在Contacts Provider上执行查询(如上所示)要求您的应用程序声明READ_CONTACTS权限(请参阅 Security and Permissions)。然而,从Android 2.3开始,“联系人”APP在返回结果时,会授予您的APP临时权限以从Contacts Provider中读取联系人信息。临时权限仅适用于请求的特定联系人,因此除非您声明了READ_CONTACTS权限,否则您无法查询除Intent Uri指定的联系人之外的联系人。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Activity跳转并返回结果的执行流程一般包括以下几个步骤: 1. 在源Activity中调用startActivityForResult()方法,启动目标Activity,并传递一些必要的参数。 2. 在目标Activity中,处理传递过来的参数,并进行相应的操作。 3. 在目标Activity中,通过setResult()方法设置返回结果,并调用finish()方法关闭当前Activity。 4. 在源Activity中,重写onActivityResult()方法,处理目标Activity返回的结果,并进行相应的操作。 具体流程如下: 1. 在源Activity中,调用startActivityForResult()方法启动目标Activity,并传递一些必要的参数。 ``` Intent intent = new Intent(MainActivity.this, SecondActivity.class); intent.putExtra("name", "张三"); startActivityForResult(intent, 1); ``` 2. 在目标Activity中,获取传递过来的参数,并进行相应的操作。 ``` Intent intent = getIntent(); String name = intent.getStringExtra("name"); // ... ``` 3. 在目标Activity中,通过setResult()方法设置返回结果,并调用finish()方法关闭当前Activity。 ``` Intent intent = new Intent(); intent.putExtra("result", "操作成功"); setResult(RESULT_OK, intent); finish(); ``` 4. 在源Activity中,重写onActivityResult()方法,处理目标Activity返回的结果,并进行相应的操作。 ``` @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == 1 && resultCode == RESULT_OK) { String result = data.getStringExtra("result"); // 处理返回结果 } } ``` 以上就是Activity跳转并返回结果的执行流程。通过这种方式,可以在不同的Activity之间进行数据传递和交互,增强了Android应用程序的交互性和实用性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值