安卓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);
}
}
运行截图:
一开始打开:
点击跳转:
点击返回: