目录
1、如果数据很少,就直接用intent的putExtra()方法来传递
2、如果数据很多,就使用bundle的putXxx和intent的putExtra结合
1、使用startActivityForResult()(官方不建议使用)
一、向下一个活动传递数据
1、如果数据很少,就直接用intent的putExtra()方法来传递
第一个activity的传递数据的主要代码:
public void sent(View view){
Intent intent = new Intent(this,MainActivity2.class);
String content = mTextView.getText().toString();
intent.putExtra("data",content);
startActivity(intent);
}
intent的putExtra()方法:就相当于一个快递小哥,将快递(数据)从第一个activity送到客户(第二个activity)手中。
putExtra()方法的第一个参数是键名,第二个参数是需要传递的数据。
第二个activity中:
Intent intent = getIntent();
String content = intent.getStringExtra("data");
TextView textView = findViewById(R.id.receiver);
textView.setText(content);
第二个activity使用intent 的getXxxExtra()方法拿数据,但是要凭借名字(键名)去拿。
2、如果数据很多,就使用bundle的putXxx和intent的putExtra结合
第一个activity中:
public void sent(View view){
Intent intent = new Intent(this,MainActivity2.class);
Bundle bundle = new Bundle();
bundle.putString("address","北京");
bundle.putString("phone","12345678910");
intent.putExtra("bundle",bundle);
startActivity(intent);
}
bundle的putXxx()方法就相当于将送去一个地方的快递打包成一个包裹并起名为bundle,并将这个包裹用intent的putExtra()送出去。
bundle的putXxx()方法的第一个参数是键名,第二个参数是需要传递的数据。
第二个Activity中:
TextView textView =findViewById(R.id.receiver);
TextView textView1 =findViewById(R.id.receiver1);
Intent intent = getIntent();
Bundle bundle = intent.getBundleExtra("bundle");
textView.setText(bundle.getString("address"));
textView1.setText(bundle.getString("phone"));
第二个activity中,调用intent的getBundleExtra()接收包裹,然后再调用bundle的getXxx()方法将包裹拆开,送到指定的地方。
3、传递复杂的数据(对象)
1、使用Serializable方式
先定义一个people类并实现Serializable接口:
package com.example.demo;
import java.io.Serializable;
public class people implements Serializable {
public String name;
public int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "people{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
MainActivity:
package com.example.demo;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
private TextView mTextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextView = findViewById(R.id.data);
}
public void sent(View view){
people people = new people();
people.setName("Tom");
people.setAge(18);
Intent intent = new Intent(this,MainActivity2.class);
intent.putExtra("peopleData",people);
startActivity(intent);
}
}
第二个activity:
package com.example.demo;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
public class MainActivity2 extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
TextView textView =findViewById(R.id.receiver);
people people = (com.example.demo.people) getIntent().getSerializableExtra("peopleData");
textView.setText(people.toString());
Log.d("Tag", "onCreate: "+people.getName());
Log.d("Tag", "onCreate: "+people.getAge());
}
}
二、下一个activity向上一个activity传递数据
1、使用startActivityForResult()(官方不建议使用)
startActivityForResult() 方法接收两个参数,第一个参数是Intent,第二个参数是请 求码,用于在之后的回调中判断数据的来源。
在第一个activity中:
使用startActivityForResult() 方法打开第二个Activity,将请求码设置为1。
public void onClick(View v) {
Intent intent = new Intent(this,MainActivity2.class);
startActivityForResult(intent,1);
}
在第二个activity中:
使用putExtra()方法传递数据,setResult() 方法接收两个参数,第 一个参数用于向上一个活动返回处理结果,一般只使用RESULT_OK 或RESULT_CANCELED 这 两个值,第二个参数则把带有数据的Intent传递回去,然后调用了finish() 方法来销毁当前活 动。
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.putExtra("return","hello!!!");
setResult(RESULT_OK,intent);
finish();
}
});
回到第一个acyivity:
重写onActivityResult方法,用来接收数据。
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case 1:
if(resultCode == RESULT_OK){
String returnData = data.getStringExtra("return");
Toast.makeText(this,"return--->"+returnData,Toast.LENGTH_LONG).show();
}
}
}
onActivityResult() 方法带有三个参数,第一个参数requestCode ,即我们在启动活动 时传入的请求码。第二个参数resultCode ,即我们在返回数据时传入的处理结果。第三个参 数data ,即携带着返回数据的Intent。