[Android学习笔记]startActivityForResult和onActivityResult的使用

发开过程中,免不了多个页面之间相互交互通信。

Android中使用startActivityForResult方法和onActivityResult配合完成任务


startActivityForResult方法:

public void startActivityForResult (Intent intent, int requestCode)

public void startActivityForResult (Intent intent, int requestCode, Bundle options)

intent对象:

启动目标Activity,传递数据

requestCode码:

如果此值大于等于0,将会在当前Activity的onActivityResult方法中作为判断回传的子Activity的依据


onActivityResult 方法:

protected void onActivityResult (int requestCode, int resultCode, Intent data)

requestCode请求码:作为判断回传的子Activity的依据

resultCode结果码:子Activity的操作结果表示

intent对象:子Activity数据载体


使用步骤:

1.父Activity中重写onActivityResult方法

2.使用startActivityForResult启动子Activity


Ex:

1.MainActivity

        Button btn = (Button)findViewById(R.id.btnGotoSecondActivity);
        btn.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View arg0)
            {
                // TODO Auto-generated method stub
                
                // 设置传递的数据
                Intent intent = new Intent(arg0.getContext(),SecondActivity.class);
                Bundle bundle = new Bundle();
                bundle.putString("data", "hello third activty");
                intent.putExtra("data", bundle);
                
                // 设置请求码
                startActivityForResult(intent, SecondActivityRequestCode);
            }
        });
        
        Button btnThird = (Button)findViewById(R.id.btnGotoThirdActivity);
        btnThird.setOnClickListener(new View.OnClickListener()
        {
            
            @Override
            public void onClick(View arg0)
            {
                // TODO Auto-generated method stub
                
                // 设置传递的数据
                Intent intent = new Intent(arg0.getContext(),ThirdActivity.class);
                Bundle bundle = new Bundle();
                bundle.putString("data", "hello third activty");
                intent.putExtra("data", bundle);
                
                // 设置请求码
                startActivityForResult(intent, ThirdActivityRequestCode);
            }                                                                      
        });
MainActivity

2.onActivityResult

    /* requestCode:请求码
     * 用于标识回传的子Activity,根据此值判断是从哪一个子Activity返回的,它与startActivityForResult方法中的requestCode对应
     * 
     * resultCode:结果码
     * 是子Activity的一个结果标识,一般在子Activity中定义,子Activity操作结束之后,使用setResult方法设置子Activity的结果状态
     * 父Activity根据此结果码判断为对应的Activity做不同的处理
     * 
     * example:
     * if(requestCode == secondActivityRequestCode)
     * {
     *    if(resultCode == SecondActivityResultCodeSuccess)
     *    {
     *        // do success
     *    }
     *    else if(resultCode == SecondActivityResultCodeFail)
     *    {
     *        // do fail
     *    }
     * }
     * 
     * data:Intent对象
     * 子Activity的Intent对象,从此对象中获取Bundle载体,获取子Activity传递的数据
     * 
     * @see android.app.Activity#onActivityResult(int, int, android.content.Intent)
     */
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data)
    {
        // TODO Auto-generated method stub
        super.onActivityResult(requestCode, resultCode, data);

        // 从SecondActivity返回
        if(requestCode == SecondActivityRequestCode)
        {
            Intent intent = data;
            Bundle bundle = intent.getExtras();
            
            // 如果SecondActivity操作成功
            if(SecondActivity.SecondActivityResultCode1 == resultCode)
            {
                String dataString = bundle.getString("data");
                Toast.makeText(this, "get data from SecondActivity" + SecondActivity.SecondActivityResultCode1,Toast.LENGTH_SHORT).show();
            }
            else if(SecondActivity.SecondActivityResultCode2 == resultCode) // 如果SecondActivity操作失败
            {
                String dataString = bundle.getString("data");
                Toast.makeText(this, "get data from SecondActivity" + SecondActivity.SecondActivityResultCode2,Toast.LENGTH_SHORT).show();
            }
        }
        else if(requestCode == ThirdActivityRequestCode) //从ThirdActivity返回
        {
            Intent intent = data;
            Bundle bundle = intent.getExtras();
            String dataString = bundle.getString("data");
            
            Toast.makeText(this, "get data from ThirdActivity :" + dataString,Toast.LENGTH_SHORT).show();
        }
    }
onActivityResult

 3.SecondActivity

@Override
    public boolean onKeyDown(int keyCode, KeyEvent event)
    {
        // TODO Auto-generated method stub
        // return super.onKeyDown(keyCode, event);
        // 如果是物理返回按键
        if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0)
        {
            // 获取Intent
            Intent itent = this.getIntent();
            
            // 创建Bundle对象,设置需要回传的数据
            Bundle bundler = new Bundle();
            bundler.putString("data", "i ' m come from SecondActivity");
            
            // 为Intent设置数据载体Bundle
            itent.putExtras(bundler);

            // 设置结果
            // this.setResult(SecondActivityResultCode1, itent);
            this.setResult(SecondActivityResultCode2, itent);
            
            // 结束当前Activity
            this.finish();

            return false;
        } else
        // 如果不是物理返回按键则正常响应
        {
            return super.onKeyDown(keyCode, event);
        }
    }
SecondActivity
人生就是一局不能Again的DOTA
原文地址:https://www.cnblogs.com/hellenism/p/3671006.html