专栏首页上善若水010android初级篇之Activity的返回值

010android初级篇之Activity的返回值

Activity的返回值

使用startActivity方式启动的Activity和它的父Activity无关,当它关闭时也不会提供任何反馈。 但是使用startActivityForResult方式启动的Activity,可以传递返回值和数据给他的父进程。这种方式最适合用在一个Activity为其它的Activity提供数据(例如用户从一个列表中选择一个项目)的场合。

启动子Activity

startActivityForResult方法和startActivity方法工作很相似,但有一个很重要的差异。Intent都是用来决定启动哪个Activity,你还可以传入一个请求码。这个值将在后面用来作为有返回值Activity的唯一ID。 下面的代码显示了如何启动一个子Activity:

private static final int REQUESTCODE_LOGIN = 1;
Intent intent = new Intent(this, LoginActivity.class);
startActivityForResult(intent, REQUESTCODE_LOGIN);

和正常的Activity一样,子Activity可以隐式或显式启动。下面的框架代码使用一个隐式的Intent来启动一个新的子Activity来挑选一个联系人:

private static final int PICK_CONTACT_SUBACTIVITY = 2;
Uri uri = Uri.parse(“content://contacts/people”);
Intent intent = new Intent(Intent.ACTION_PICK, uri);
startActivityForResult(intent, PICK_CONTACT_SUBACTIVITY);

返回值

当子Activity准备关闭时,在finish之前调用setResult来给调用的Activity返回一个结果。

setResult方法带两个参数:结果码和表示为Intent的负载值。结果码是运行子Activity的结果,一般是Activity.RESULT_OK或Activity.RESULT_CANCELED。在一些情况下,你会希望使用自己的响应代号来处理特定的应用程序的选择;setResult支持任何整数值。

作为结果返回的Intent可以包含指向一个内容(例如联系人,电话号码或媒体文件)的URI和一组用来返回额外信息的Extra。

接下来的代码片段节选自子Activity的onCreate方法,显示了怎样向调用的Activity返回不同的结果:

Button mButton = (Button) findViewById(R.id.ok_button);
 
mButton.setOnClickListener(new View.OnClickListener() {
    public void onClick(View view)
    {
        Uri data = Uri.parse(“content://horses/” + selected_horse_id);
        Intent result = new Intent(null, data);
        result.putExtra(IS_INPUT_CORRECT, inputCorrect);
        result.putExtra(SELECTED_PISTOL, selectedPistol);
        setResult(RESULT_OK, result);
        finish();
    }
});

Button cancelButton = (Button) findViewById(R.id.cancel_button);
 
cancelButton.setOnClickListener(new View.OnClickListener() {
    public void onClick(View view)
    {
        setResult(RESULT_CANCELED, null);
        finish();
    }
});

处理子Activity的结果

当子Activity关闭时,它的父Activity的onActivityResult事件回调函数被触发。 重写这个方法来处理从子Activity返回的结果。onActivityResult处理器接受好几个参数:

  1. requestCode 曾经用来启动子Activity的请求码。
  2. resultCode 结果码是由子Activity设置的,用来显示它的结果。它可以是任何整数值,但典型的值是Activity.RESULT_OK和Activity.RESULT_CANCELLED。

如果子Activity非正常关闭或在关闭时没有指定结果码,结果码都是Activity.RESULT_CANCELED。

  1. Intent data 一个Intent来打包任何返回的数据。依赖于子Activity的目的,它可能会包含一个代表特殊的从列表中选择的数据的URI。可变通的,或额外的,子Activity可以使用“extras”机制以基础值的方式返回临时信息。

下面的框架代码实现了一个Activity中的onActivityResult事件处理函数:

private static final int SHOW_SUB_ACTIVITY_ONE = 1;
private static final int SHOW_SUB_ACTIVITY_TWO = 2;
 
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch(requestCode)
{
    case (SHOW_SUB_ACTIVITY_ONE) :
    {
        if (resultCode == Activity.RESULT_OK)
        {
            Uri horse = data.getData();
            boolean inputCorrect = data.getBooleanExtra(IS_INPUT_CORRECT, false);
            String selectedPistol = data.getStringExtra(SELECTED_PISTOL);
        }
        break;
    }
    case (SHOW_SUB_ACTIVITY_TWO) :
    {
        if (resultCode == Activity.RESULT_OK)
        {
        // TODO: Handle OK click.
        }
        break;
    }
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 037android初级篇之Activity的几个重要函数

    手机屏幕事件的处理方法onTouchEvent。该方法在View类中的定义,并且所有的View子类全部重写了该方法,应用程序可以通过该方法处理手机屏幕的触摸事件...

    上善若水.夏
  • 022android初级篇之android的Context

    Interface to global information about an application environment. This is an abs...

    上善若水.夏
  • 036android初级篇之Activity的启动模式

    你可以通过定义运行模式来定义Activities如何与Task进行交互。定义的两种方式如下:

    上善若水.夏
  • Android 进阶1:Activity 的生命周期

    《Android 开发艺术探索》去年就看完了,但由于当时水平不够,加上自己脑子愚笨,很多知识没有完全消化。还是再来回顾、敲敲、总结一遍吧。 典型情况下的生命周...

    张拭心 shixinzhang
  • Android APP 快速 Pad 化实现

    如何能在最快的时间内,实现一个最新版本 Android app 的 pad 化呢?从拿到一个大型手机 app 代码开始开发到第一个其全新 pad 版本的发布,我...

    腾讯Bugly
  • 深入学习Activity的生命周期和启动模式

    说到Activity的生命周期,相信很多人都熟悉,但是深入了解后,发现还是有很多需要注意的细节。这里将生命周期分为两种情况,一种是典型情况下的生命周期,一种是异...

    trampcr
  • Activity详解(二)——异常情况下的生命周期分析

    最近 无意当中看到一道面试题是关于Activity异常情况下的生命周期分析,感觉自己还有所欠缺,随即在书中寻找完整答案,特记录如下。

    Demo_Yang
  • 测一测你对「Activity」的了解

    在日常的移动端测试沟通过程中,我们经常会听到开发说到一些平台开发术语,本次小编将对Android四大组件之一的Activity进行些简单的介绍和测试点总结。

    用户5521279
  • Android必知必会的四大组件--Activity

    onPause()说明当前的Activity已经暂停,但你并不是说暂停的意思只是没有了动作,而调用了onStop()才让Acivity不可见。

    ClericYi
  • 安卓开发之Activity

    一、Activity的作用 Activity作用就是和用户进行交互; Activity间接或者直接集成Context、ContextWrapper、Contex...

    苦咖啡

扫码关注云+社区

领取腾讯云代金券