Android編程實(shí)現(xiàn)全局獲取Context及使用Intent傳遞對(duì)象的方法詳解
本文實(shí)例講述了Android編程實(shí)現(xiàn)全局獲取Context及使用Intent傳遞對(duì)象的方法。分享給大家供大家參考,具體如下:
一、全局獲取 Context
Android 開發(fā)中很多地方需要用到 Context,比如彈出 Toast、啟動(dòng)活動(dòng)、發(fā)送廣播、操作數(shù)據(jù)庫(kù)……
由于很多操作都是在活動(dòng)中進(jìn)行的,而活動(dòng)本身就是一個(gè) Context 對(duì)象,所以獲取 Context 并不是那么困難。
但是,當(dāng)應(yīng)用程序的架構(gòu)逐漸開始復(fù)雜起來的時(shí)候,很多的邏輯代碼都將脫離 Activity 類,由此在某些情況下,獲取 Context 并非那么容易。
Android 提供了一個(gè) Application 類,每當(dāng)應(yīng)用程序啟動(dòng)的時(shí)候,系統(tǒng)就會(huì)自動(dòng)將這個(gè)類進(jìn)行初始化。而我們可以定制一個(gè)自己的 Application 類,以便管理程序內(nèi)一些全局的狀態(tài)信息,比如說全局 Context。
public class MyApplication extends Application {
private static Context context;
@Override
public void onCreate() {
super.onCreate();
context =getApplicationContext();
}
public static Context getContext() {
return context;
}
}
這里我們重寫了父類的 onCreate()方法,并通過調(diào)用 getApplicationContext()方法得到了一個(gè)應(yīng)用程序級(jí)別的 Context,然后又提供了一個(gè)靜態(tài)的 getContext()方法,在這里將剛才獲取到的 Context 進(jìn)行返回。
接下來需要告知系統(tǒng),當(dāng)程序啟動(dòng)的時(shí)候應(yīng)該初始化 MyApplication 類,在 AndroidManifest 文件的<application>標(biāo)簽下進(jìn)行指定就可以了。
<application android:name="MyApplication"> ... </application>
這樣就已經(jīng)實(shí)現(xiàn)了一種全局獲取 Context 的機(jī)制,之后不管你想在項(xiàng)目的任何地方使用 Context,只需要調(diào)用一下 MyApplication.getContext()就可以了。
二、使用Intent傳遞對(duì)象
使用 Intent 來傳遞對(duì)象通常有兩種實(shí)現(xiàn)方式,Serializable 和 Parcelable。
Serializable方式:
Serializable 是序列化的意思,表示將一個(gè)對(duì)象轉(zhuǎn)換成可存儲(chǔ)或可傳輸?shù)臓顟B(tài)。序列化后的對(duì)象可以在網(wǎng)絡(luò)上進(jìn)行傳輸,也可存儲(chǔ)到本地。至于序列化的方法也很簡(jiǎn)單,只需要讓一個(gè)類去實(shí)現(xiàn) Serizable 這個(gè)接口就可以了。
public class Festival implements Serializable {
private String name;
private String data;
public Festival(String name,String data){
this.name = name;
this.data = data;
}
public String getName() {
return name;
}
public String getData() {
return data;
}
}
這里讓 Festival 類實(shí)現(xiàn)了 Serializable 接口,這樣所有的 Festival 對(duì)象就都是可以序列化的了。
Festival festival = new Festival("元旦節(jié)","1月1日");
Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
intent.putExtra("festival_object",festival);
startActivity(intent);
這里我們創(chuàng)建了一個(gè) Festival 的實(shí)例,然后就直接將它傳入到 putExtra()方法中,通過 startActivity()傳遞這個(gè)對(duì)象。
這里調(diào)用了 getSerializableExtra()方法來獲取傳遞過來的序列化對(duì)象,接著再將它向下轉(zhuǎn)型成 Festival 對(duì)象,這樣就成功實(shí)現(xiàn)了使用 Intent 傳遞對(duì)象的功能了。
Parcelable方式:
Parcelable 方式的實(shí)現(xiàn)原理是將一個(gè)完整的對(duì)象進(jìn)行分解,而分解后的每一部分都是 Intent 所支持的數(shù)據(jù)類型,這樣也就實(shí)現(xiàn)傳遞對(duì)象的功能了。
public class Person implements Parcelable {
private String name;
private int age;
//省略set和get方法
protected Person(Parcel in) {
name = in.readString();//讀取name
age = in.readInt();//讀取age
}
public static final Creator<Person> CREATOR = new Creator<Person>() {
@Override
public Person createFromParcel(Parcel in) {
return new Person(in);
}
@Override
public Person[] newArray(int size) {
return new Person[size];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);//寫出name
dest.writeInt(age);//寫入age
}
}
首先讓 Person 類實(shí)現(xiàn) Parcelable 接口,這樣就必須重寫 describeContents()和 writeToParcel()這兩個(gè)方法。其中describeContents()方法直接返回 0 就可以了,而 writeToParcel()方法中需要調(diào)用 Parcel 的 writeXxx()方法將 Person 類中的字段一一寫出。
除此之外,還必須在 Person 類中提供一個(gè)名為 CREATOR 的常量,這里創(chuàng)建了 Parcelable.Creator 接口的一個(gè)實(shí)現(xiàn),并將泛型指定為 Person。
接著需要重寫 createFromParcel()和 newArray()這兩個(gè)方法,在 createFromParcel()方法中去讀取剛才寫出的 name 和 age 字段,并創(chuàng)建一個(gè) Person 對(duì)象進(jìn)行返回,其中 name和age都是調(diào)用 Parcel 的 readXxx()方法讀取到的,注意這里的讀取順序一定要和寫出順序完全相同。而newArray()方法中只需要new出一個(gè)Person數(shù)組,并使用方法中傳入的 size 作為數(shù)組大小就可以了。
依然可以使用相同的代碼來傳遞 Person 對(duì)象,只不過獲取對(duì)象時(shí)調(diào)用的是 getParcelableExtra() 方法,其他地方完全相同。
在傳遞對(duì)象時(shí),Serializable 和 Parcelable 方法都是可行的,對(duì)比一下,Serializable 的方式較為簡(jiǎn)單,但由于會(huì)把整個(gè)對(duì)象進(jìn)行序列化,因此效率方面會(huì)比 Parcelable方式低一些,根據(jù)情況需要合理運(yùn)用這兩種方式。
更多關(guān)于Android相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Android開發(fā)入門與進(jìn)階教程》、《Android調(diào)試技巧與常見問題解決方法匯總》、《Android基本組件用法總結(jié)》、《Android視圖View技巧總結(jié)》、《Android布局layout技巧總結(jié)》及《Android控件用法總結(jié)》
希望本文所述對(duì)大家Android程序設(shè)計(jì)有所幫助。
- Android List(集合)中的對(duì)象以某一個(gè)字段排序案例
- Android使用FontMetrics對(duì)象計(jì)算位置坐標(biāo)
- Android使用Canvas對(duì)象實(shí)現(xiàn)刮刮樂效果
- Android中將Bitmap對(duì)象以PNG格式保存在內(nèi)部存儲(chǔ)中的方法
- Android中利用C++處理Bitmap對(duì)象的實(shí)現(xiàn)方法
- Android中實(shí)現(xiàn)長(zhǎng)按修改ListView對(duì)象的內(nèi)容
- Android中傳遞對(duì)象的三種方法的實(shí)現(xiàn)
- Android中深入學(xué)習(xí)對(duì)象的四種引用類型
相關(guān)文章
unity5.6 導(dǎo)出gradle工程 Android Studio 導(dǎo)入問題及處理方法
這篇文章主要介紹了unity5.6 導(dǎo)出gradle工程 Android Studio 導(dǎo)入問題及處理方法,需要的朋友可以參考下2017-12-12
Android自定義View實(shí)現(xiàn)閃耀字體效果
這篇文章主要為大家詳細(xì)介紹了Android自定義View實(shí)現(xiàn)閃耀字體效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-01-01
Flutter StreamBuilder組件實(shí)現(xiàn)局部刷新示例講解
日常使用最多的局部刷新為Provider狀態(tài)管理 Selector,今天分享flutter框架自帶的StreamBuilder組件,該組件可做到局部刷新,使用簡(jiǎn)單且輕便2022-11-11
Android控件AppWidgetProvider使用方法詳解
這篇文章主要為大家詳細(xì)介紹了Android控件AppWidgetProvider的使用方法詳解,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08
Android設(shè)備藍(lán)牙連接掃描槍獲取掃描內(nèi)容
這篇文章主要為大家詳細(xì)介紹了Android設(shè)備藍(lán)牙連接掃描槍獲取掃描內(nèi)容,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09
Android?JetPack組件的支持庫(kù)Databinding詳解
DataBinding是Google發(fā)布的一個(gè)數(shù)據(jù)綁定框架,它能夠讓開發(fā)者減少重復(fù)性非常高的代碼,如findViewById這樣的操作。其核心優(yōu)勢(shì)是解決了數(shù)據(jù)分解映射到各個(gè)view的問題,在MVVM框架中,實(shí)現(xiàn)的View和Viewmode的雙向數(shù)據(jù)綁定2022-08-08

