Activity通信 之 获取Activity的返回结果

源地址:http://developer.android.com/training/basics/intents/result.html

启动另外一个activity的方法不止一个模式,你也可以启动一个activity同时可以获取这个activity最后的返回结果。想要获取到返回的结果,需要使用startActivityForResult()代替startActivity()来启动activity。

比方说,你的APP启动相机APP的activity来拍照,完成之后可以获取到最后的拍照结果。又或者你需要启动联系人APP,然后选择一个联系人,把联系人的详细信息作为返回结果。

当然,这些这些可以产生反馈的APP必须被设置为返回一个结果。当执行返回结果的时候,这个结果是被作为 一个Intent对象返回的。你的activity可以在onActivityResult()函数里面接收这个返回的intent.

注意:在调用startActivityForResult()的时候,使用明确或者模糊的intent都可以。当启动你的APP自己的一个activity来获取这个activity的返回结果的时候,需要明确要启动的activity,来保证获取到的是你想要的结果。

启动Activity

使用Intent对象来启动一个activity来获取返回结果的时候,和之前说的启动activity的方法没什么大的区别,但是需要在startActivityForResult()里面添加一个额外的整型参数。

这个整型参数是作为我们这个动作的请求代码。当我们接受返回的intent结果的时候,回调函数onActivityResult()会返回一样的请求代码,这样我们就可以正确的区别我们的返回结果是哪个,从而进行正确的处理。

下面就是如何启动一个activity,来选择一个联系人:

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

接收返回结果

当用户结束后面启动的activity的操作,返回结果的时候,系统会调用你的activity里面的onActivityResult()方法。这个方法包含如下三个参数:

  • 你传递给startActivityForResult的请求代码,即第二个参数
  • 被启动的activity的一个返回代码。如果这个值是RESULT_OK,说明这个操作成功,返回了结果。如果是RESULT_CANCELED,说明按返回键退出了那个操作或者是因为某些原因操作失败,没有返回想要的结果
  • 一个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)
        }
    }
}

在这个例子里面返回的intent是由android系统的通讯录APP,或者其他的联系人APP返回,在intent里面提供一个Uri地址,标示用户选择的联系人。

为了正确的处理返回的intent结果,我们需要知道返回的intent的格式。当然如果是我们自己的APP返回的intent,我们很清楚它里面的格式,包含有哪些信息。android平台自带的那些APP都提供了自己的API,你可以利用这些API来识别具体返回的数据。例如,联系人APP(如早些版本上的联系人),它总是会返回衣蛾包含有Uri地址的intent结果,用这个Uri来识别被选中的联系人。相机应用返回的intent里面总是包含一个有Bitmap的exta数据”data”(详情阅读:Capturing Photos)。

额外讲解:读取联系人

上面的内容讲述了如果从联系人APP返回一个选择结果intent,但是没有讲述如何真正的去读取返回结果里面的数据,这个需要对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...
        }
    }

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值