intent传递数据和返回数据给上一个活动

startActivityForResult与startActivity的不同之处在于
1、startActivity( )
仅仅是跳转到目标页面,若是想跳回当前页面,则必须再使用一次startActivity( )。
2、startActivityForResult( )
可以一次性完成这项任务,当程序执行到这段代码的时候,假若从T1Activity跳转到下一个Text2Activity,而当这个Text2Activity调用了finish()方法以后,程序会自动跳转回T1Activity,并调用前一个T1Activity中的onActivityResult( )方法。

相关函数:
startActivityForResult(Intent intent, Int requestCode)
setResut(int resultCode, Intent intent)
onActivityResult(int requestCode, int resultCode, Intent intent)

Android activity的setResult()在什么时候调用

如果在startActivityForResult起来的Activity里面设置setResult,结果并不会马上返回给parent的Activity,只有当前Activity被finish,结果才会被发送给parent的onActivityResult去处理!

如果一个activity要返回数据到启动它的那个activity,可以调用setResult()方法。那什么时候去调用setResult()方法返回数据呢?

activity返回result是在被finish的时候,也就是说调用setResult()方法必须在finish()之前。

如下方法中调用setResult()也有可能不会返回成功: onPause(), onStop(), onDestroy(),
因为这些方法调用不一定是在finish之前的,当然在onCreate()就调用setResult肯定是在finish之前的。

按BACK键从一个Activity退出来的,一按BACK,android就会自动调用Activity的finish()方法,然后设置resultCode为RESULT_CANCELED,也就不会返回任何数据了 .
解决方法就是在Activity里面捕获按BACK的事件,捕获到之后先setResult,然后自己来调用finish,就搞定了……把BACK事件直接自己给吞了。需要重写onBackPressed()函数。

以上摘抄自 http://www.cnblogs.com/lijunamneg/archive/2013/02/05/2892616.html

简单的例子

三个Activity,主Activity,如图所示,点击Button分别启动另外两个Activity。

返回 后者 点击 Button后,回到主Acticiy并传递数据到主Activity,并在TextView上显示处理

MainActivity

package com.example.work;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity
{
    private Button btn2, btn3;
    private TextView tView;
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_main);
        btn2 = (Button) findViewById(R.id.btn);
        btn2.setOnClickListener(new OnClickListener()
        {

            public void onClick(View arg0)
            {
                Intent intent = new Intent(MainActivity.this, TwoActivity.class);
                intent.putExtra("totwo", "第一个Activity传递过来的22");
                startActivityForResult(intent, 2);// startActivityForResult这个函数也可以正常传递数据给下一个Activity
                                                    // 这里的 2 是自己设置的,但要>=0
            }
        });
        btn3 = (Button) findViewById(R.id.btn3);
        btn3.setOnClickListener(new OnClickListener()
        {

            @Override
            public void onClick(View arg0)
            {
                startActivityForResult(new Intent(MainActivity.this, ThreeActivity.class).putExtra("tothree", "第一个Activity传递过来的33"), 3);// 用上面的一个意思。

            }
        });

    }

    @Override
    // 用startActivityForResult()方法启动另外的Activity,退出或者返回之后,要调用这个onActivityResult函数来处理返回的intent。需要重写这个函数
    protected void onActivityResult(int requestCode, int resultCode, Intent data)
    {
        // TODO Auto-generated method stub
        String result;
        tView = (TextView) findViewById(R.id.onetv);
        switch (requestCode)
        {
            case 2 : // 这里的2 与上面的startActivityForResult(intent, 2);里的2 是对应的。
                if (resultCode == RESULT_OK)
                {
                    // Log.i("MainAcitvity", RESULT_OK+"");
                    // result = data.getExtras().getString("twodata");
                    // tView.setText(result);
                    tView.setText(data.getExtras().getString("twodata"));
                }
                break;

            case 3 : // 同上面的是一个i额意思。
                if (resultCode == RESULT_CANCELED)
                {

                    Log.i("MainAcitvity", RESULT_CANCELED + "");
                    result = data.getExtras().getString("threeidata");
                    tView.setText(result);
                }
                break;
            default :
                break;
        }
    }

    public boolean onCreateOptionsMenu(Menu menu)
    {
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    public boolean onOptionsItemSelected(MenuItem item)
    {
        int id = item.getItemId();
        if (id == R.id.action_settings)
        {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
}

TwoActivity

package com.example.work;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.Button;
import android.widget.TextView;

public class TwoActivity extends Activity
{
    private TextView tView;
    private Button btn;
    public static final String TAG = "TwoActivity";
    @Override
    public void onCreate(Bundle savedInstanceState)
    {

        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.twoactivity);
        tView = (TextView) findViewById(R.id.tv);
        tView.setText(getIntent().getStringExtra("totwo"));

        btn = (Button) findViewById(R.id.twobtn);
        btn.setOnClickListener(new OnClickListener()
        {

            @Override
            public void onClick(View arg0)
            {
                /*
                 * intent 携带数据。setResult(resultCode,
                 * data)带两个参数,resultCode一个是向上一个活动返回 --处理的结果--。一般是常量RESULT_OK
                 * (值为0)或者RESULT_CANCELED(值为-1).另一个data是带有数据的intent。
                 * 当执行到finish()是,关闭当前的Activity,并返回带有数据的intent到调用它的Activity。
                 */
                Intent intent = new Intent();
                intent.putExtra("twodata", "Two传递过来的");
                setResult(RESULT_OK, intent);

                // setResult必须在finish()这个函数前面。//
                finish();

            }
        });

    }

    @Override
    // 当用户不是点击button,而是点击 返回键是,调用这个函数。
    public void onBackPressed()
    {
        // TODO Auto-generated method stub
        Intent intent = new Intent();
        intent.putExtra("twodata", "Two传递过来的");
        setResult(RESULT_OK, intent);
        finish();
    }

    @Override
    protected void onDestroy()
    {
        // TODO Auto-generated method stub
        super.onDestroy();
        Log.i(TAG, "onDestroy");
    }
    @Override
    protected void onPause()
    {
        // TODO Auto-generated method stub
        super.onPause();
        Log.i(TAG, "onPause");
        Intent intent = new Intent();
        intent.putExtra("twodata", "Two传递过来的");
        setResult(2, intent);
        // finish();
    }
    @Override
    protected void onRestart()
    {
        // TODO Auto-generated method stub
        super.onRestart();
        Log.i(TAG, "onRestart");
    }
    @Override
    protected void onResume()
    {
        // TODO Auto-generated method stub
        super.onResume();
        Log.i(TAG, "onResume");
        // Intent intent =new Intent();
        // intent.putExtra("aaa", "Two传递过来的");
        // setResult(RESULT_OK, intent);
    }
    @Override
    protected void onStart()
    {
        // TODO Auto-generated method stub
        super.onStart();
        Log.i(TAG, "onStart");
    }
    @Override
    protected void onStop()
    {
        // TODO Auto-generated method stub
        super.onStop();
        Log.i(TAG, "onStop");
    }

}

ThreeActivity   --(和第二个差不多)

package com.example.work;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.Button;
import android.widget.TextView;

public class ThreeActivity extends Activity
{
    private Button btn;
    private TextView tView;
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.threeactvity);

        btn = (Button) findViewById(R.id.threebtn);
        tView = (TextView) findViewById(R.id.threetv);
        btn.setOnClickListener(new OnClickListener()
        {

            @Override
            public void onClick(View arg0)
            {
                // TODO Auto-generated method stub
                setResult(RESULT_CANCELED, new Intent().putExtra("threeidata", "第三个Activit传递过来的数据"));
                finish();
            }
        });

        tView.setText(getIntent().getStringExtra("tothree"));
    }

    public void onBackPressed()
    {
        // TODO Auto-generated method stub
        setResult(RESULT_CANCELED, new Intent().putExtra("threeidata", "第三个Activit传递过来的数据"));
        finish();
    }

}
时间: 2024-10-10 11:21:31

intent传递数据和返回数据给上一个活动的相关文章

返回数据给上一个活动

我们都知道,android开发中一个活动跳转时是可以带数据传递给下一个活动的,那么能不能够返回数据给上一个活动呢?答案是肯定的.不过不同的是,返回上一个活动只需要按一下Back键就可以了,并没有一个用于启动活动Intent来传递数据.通过查阅文档你会发现,Activity中还有一个startActivityForResult()方法也是用于启动活动的,但这个方法期望在活动销毁的时候能返回一个结果给上一个活动.毫无疑问,这就是我们所需要的. startActivityForResult()方法接收

Winform开窗,筛选数据后返回数据的方法

在开发中,经常需要打开另一个窗体(简写为"开窗"),然后在开窗中进行数据筛选,选中需要的数据,最后将值传递给本原来的窗体.而且,这个开窗可以重复用于多个地方,其效果如同日历控件的弹出窗口.如下图所示: 测试环境 vs2008 基本思路 1.创建一个窗体类. (1)为该类添加用于传递值的属性. (2)为该类添加一个事件,用于通知调用方值已经准备好. (3)在窗体类的某个函数中,如单元格双击处理函数中,为属性赋值,并引发这个事件. 2.调用该窗体类. (1)定义一个全局的窗体类对象. (2

ASP.NET API(MVC) 对APP接口(Json格式)接收数据与返回数据的统一管理

话不多说,直接进入主题. 需求:基于Http请求接收Json格式数据,返回Json格式的数据. 整理:对接收的数据与返回数据进行统一的封装整理,方便处理接收与返回数据,并对数据进行验证,通过C#的特性对token进行验证,并通过时间戳的方式统一处理接收与返回的时间格式. 请求Json格式: { "Cmd": "login", "Token": "", "PageNo": 0, "OnePageNu

android webview点击返回键回到上一个html

android webview点击返回键返回上一个html 1 @Override 2 public boolean onKeyDown(int keyCode, KeyEvent event) { 3 if (keyCode == KeyEvent.KEYCODE_BACK && mWebView.canGoBack()) { 4 mWebView.goBack();// 返回前一个页面 5 return true; 6 } 7 return super.onKeyDown(keyCod

【Android】8.0 Intent向下一个活动传递数据、返回数据给上一个活动

1.0 Android是使用任务(Task)来管理活动的,活动就像栈一样堆放着在一起. 每个活动的生命周期最多可能会有四种状态: 1.1 运行状态 位于栈顶 1.2 暂停状态 不在栈顶但在界面上仍处于可见状态 1.3 停止状态 不位于栈顶,且在界面上不可见时 1.4 销毁状态 从返回栈中移除之后 2.0 Activity类定义了7个回调方法,覆盖了活动生命周期的每一个环节: 2.1 onCreate()  该方法最为常见了,活动一创建自动有,每个活动都会重写这个方法.  负责活动的初始化操作,比

Android开发:向下一个activity传递数据,返回数据给上一个activity

1.向下一个activity传递数据 activity1 1 Button button=(Button) findViewById(R.id.button1); 2 button.setOnClickListener(new OnClickListener() { 3 4 @Override 5 public void onClick(View v) { 6 Intent intent=new Intent("1111111111111111111"); 7 intent.addCa

启动一个新的activity并携带数据,返回数据给上一个activity

一.在启动一个新的activity的时候可以通过Intent携带数据,通过Intent.putExtra()方法通过键值对的形势装入数据.在新启动的activity中通过           getIntent()方法获取启动activity的Intent,并通过getxxxxExtra()获取传递的数据. 二.如果希望被启动的新activity返回数据,则需要使用startActivityForResult()启动新的activity,方法携带两个参数,第二个为请求码,用于返回时判断是由哪个a

Activity返回数据给上一个活动

1.在A这个Activity中以startActivityForResult(intent, requestCode)启动B这个Activity 2.在B这个Activity中setResult(resultCode, intent);finish();结束活动 3.重写A这个Activity的onActivityResult(int requestCode, int resultCode, Intent data)方法来处理数据如:@Overrideprotected void onActiv

检查数据接口返回数据合法性

问题背景: 在测试&部署监控过程中,我们常常会遇到外部接口返回数据不靠谱的时候.最常见的场合是从某个http获取如json和xml等结构化的结果,进行解析并处理,在这时候出现以下这几种常见类型的错误: (1)整个结构不完整.直接无法解析json/xml. (2)编码错误,常见的gbk/utf8错误 (3)超长数据/非法字符. (4)数据类型不匹配.需要是数字的给了字符串,该是数组的给了字符串等,对json本身来说没问题,程序处理就会错误或者崩溃. (5)字段缺失或者为空,这个情况对json本身来