安卓高階技巧(一)
- 全域性獲取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類。即是在AndroidManifest.xml檔案的<application>標籤下進行指定就可以了,程式碼如下所示
…
<application
android:name=”com.example.XXX.MyApplication”
…>
…
解決與LitePal衝突的問題:
在MyApplication類的onCreate()中新增語句:LitePal.initialize(context);
- 使用Intent傳遞物件
- Serializable
Serializable是序列化的意思,表示將一個物件轉換成可儲存或可傳輸的狀態。序列化後的物件可以在網路上進行傳輸,也可以儲存本地。至於序列化的方法,只要讓一個類去實現Serializable這個介面就行了。
示例如下:
public class Person implements Serializable{ private String name; public String getName(){ return name; } Public void setName(String name){ this.name=name; } }
然後利用Intent傳遞它。
Intent intent=new Intent(MainActivity.this,SecondActivity.class);
Intent.putExtra(“person_data”,person);
startActivity(intent);
獲取方法:
Person person=(Person) getIntent().getSerializableExtra(“person_data”);
-
- Parcelable
Public class Person implements Parceblable{
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 Parcel.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];
}
};
}
從上面的例子裡可以看出Parcelable的具體用法。
傳遞程式碼與Serializable相同。
獲取程式碼修改一下:
Person person =(Person) getIntent().getParcelableExtra(“person_data”);
一般建議使用第二種方法效率較高。