Activity之间的数据传递的4种方式
1 使用Intent传递
Intent含义
An intent is an abstract description of an operation to be performed.
官方给出的解释:意图是即将执行某种操作的一个抽象描述。意图可以开启一个活动、一个服务或者把意图发送给一个广播接收器。
Activity之间或 Activity 和 Service 之间普遍存在关联,所以他们之间就要进行数据的传递,Intent就是负责传递数据。
Intent传递数据
intent.putExtra(key,value)
这是 intent 传递数据的方法,key代表是一个标志符,在目标Activity中可以通过getIntent.getExtra(key) 获得value,而value不但可以是基本数据类型,还可以是一个对象的引用,但这个对象对应的类必须实现序列化接口(即Serializable或Parcelable)。
Serializable和Pacelable接口的区别简单来讲:
Serializable 基于反射,运行时占用内存大;
Pacelable 基于分解,执行效率高;
属于Java自带的Serializable接口实现很简单,只要在类中添加 implement Serializable,如下所示:
public class Book implements Serializable
而实现android特有Parelable接口需要
public class Book implements Pacelable
并且实现它的(1)writeToParcel (2)describeContents (3)实例化静态内部对象CREATOR实现接口Parcelable.Creator 这里就不详细讲了,真正用到就可以自己去查
2 使用全局变量Application
Base class for those who need to maintain global application state.
解释:application 是需要维持全局状态的类的基类
因为application的生命周期是整个应用程序的生命周期,随着应用程序的创建而创建,销毁而销毁,所以可以在activity中把数据存进或取出application中变量的值,这样所有的activity就可以对同一个application进行操作,这里不用担心线程安全的问题。
public class Test extends Appliction {
private String name;
public String getName() {
return this.name; }
public void setName(String name) {
this.name = name; }
}
在源activity中只需要
Test test;
test = (Test)getApplication;
test.setName("张三");
那跳转到目标activity中
Test test;
test = (Test)getApplication;
String name = test.getName;
因为在整个应用程序中就一个Application单例,它的生命周期贯穿整个程序,堆内存中只存在一个对象实例,所以程序内所有它的引用指向的是同一块堆内存,所以可以在不同activity对application实例变量进行值的存取。
3 使用静态变量
使用静态变量传递数据的方式和application有点相似,都是通过存取固定内存对象的值来传递数据,对象中用static定义的静态成员存放在静态域中,可以通过不同引用来访问,只需在目标activity中定义静态成员变量,源activity就可以直接访问,例如
public class TargetActivity {
public static String name;
注意:这里的修饰静态变量的访问修饰符不可以是private,因为是跨类访问
public class SourceActivity {
TargetActivity.name = "张三";
4 剪切板传递数据
Interface to the clipboard service, for placing and retrieving text in the global clipboard.
ClipboardManager:该类是系统剪切板服务的接口,用来放入或取出全局剪切板中的文本。
You do not instantiate this class directly; instead, retrieve it through getSystemService(Class).
不用实例化ClipboardManager,而是通过getSystemService(Class)获取到实例,下面通过一个例子来说明一下:
//获得剪切板单例
ClipboardManager clipboardManager = (ClipboardManager)getSystemService(Context.CLIPBOARD_SERVICE);
//添加数据到剪切板
clipboardManager.setPrimaryClip(ClipData.newPlainText(null,"内容"));
//检查剪切板是否有数据,并取出数据
if(clipboardManager.hasPrimaryClip()){
clipboardManager.getPrimaryClip().getItemAt(0).getText();
}
ps:因为鄙人知识有限,如果以上说法有错或不全,有问题欢迎指出或补全
参考:01《老罗Android开发视频教程》
02 https://greenrobot.me/devpost/android-parcelable-serializable/