一、全局获取Context的技巧
Android提供了一个Application类,每当应用程序启动的时候,系统就会自动将这个类进行初始化。而我们可以定制一个自己的Application 类,以便于管理程序内一些全局的状态信息,比如说全局Context 。
定制一个自己的Application其实并不复杂,首先我们需要创建一个MyApplication类继承自Application ,代码如下所示:
public class MyApplication extends Application {
private static Context context;
@Override
public void onCreate() {
context = getApplicationContext();
//通过调用getApplicationContext()方法得到一个应用程序级别的Context
}
public static Context getContext() {
return context;
//将获取到的Context返回
}
}
在AndroidManifest.xml文件的标签下进行指定就可以了,代码如下所示:
<application
android:name="com.example.networktest.MyApplication"
...>
...
</application>
※这里在指定MyApplication的时候一定要加上完整的包名,不然系统将无法找到这个类。
这样我们就已经实现了一种全局获取Context的机制,之后不管你想在项目的任何地方使用Context ,只需要调用一下MyApplication.getContext() 就可以了。
二、使用Intent传递对象
2.1Serializable方式
Serializable是序列化的意思,表示将一个对象转换成可存储或可传输的状态。序列化后的对象可以在网络上进行传输,也可以存储到本地。
至于序列化的方法也很简单,只需要让一个类去实现Serializable这个接口就可以了。比如说有一个Person 类,其中包含了name 和age 这两个字段,想要将它序列化就可以这样写:
public class Person implements Serializable{
private String name;
private int age;
public void setName(String name){
this.name=name;
}
public int getAge(){
return age;
}
public void setAge(int age){
this.age=age;
}
}
get 、set 方法都是用于读取和赋值字段数据的,最重要的部分是在第一行。这里让Person 类去实现了Serializable 接口,这样所有的Person对象就都是可序列化的了。
接下来在FirstActivity 中的写法非常简单:
Person person = new Person();
person.setName("Tom");
person.setAge(20);
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
intent.putExtra("person_data", person);//传递值
startActivity(intent);
接下来在SecondActivity 中获取这个对象也很简单,写法如下:
Person person = (Person) getIntent().getSerializableExtra("person_data");
调用了getSerializableExtra() 方法来获取通过参数传递过来的序列化对象,接着再将它向下转型成Person对象,这样我们就成功实现了使用Intent来传递对象的功能了。
2.2Parcelable方式
Parcelable方式的实现原理是将一个完整的对象进行分解,而分解后的每一部分都是Intent所支持的数据类型,这样就实现了传递对象的功能。
修改Person 中的代码,如下所示:
public class Person implements Parcelable {
private String name;
private int age;
...
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name); // 写出name
dest.writeInt(age); // 写出age
}
public static final Parcelable.Creator<Person> CREATOR = new Parcelable.
Creator<Person>() {
@Override
public Person createFromParcel(Parcel source) {
Person person = new Person();
person.name = source.readString(); // 读取name
person.age = source.readInt(); // 读取age
return person;
}
@Override
public Person[] newArray(int size) {
return new Person[size];
}
};
①首先我们让Person 类去实现了 Parcelable 接口,这样就必须重写describeContents() 和writeToParcel() 这两个方 法。其中describeContents() 方法直接返回0就可以了,而writeToParcel() 方法中我们需要调用Parcel的writeXxx() 方法,将Person 类中的字段一一写出。
②我们还必须在Person 类中提供一个名为CREATOR 的常量,这里创建了 Parcelable.Creator 接口的一个实现,并将泛型指定为Person 。
③接着需要重写 createFromParcel() 和newArray() 这两个方法,在createFromParcel() 方法中我们要去读取刚才写出的name 和age 字段,并创建一个Person 对象进行返回,其中name 和age 都是调用Parcel 的readXxx() 方法读取到的,注意这里读取的顺序一定要和刚才写出的顺序完全相同。而newArray() 方法中的实现就简单多了,只需要new出一个Person 数组,并使用方法中传入的size作为数组大小就可以了。
在SecondActivity 中获取对象的时候需要稍加改动,如下所示:
Person person = (Person) getIntent().getParcelableExtra("person_data");
※Parcelable的方式比Serializable的方式效率高