Context
Android 提供了一个 Application 类,每当应用程序启动的时候,系统就会自动将这个类进行初始化。而我们可以定制一个自己的 Application 类,以便于管理程序内一些全局的状态信息,比如说全局 Context。
示例代码:
public class MyApplication extends Application {
private static Context context;
@Override
public void onCreate() {
context = getApplicationContext();
}
public static Context getContext() {
return context;
}
}
说明:在该类中重写父类的onCreate(),并通过调用getApplicationContext()方法得到应用程序级别的Context,然后提供静态getContext()方法获取刚才的Context。
接下来需要告诉系统在程序启动时初始化MyApplication类,而不是默认的Application。
修改配置文件即可:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.networktest"
android:versionCode="1"
android:versionName="1.0" >
……
<application
android:name="com.example.networktest.MyApplication"
…… >
……
</application>
</manifest>
说明:指定MyApplication时需要加上完成包名。
此时已经实现了全局获取Context机制。在项目的任何地方只需要调用MyApplication.getContext()即可。
使用Intent传递对象
前面学习intent传递数据,都是putExtra方法,但实际上,该方法支持的数据类型是有限的。因此学习intent传递对象的方式,主要有两种Serializable 和 Parcelable。
Serializable
Serializable是序列化含义,将对象转换成可存储或可传输状态,只需要让该类实现Serializable即可序列化。
示例类:
public class Person implements Serializable{
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
在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");
Parcelable 方式
Parcelable 方式的实现原理是将一个完整的对象进行分解,而分解后的每一部分都是 Intent 所支持的数据类型,这样也就实现传递对象的功能了。
类示例代码:
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接口,并重写describleContents()和writeToParcel()方法。describleContents()返回0即可,writeToParcel()需要调用Parcel的wirte方法将Person类中字段一一写出。另外,还必须在Person类中提供一个名为CREATOR的常量,重写createFromParcel()和newArray()这两个方法,并将泛型指定为Person。在createFromParcel()方法中要读取刚才写出的字段,并创建一个Person对象返回,注意读取顺序必须相同。newArray()方法需要new出一个Person数字,并传入size作为数组大小即可。
FirstActivity中传入对象同上,SecondActivity获取对象示例:
Person person = (Person) getIntent().getParcelableExtra("person_data");