首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网络技术 > 网络基础 >

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

2012-09-08 
Android Training - 和其他程序交互(2) - 从一个activity取得结果启动另外一个activity的方法不止一种,你

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。例如,下面代码展示了如果处理”挑选联系方式“的结果:
@Overrideprotected 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的。如果你好奇的话,下面这些代码展示了如何从选择的联系人中取得电话号码:
@Overrideprotected 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权限。

热点排行