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

简单的例子

image

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

image

返回 后者 点击 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();
    }

}

转载于:https://www.cnblogs.com/qq28902581/p/4509990.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值