接收Activity返回的结果startActivityForResult

启动另外一个activity并不一定是单向的。我们也可以启动另外一个activity然后接受一个返回的result。为接受result,我们需要使用startActivityForResult()
,而不是startActivity()。 例如,下面是一个启动activity来选择联系人的例子:

**

启动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);
}

接收Result

**
当用户完成了启动之后activity操作之后,系统会调用我们activity中的onActivityResult() 回调方法。该方法有三个参数:

  1. 通过startActivityForResult()传递的request code(非0)。
  2. 第二个activity指定的result code。如果操作成功则是RESULT_OK
    ,如果用户没有操作成功,而是直接点击回退或者其他什么原因,那么则是RESULT_CANCELED
  3. 包含了所返回result数据的intent。

例如,下面显示了如何处理pick a contact的result:

@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)
        }
    }
}

但是在fragment中如果想要在onActivityResult()中获得返回值再启动的时候就有所不同了,
需要用fragment去调用startactivity。一下提供支持activity和fragment兼容的启动activity和获取返回值的方法:

 /**
     * 跳转使用demo
     */
    public void goUserActivity() {
        // activity 调用
        Intent intent1 = new Intent(this, UserInfoActivity.class);
        // 传递数据
        Bundle bundle = new Bundle();
        intent1.putExtras(bundle);
        startActivity(null, this, intent1, 2);

        // fragment 调用
        Intent intent2 = new Intent(this, UserInfoActivity.class);
        // 传递数据
        Bundle bundle1 = new Bundle();
        intent2.putExtras(bundle1);
        startActivity(this, null, intent2, 2);
    }


    /**
     * 通用activity跳转
     *
     * @param f           跳转的fragment
     * @param context     跳转的activity
     * @param intent      跳转使用的intent
     * @param requestCode 请求码>0
     */
    public static void startActivity(Fragment f, Context context, Intent intent, int requestCode) {
        if (f != null) {
            f.startActivityForResult(intent, requestCode);
        }
        else if (context instanceof Activity) {
            ((Activity) context).startActivityForResult(intent, requestCode);
        }
        else {
            context.startActivity(intent);
        }
    }

在跳转到UserInfoActivity后点击确定封装数据:

Intent intent = new Intent();
        Bundle bundle = new Bundle();
        bundle.putBoolean("boolean",true);
        intent.putExtras(bundle);
        setResult(RESULT_OK, intent);
        finish();

在返回的activity或fragment中如下接受数据:

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        // 在RESULT_OK之后保证是data使我们操作之后的结果
        if (resultCode == RESULT_OK) {
            if (requestCode == REQ_HOUSE) {
                // 获取传递的数据
                Bundle bundle = data.getExtras();
                // 获得返回值
                boolean istrue = bundle.getBoolean("boolean");
            }
        }
        super.onActivityResult(requestCode, resultCode, data);
    }

tip:
1.同时要获取联系人需要在menifest中声明READ_CONTACTS权限;
参考自:http://hukai.me/android-training-course-in-chinese/basics/intents/result.html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值