安卓学习笔记----简述Activity间数据传递方法之利用Intent传递extra信息

安卓Activity间信息传递方式有很多,这里我们实现利用intent传递extra信息这种方式

Intent简介

众所周知,安卓一个Activity打开另一个Activity最简单方法是使用startActivity(Intent),参数Intent是component用来与操作系统通信的一种媒介,作为打开另一个Activity的钥匙,此时Intent的构造方法为:

public Intent(Context context,Class<?> class)

第一个参数是发送方的上下文对象,即FirstActivity.this,第二个参数是目的Activity的class对象,即SecondActivity.class

发送Intent消息的过程不是从FirstActivity到SecondActivity,而是由FirstActivity到ActivityManager(操作系统),再由ActivityManager通知SecondActivity。

Context参数告诉ActivityManager在哪可以找到FirstActivity,而class类型参数告诉ActivityManager应该启动哪个Activity.

第一种情况: FirstActivity传递信息给SecondActivity

首先将信息通过 Intent.putExtra(key,value) 的方式存入Intent,取的时候使用 getIntent().getStringExtra(“key”); 取出数据

代码如下:
FirstActivity.java
import android.app.Activity;
import android.content.Intent;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class FirstActivity extends AppCompatActivity {

    private Button mButton;
    private TextView mTextView;

    private String myData = "第一个页面的信息";

    private void init(){
        mButton = findViewById(R.id.myButton);
        mTextView = findViewById(R.id.myText);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        init();

        mButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
            //新建一个intent,调用SecondActivity.newIntent方法
               Intent intent = SecondActivity.newIntent(FirstActivity.this,myData);
               startActivity(intent);          
            }
        });
    }
}
SecondActivity.java
import android.content.Context;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;

public class SecondActivity extends AppCompatActivity {

    private TextView mTextView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        mTextView = findViewById(R.id.showData);
        //获取数据
        String getData = "";//获取第一个页面传回的数据
        getData = getIntent().getStringExtra("data");
        mTextView.setText(getData);//显示在ui界面
    }

    /**
     * 需要从某个地方传入一个字符串类型的数据,我用data这个名字接收它
	
	使用静态方法在目的界面创建newIntent方法,返回Intent对象,放在FirstActivity中调用的原因:
	简化代码涉及的key值,这样FirstActivity就不需要知道SecondActivity把这个参数设置成什么名字,只需要往里传一个数据就行
     * */
    public static Intent newIntent(Context context,String data){
        Intent intent = new Intent(context,SecondActivity.class);
        intent.putExtra("data",data);
        return intent;
    }
}

第二种情况: FirstActivity传递信息给SecondActivity,SecondActivity返回信息回FirstActivity

此时需要在FirstActivity将 startActivity(Intent) 改成 startActivityForResult(Intent,requestCode) ,第二个参数是请求代码,为一个int值
在SecondActivity中增加 setResult(RESULT_OK,intent); 方法,intent依然存储返回的信息,RESULT_OK是常量,FirstActivity接收验证使用,除了RESULT_OK,还可以是RESULT_CANCELED或者RESULT_FIRST_USER,具体实现看代码

代码如下:
FirstActivity.java
import android.app.Activity;
import android.content.Intent;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class FirstActivity extends AppCompatActivity {

    private final static String TAG = "MainActivityLog";
    private final static int REQUEST_CODE_FOR_SECOND_ACTIVITY = 0;

    private Button mButton;
    private TextView mTextView;

    private String myData = "第一个页面的信息";
    private String returnData = "";//从第二个页面返回的信息

    private void init(){
        mButton = findViewById(R.id.myButton);
        mTextView = findViewById(R.id.myText);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        init();

        mButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = SecondActivity.newIntent(FirstActivity.this,myData);
//                startActivity(intent);
                //发送数据并接收返回数据的方法
                startActivityForResult(intent,REQUEST_CODE_FOR_SECOND_ACTIVITY);
            }
        });
    }


    //获取第二个页面返回的数据
    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        //如果resultCode不是RESULT_OK,即此时不是返回的,而是刚刚打开的activity
        if (resultCode != Activity.RESULT_OK){
            return;
        }
        //如果是我们需要的
        if (requestCode == REQUEST_CODE_FOR_SECOND_ACTIVITY){
            if (data == null){
                return;//没有数据
            }

            //获得数据
            returnData = SecondActivity.returnData(data);
            mTextView.setText("更新:"+returnData);
        }
    }
}
SecondActivity.java
import android.content.Context;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;

public class SecondActivity extends AppCompatActivity {

    private String getData = "";//获取第一个页面传回的数据


    private TextView mTextView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        mTextView = findViewById(R.id.showData);

        //获取数据
        getData = getIntent().getStringExtra("data");
        mTextView.setText(getData);//显示在ui界面

        //设置返回的数据
        String dataBack = "我是第二个页面返回的数据";
        setDataBack(dataBack);
    }

    /**
     * 需要从某个地方传入一个字符串类型的数据,我用data这个名字接收它
     * */
    public static Intent newIntent(Context context,String data){
        Intent intent = new Intent(context,SecondActivity.class);
        intent.putExtra("data",data);
        return intent;
    }

    /**
     * 静态方法,返回Intent返回的数据
     * */
    public static String returnData(Intent data){
        return data.getStringExtra("dataBack");
    }

    /**
     * 返回给发起者Activity数据的方法
     * */
    private void setDataBack(String dataBack){
        Intent intent = new Intent();
        intent.putExtra("dataBack",dataBack);
        setResult(RESULT_OK,intent);
    }
}

运行截图:
一开始打开:
在这里插入图片描述
点击跳转:
在这里插入图片描述
点击返回:
在这里插入图片描述

发布了34 篇原创文章 · 获赞 65 · 访问量 3713

猜你喜欢

转载自blog.csdn.net/baidu_41860619/article/details/104426980