Android Training - 和其他程序交互(2) - 从一个activity取得结果

启动另外一个activity的方法不止一种,你也可以启动一个activity并从这个activity取得一个返回的结果,使用startActivityForResult()代替startActivity()可以实现。

例如,你的程序可以启动一个照相机然后取得相片做为结果。或者,你可以启动一个联系人程序,然后选择一个联系方式做为结果。

当然,响应的activity必须被设计成能返回一个结果,它通过另外一个intent发送结果,你使用onActivityResult()接收结果。

提示:当你调用startActivityForResult()时可以使用显式或者隐式的intent。但是接收返回的结果时,你需要使用一个显式的intent,以确保你能接收期望的结果。

启动Activity

启动一个可以返回结果的activity的intent对象没什么特别要求,但是你需要传递一个附加的整形参数给startActivityForResult()函数。

这个整形参数是一个“请求代码”,它指定了你的请求。当你接收结果Intent时,回调提供相同的请求代码以便你的程序可以正确匹配结果,确定怎么处理结果。

例如,下面是启动activity让用户选择一个联系方式:
static final int PICK_CONTACT_REQUEST = 1;  // 请求代码
...
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()函数,这个函数包含3个参数:
  • 请求代码,就是你传递给startActivityForResult()的。
  • 结果代码,由第二个activity指定,操作成功就返回RESULT_OK,如果用户返回,或者操作错误就返回RESULT_CANCELED。
  • 携带数据的Intent。
例如,下面代码展示了如果处理”挑选联系方式“的结果:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    //判断响应的是哪个请求代码
    if (requestCode == PICK_CONTACT_REQUEST) {
        // 确保请求成功
        if (resultCode == RESULT_OK) {
            // 用户选择一个联系人。
            // Intent数据指定了哪个联系人被选择。
            // 利用这个联系方式做点什么吧
        }
    }
}
这个例子中,返回的Intent由Android联系人或者联系人程序提供一个Uri内容,指定了哪个联系人被选择。

为了成功处理结果,你必须知道结果是什么格式的数据。在你自己activity中返回固定格式的结果很简单。Android平台包含的程序提供了自己的API,可以返回你期望的结果数据。例如,联系人程序通常返回一个URI内容,它指定了你选择的联系人。照相机程序返回一个位图在附加数据中。

附加知识:读取联系人数据

上面的代码说了怎么取得一个返回结果,但是没有说怎么读取这些结果数据,因为这涉及到一些更高级的讨论,是关于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) {
            // 取得选择的联系人的URI
            Uri contactUri = data.getData();
            // 你仅仅需要一个号码列,因为只有一行数据。
            String[] projection = {Phone.NUMBER};

            // 从联系人中查询电话号码列
            // 我们不需要挑选和排序,因为取得的URI只有一个结果
            // 警告:query()函数需要从一个单独的线程被呼叫,以避免阻塞UI线程(这个例子没有做到)。
            // 使用CursorLoader执行查询.
            Cursor cursor = getContentResolver()
                    .query(contactUri, projection, null, null, null);
            cursor.moveToFirst();

            // 从NUMBER列检索电话号码
            int column = cursor.getColumnIndex(Phone.NUMBER);
            String number = cursor.getString(column);

            // 用电话号码做一些什么...
        }
    }
}
提示:在Android2.3前,要在Contacts Provider上执行查询,你需要声明READ_CONTACTS权限。从Android2.3开始,当Contacts Provider返回一个结果时,联系人程序会给予你的程序一个临时读取权限。这个权限仅仅适用于一些特别的联系人请求,所以除了一个指定意图的Uri,你不能请求一个练习人,除非你声明READ_CONTACTS权限。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值