使用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

并且实现其

  1. writeToParcel
  2. describeContents
  3. 实例化静态内部对象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实例变量进行值的存取。