1:全局获取Context。
Android中有一个Application类,程序启动时它会初始化。我们通过定制自己的Application来管理一些全局的状态信息,如Context。
public class MyApplication extends Application{
//全局获取Context
private static Context context;
@Override
public void onCreate() {
// TODO Auto-generated method stub
context=getApplicationContext();
}
public static Context getContext(){
return context;
}
}
getApplicationContext()获得程序级别的context;
getContext()返回context值。
不过需要告知系统初始化MyApplication而不是默认的Application,在Manifest中修改<application>:
<application android:name="com.包名.MyApplication">
2:Intent传递对象
1)putExtra()
有时候我们需要在Intent中添加一些附加数据以达到传值效果。
比如添加如下代码从FirstActivity到SecondActicity:
在FirstActivity中
Intent intent=new Intent(FirstActivity.this,SecondActivity.class);
intent.putExtra("string_data","hello");
intent.putExtra("int_data",100);
startActivity(intent);
而在SecondActivity中接收的话:
getIntent().getStringExtra("string_data");
getIntent().getIntExtra("int_data",0);
putExtra()支持的数据类型有限,有时我们要传递一些自定义对象。这时候就要用到传递对象的技巧。
Serializable,序列化,原理是将一个对象转换成可存储或可运输的状态,序列化后的对象就可以在网络上进行传输。
将对象所在的类实现Serializable接口就相当于序列化了对象,然后就直接putExtra("标记",对象),接收时则用getSerializableExtra();
Parcelable的原理是将一个对象分解成Intent支持的数据类型,同样需要实现Parcelable接口,然后重写describeContents()和writeToParcel()方法,前者return 0就行,后者需要writeString(),writeInt()之类将Person类中的字段一一写出。除此之外还要提供一个CREATOR常量,重写两个方法。其中readString()之类方法必须与之前write时顺序一致。
实例:
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);
dest.writeInt(age);
}
public static final Parcelable.Creater<Person> CREATOR=new Parcelable.Creater<Person>(){
@Override
public Person createFromParcel(Parcel source){
person.name=source.readString();
person.age=source.readInt();
return person;
}
@Override
public Person[] newArray(int size){
return new Person[size];
}
};
//接收使用如下方法
Person person=(Person)getIntent().getParcelableExtra("标记");