Android学习笔记之传递数据
在 Android 开发中,可以使用 Intent
来在两个 Activity 之间传递数据。通过在 Intent
中添加键值对,然后在下一个 Activity 中使用 getIntent()
方法获取 Intent
对 象,再使用 getXXXExtra()
方法获取数据。可以使用 putExtra()
传值,使用 getXXXExtra()
取值。
让然其他办法也很多:全局变量啦、单例啦、依赖注入感觉更好用,但不在本文讨论范围内。
Intent
类
Intent
类封装了下面6种信息:
- 组件名称(
ComponentName
) - 动作(
Action
) - 种类(
Category
) - 数据(
Data
) - 附件信息(
Extra
) - 标志(
Flag
)
Data
可以传递数据,但涉及到 Intent
的筛选机制比较复杂(还没学到),这里,我使用 Extra
传递数据。
让我们声明一个 Intent
并写入数据:
Intent intent = new Intent(this, GetMessage.class); // GetMessage.class 表示数据接收者
intent.putExtra("key", value); // 键值对,key是字符串,value是任意Java内置数据类型
设置上下文
上面的代码第一行用于设置上下文( context
)。第一个参数引用自身,用 this
;第二个参数引用目标类 (数据接收者),注意,是对类的引用,不是对象。
你可以这样设置上下文:
- 方法一
Intent intent = new Intent(this, GetMessage.class);
- 方法二
Intent intent = new Intent();
intent.setClass(this, GetMessage.class);
- 方法三
Intent intent = new Intent();
intent.setClassName(this, "host.skyone.intent.GetMessage");
- 方法四
Intent intent = new Intent();
intent.setClassName("host.skyone.intent.MainActivity", "host.skyone.intent.GetMessage");
设置数据
设置数据使用 intent.putExtra(String key, value)
方法,value
可以说任意 Java内置数据类型及其数组
。
intent.putExtra("name", "skyone");
intent.putExtra("age", 19);
当然,你也可以使用 intent.putExtras(Bundle data)
方法并传入 Bundle
对象设置数据。
Bundle bundle = new Bundle();
bundle.putString("name", "skyone");
bundle.putInt("age", 19);
intent.putExtras(bundle);
传出数据
想要打开一个 activity
并写入数据,只需要调用:
satrtActivity(intent);
是不是很简单?
接收数据
从打开的新 activity
中接收数据:
Intent intent = getIntent();
String name = intent.getStringExtra("name"); // name = "skyone"
int age = intent.getIntExtra("age"); // age = 19
当然,使用 bundle
也是可以滴:
Intent intent = getIntent();
Bundle bundle = intent.getExtras();
String name = bundle.getString("name"); // name = "skyone"
int age = bundle.getInt("age"); // name = 19
返回数据
从子Activity中返回数据,可以在子Activity中声明一个 Intent
,并传给 setResult(int resultCode, Intent intent)
。
例如,在 ReturnMessage
中返回数据到 MainActivity
。在 ReturnMessage.java
中:
Intent intent = new Intent(this, MainActivity.class);
intent.putExtra("message", "Hello world!");
setResult(52021, intent);
finish();
在 MainActivity
中调用 ReturnMessage
startActivityForResult(new Intent(this, ReturnMessage.class), 2021); // 2021 是RequestCode
在 MainActivity
中接收数据通过重写 onActivityResult(int requestCode, int resultCode, Intent data)
实现,而 requestCode
和 resultCode
则用于判断是谁返回的数据
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 2021 && resultCode == 52021) {
Toast.makeText(this,
"接收到消息:" + data.getStringExtra("message"),
Toast.LENGTH_LONG).show();
}
}
使用 Bundle
还可以使用 Bundle
来在两个 Activity 之间传递数据。
在第一个 Activity 中,使用 Bundle
传递数据:
Intent intent = new Intent(this, SecondActivity.class);
Bundle bundle = new Bundle();
bundle.putString("name", "John");
bundle.putInt("age", 25);
intent.putExtra("user", bundle);
startActivity(intent);