android中startActivityForResult( )与startActivity( )的不同之处

startActivityForResult( )与startActivity( )的不同之处

 startActivityForResultstartActivity的不同之处在于:
1, startActivity( )    
            
仅仅是跳转到目标页面,执行目标的Activity,若是想跳回当前页面,则必须再使用一次startActivity( )
2, startActivityForResult( )
            
可以一次性完成这项任务:当程序执行到这段代码的时候,页面会跳转到下一个Activity
而当这个Activity被关闭以后(this.finish()),程序会自动跳转会第一个Activity,并调用前一个ActivityonActivityResult( )方法。

通过重写onActivityResult( )方法,可以获取返回的数据。

关于onActivityResult(int requestCode, int resultCode, Intent data)参数问题:

 请求码与结果码

    通过startActivity(intent)打开一个新的ActivityAndroid为了减少组件间的耦合,使用了Intent,所以在onClick事件打开的新Activity不与主Activity在一个线程中。但是,当新Activity被关闭后,会触发主ActivityonActivityResult事件。

1.请求码(RequestCode

在一个业务中可能在两个按钮被单击事件中打开同一个Activity,但我们在onActivityResult事件中如何判断是哪个按钮打开了新的Activity?请求码就是为解决这个问题的,那么我们打开新的Activity时应该使用startActivityForResult(intent, 1);。其中的第二个参数就是请求码。

onActivityResult事件:

@Override

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

// TODO Auto-generated method stub

super.onActivityResult(requestCode, resultCode, data);

}

onactivityResult事件中,通过判断requestCode更可知道被关闭Activity是通过哪个位置打开的。

2.结果码(ResultCode)

在一个业务中可能要打开多个不同的Activity,那关闭Activity时在onactivityResult事件中我们如何知道关闭的是哪一个Activity呢?结果码就是为解决这个问题的,那么我们打开新的Activity时应该使用setResult(2, intent);或在关闭Activity前调用ActivityObj.setResult(2);。其中的第一个参数就是结果码。

onActivityResult事件中,通过判断resultCode更可知道是哪个Activity被关闭了。

其它的。。

目的: A.java 是主界面,B.java 是子功能模块,要从A启动BB干完活之后把结果汇报给A

先看 A.java 的相关代码

 

//-- A.java --//

//启动B

Intent bintent = new Intent(A.this, B.class);

//设置 bintentBundle的一个值

String bsay = "Hello, this is B speaking"; 

bintent.putExtra("listenB", bsay)

startActivityForResult(bintent,0); // 参数(Intent intent, Int requestCode) requestCode 对应下面回收Bundle时识别用的

 

//重写onActivityResult()来处理返回的数据,建议先看B.java 的代码再回来看这里比较好理解

//这理有三个参数 requestCode, resultCode, data

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

switch (resultCode) { //resultCode为回传的标记,我在B中回传的是RESULT_OK

case RESULT_OK:

Bundle b=data.getExtras();  //dataB中回传的Intent

String str=b.getString("ListenB");//str即为回传的值"Hello, this is B speaking"

                      break;

default:

          break;

}

}

 

-------------------------------------------------------------------------------------

//-- B.java --//

//  setResut() 准备好要回传的数据后,只要使用finish()的方法就能把打包好的数据发给A且运行onActivityResult()部分的代码

 

Intent aintent = new Intent(B.this, A.class);

setResut(RESULT_OK,aintent); //这理有2个参数(int resultCode, Intent intent)

... ...

finish();

 

-------------------------------------------------------------------------------------

OK,代码如上,可能这个时候还会有点疑问,关于参数的疑问。直接看android sdk 帮助说得更清楚。我发现网上有些文章还有吧 requestCode resultCode 混淆说明错的。

startActivityForResult(Intent intent,Int requestCode)

intent 传给B的,不解释,看不懂你还是玩玩手机算了,别想开发的事情了

requestCode >=0就好,随便用于在onActivityResult()区别哪个子模块回传的数据,如果还有C.java ,D甚至E子模块的话,每个区分开不同的requestCode就好。

 

setResut(int resultCode, Intent intent)

resultCode 如果B子模块可能有几种不同的结果返回,可以用这个参数予以识别区分。这里还有个特殊的 RESULT_OK 值,没有特殊情况用它就好了,sdk有说明的,呵。

intent 继续不解释,传回给AonActivityResult()

 

onActivityResult(int requestCode, int resultCode, Intent intent)

这里三个都不用解释了,与上文对应的东西。如果不对requestCoderesultCode 加以识别区分的话,只要有其他activity setResult到了A  onActivityResult()会无差别处理。

 

Android进阶2Activity之间数据交流(onActivityResult的用法)

主要功能:

在一个主界面(主Activity)上能连接往许多不同子功能模块(子Activity上去),当子模块的事情做完之后就回到主界面,或许还同时返回一些子模块完成的数据交给主Activity处理。这样的数据交流就要用到回调函数onActivityResult。

<1>startActivityForResult(Intent intent, int requestCode);

第一个参数:一个Intent对象

第二个参数:如果> = 0,当Activity结束时requestCode将归还在onActivityResult()中。以便确定返回的数据是从哪个Activity中返回

<2>onActivityResult(int requestCode, int resultCode, Intent data)

第一个参数:这个整数requestCode提供给onActivityResult,是以便确认返回的数据是从哪个Activity返回的。

            这个requestCode和startActivityForResult中的requestCode相对应。

第二个参数:这整数resultCode是由子Activity通过其setResult()方法返回。


第三个参数:一个Intent对象,带有返回的数据。

<3>setResult(int resultCode, Intent data)

调用这个方法把Activity想要返回的数据返回到父Activity

第一个参数:当Activity结束时resultCode将归还在onActivityResult()中,一般为RESULT_CANCELED , RESULT_OK。

第二个参数:一个Intent对象,返回给父Activity的数据。

 

       

   

 

本实例一共有三个Activity。点击飞往火星跳转到otherActivity,把地球带给火星的消息显示在otherActivity中。点击返回地球时把火星带给地球的消息传到主Activity.

同理:

点击飞往月球跳转到thirdActivity,把地球带给月球的消息显示在thirdActivity中。点击返回地球时把月球带给地球的消息传到主Activity.

 

具体实现:

主Activity:

 

package xiaosi.onActivityResult;

 

import android.app.Activity;

import android.content.Intent;

import android.os.Bundle;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.TextView;

 

public class OnActivityResultActivity extends Activity

{

       private Button                           button    = null;

       private Button                           button1  = null;

       private TextView                text = null;

       private static final int   Mars       = 0;

       private static final int   Moon      = 1;

 

       @Override

       public void onCreate(Bundle savedInstanceState)

       {

              super.onCreate(savedInstanceState);

              setContentView(R.layout.main);

              text = (TextView) findViewById(R.id.text);

              button = (Button) findViewById(R.id.button);

              button.setOnClickListener(new OnClickListener() {

                     @Override

                     public void onClick(View v)

                     {

                            Intent intent = new Intent(OnActivityResultActivity.this, otherActivity.class);

                            String content = "地球来的消息:你好,我是来自地球上的小老鼠。我好想去你们的火星呀";

                            intent.putExtra("FromEarth", content);

                            startActivityForResult(intent, Mars);

                     }

              });

              button1 = (Button) findViewById(R.id.button1);

              button1.setOnClickListener(new OnClickListener() {

                     @Override

                     public void onClick(View v)

                     {

                            Intent intent = new Intent(OnActivityResultActivity.this, thirdActivity.class);

                            String content = "地球来的消息:你好,我是来自地球上的小老鼠。我好想去你们月球";

                            intent.putExtra("FromEarth", content);

                            startActivityForResult(intent, Moon);

                     }

              });

       }

 

       @Override

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

       {

              switch (requestCode)

              {

              case Mars:

                     Bundle MarsBuddle = data.getExtras();

                     String MarsMessage = MarsBuddle.getString("FromMars");

                     text.setText(MarsMessage);

                     break;

              case Moon:

                     Bundle MoonBuddle = data.getExtras();

                     String MoonMessage = MoonBuddle.getString("FromMoon");

                     text.setText(MoonMessage);

                     break;

              }

       }

}


otherActivity:


thirdActivity:

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
startActivity和startActivityForResultAndroid开发常用的两个方法,它们的区别如下[^1]: 1. startActivity( ):这个方法用于启动另一个Activity,它不会自动返回到原来的Activity。如果需要返回到原来的页面,必须再次使用startActivity( )来启动原来的Activity。 2. startActivityForResult( ):这个方法也用于启动另一个Activity,但它可以在启动的Activity结束后返回结果给原来的Activity。在启动Activity时,可以传递一个请求码(requestCode),当启动的Activity结束后,可以通过onActivityResult( )方法获取返回的结果。 下面是一个示例代码,演示了startActivity和startActivityForResult的使用: ```java // 启动另一个Activity Intent intent = new Intent(MainActivity.this, SecondActivity.class); startActivity(intent); // 启动另一个Activity并获取返回结果 Intent intent = new Intent(MainActivity.this, SecondActivity.class); startActivityForResult(intent, REQUEST_CODE); // 在启动的Activity设置返回结果 Intent intent = new Intent(); intent.putExtra("result", "Hello World"); setResult(RESULT_OK, intent); finish(); // 在原来的Activity获取返回结果 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) { String result = data.getStringExtra("result"); // 处理返回结果 } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值