概述
在开发中,我们经常涌用到Activity,那么既然用到了Activity,就一定免不了在两个或者多个Activity之间传递数据。这里我们先说一说原理,然后在看看代码和例子。
情况A:我们需要从Activity_1启动并传递数据到Activity_2,Activity_2只需要接收来自Activity_1 的数据,但并不用做其他操作。
情况B:我们需要从Activity_1 启动Activity_2,同时希望Activity_2在销毁的时候向Activity_1传递数据。
首先我们来说一说情况A。
- 情况A是比较简单的,其实就Activity_1利用Intent的putExtra();方法来携带数据,然后Activity_2通过Intent的getExtra()方法来获取Activity_1传递过来的数据。
- 情况B比较麻烦一点点,但也是很简单。就是利用startActivityForResult()这个方法来启动Activity_2,然后Activity_2在利用Intent和setResult()方法来向Activity_1传送数据,最后,Activity_1通过回调方法onActivityResult()来接收Activity_2数据。
我们先来看看运行截图吧
然后我们看看代码,由于布局文件很简单。这里就不贴出布局文件了。就看看两个Activity的代码
package app.linfeng.com.myapplication;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
private Button bt_next;
private Button bt_nextforreustl;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bt_next = (Button) findViewById(R.id.bt_next);
bt_nextforreustl = (Button) findViewById(R.id.bt_nextforresult);
bt_next.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
/**
* 通过intent携带数据,传递给下一个活动
*/
Intent intent = new Intent(MainActivity.this,SecondAcitvity.class);
intent.putExtra("data","这个送给SecondActivity的礼物");
startActivity(intent);
}
});
/**
* 跳转到SecondActivity,并希望SecondActivity在销毁的时候放回数据
*
* */
bt_nextforreustl.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this,SecondAcitvity.class);
/**
* 请求码唯一就可以了。这里传入1
*/
startActivityForResult(intent,1);
}
});
}
/**
* 这个方法用于接收SecondActivty在销毁的时候回调的方法
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode){
case 1:
if(resultCode == RESULT_OK){
String str = data.getStringExtra("GiveData");
Toast.makeText(MainActivity.this,str,Toast.LENGTH_SHORT).show();
}
break;
default:
}
}
}
package app.linfeng.com.myapplication;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class SecondAcitvity extends AppCompatActivity {
private Button bt_showData;
private Button bt_giveData;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second_acitvity);
bt_showData = (Button) findViewById(R.id.bt_showdata);
bt_giveData = (Button) findViewById(R.id.bt_backdata);
/**
* 通过intent来接收上一个活动传递过来的数据
*/
Intent intent = getIntent();
final String str = intent.getStringExtra("data");
if(str==null){
bt_showData.setEnabled(false);
bt_giveData.setEnabled(true);
}else{
bt_showData.setEnabled(true);
bt_giveData.setEnabled(false);
}
bt_showData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(SecondAcitvity.this,str,Toast.LENGTH_SHORT).show();
}
});
/**
* 给MainActivyt回赠礼物
*/
bt_giveData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.putExtra("GiveData","这是回赠给MainActivity的礼物");
setResult(RESULT_OK,intent);
finish();
}
});
}
/**
* 用户点击放回键盘的时候需要返回数据
*/
@Override
public void onBackPressed() {
Intent intent = new Intent();
intent.putExtra("GiveData","这是回赠给MainActivity的礼物");
setResult(RESULT_OK,intent);
finish();
}
}
看到这里,相信大家也都清楚了吧。
Android Activity之间传递数据的6种方式
使用Inten的putExtra传递
第一个Activity中
//创建意图对象
Intent intent = new Intent(this,TwoActivity.class);
//设置传递键值对
intent.putExtra("data",str);
//激活意图
startActivity(intent);
第二个Activity中
// 获取意图对象
Intent intent = getIntent();
//获取传递的值
String str = intent.getStringExtra("data");
//设置值
tv.setText(str);
使用Intention的Bundle传递
第一个Activity中
//创建意图对象
Intent intent = new Intent(MainActivity.this,TwoActivity.class);
//用数据捆传递数据
Bundle bundle = new Bundle();
bundle.putString("data", str);
//把数据捆设置改意图
intent.putExtra("bun", bundle);
//激活意图
startActivity(intent);
第二个Activity
//获取Bundle
Intent intent = getIntent();
Bundle bundle = intent.getBundleExtra("bun");
String str = bundle.getString("data");
tv.setText(str);
使用Activity销毁时传递数据
第一个Activity中
Intent intent = new Intent(MainActivity.this,TwoActivity.class);
//用一种特殊方式开启Activity
startActivityForResult(intent, 11);
//设置数据
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
String str = data.getStringExtra("data");
tvOne.setText(str);
}
第二个activity中
//设置返回的数据
Intent intent = new Intent();
intent.putExtra("data", edtOne.getText().toString().trim());
setResult(3, intent);
//关闭当前activity
finish();
SharedPreferences传递数据
第一个Activity中
SharedPreferences sp = this.getSharedPreferences("info", 1);
//获取sp编辑器
Editor edit = sp.edit();
edit.putString("data", str);
edit.commit();
//创建意图对象
Intent intent = new Intent(MainActivity.this,TwoActivity.class);
//激活意图
startActivity(intent);
第二个Activity中
SharedPreferences sp = this.getSharedPreferences("info", 1);
//设置数据
tv.setText(sp.getString("data", ""));
使用序列化对象Seriazable
工具类
import java.io.Serializable;
class DataBean implements Serializable {
private String name;
private String sex;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
第一个Activity
//创建意图
Intent intent = new Intent(MainActivity.this,TwoActivity.class);
DataBean bean = new DataBean();
//通过set方法把数据保存到DataBean对象中
bean.setName("啦啦");
bean.setSex("男");
intent.putExtra("key", bean);
startActivity(intent);
第二个Activity
Intent intent = getIntent();
//反序列化数据对象
Serializable se = intent.getSerializableExtra("key");
if(se instanceof DataBean){
//获取到携带数据的DataBean对象db
DataBean db = (DataBean) se;
tv.setText(db.getName()+"==="+db.getSex());
}
使用静态变量传递数据
第一个Activity
Intent intent = new Intent(MainActivity.this,TwoActivity.class);
TwoActivity.name="牛逼";
TwoActivity.str="你说";
startActivity(intent);
第二个Activity
//静态变量
protected static String name;
protected static String str;
tv.setText(str+name);
以上所述是给大家介绍的关于Android Activity之间传递数据的6种方式,希望对大家有所帮助,如果大家有任何疑问或者想在Android开发中继续进阶自己的,可以参考获取《Android核心技术PDF》学习,里面内容包含30 多个技术文档,供大家学习进步。
文末
基本数据类型传递
String 不是基本数据类型,Java 的基本数据类型有且仅有8种,Intent 都做了很好的支持。这8种基本类型都有自己的包装类型(Wrap Class,复杂类型),而且包装类型也实现了 Serializable 接口(后面再说),使得 Intent 也能很好