使用Intent
An intent is an abstract description of an operation to be performed.
解释:意图是即将执行某种操作的一个抽象描述。意图可以开启一个活动、一个服务或者把意图发送给一个广播接收器。
Activity之间或 Activity 和 Service 之间普遍存在关联,就要进行数据的传递,Intent就是负责传递数据。
如何使用Intent传递数据呢?
/存
intent.putExtra(key,value);
//取
intent.getExtra(key);
这是 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
并且实现其
- writeToParcel
- describeContents
- 实例化静态内部对象CREATOR,实现接口Parcelable.Creator
使用静态变量
使用静态变量传递数据的方式和application有点相似,都是通过存取固定内存对象的值来传递数据,对象中用static定义的静态成员存放在静态域中,可以通过不同引用来访问,只需在目标activity中定义静态成员变量,源activity就可以直接访问,例如
public class DstActivity {
public static String name;
}
注意:这里的修饰静态变量的访问修饰符不可以是private,因为是跨类访问
public class SrcActivity {
DstActivity.name = "张三";
}
使用剪切板
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();
}
使用全局变量
Base class for those who need to maintain global application state.
解释:application 是需要维持全局状态的类的基类
因为application的生命周期是整个应用程序的生命周期,随着应用程序的创建而创建,销毁而销毁,所以可以在activity中把数据存进或取出application中变量的值,这样所有的activity就可以对同一个application进行操作,这里不用担心线程安全的问题。
public class MyApp extends Appliction {
private String name;
public String getName(){
return this.name;
}
public void setName(String name){
this.name = name;
}
}
在源activity中只需要
MyApp myapp;
myapp = (MyApp)getApplication;
myApp.setName("tony李");
那跳转到目标activity中
MyApp myapp;
myapp = (MyApp)getApplication;
String name = myapp.getName();
以程序内所有它的引用指向的是同一块堆内存,所以可以在不同activity对application实例变量进行值的存取。