您好,登錄后才能下訂單哦!
這篇文章主要介紹Android編程如何實現(xiàn)全局獲取Context及使用Intent傳遞對象,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
一、全局獲取 Context
Android 開發(fā)中很多地方需要用到 Context,比如彈出 Toast、啟動活動、發(fā)送廣播、操作數(shù)據(jù)庫……
由于很多操作都是在活動中進行的,而活動本身就是一個 Context 對象,所以獲取 Context 并不是那么困難。
但是,當應用程序的架構逐漸開始復雜起來的時候,很多的邏輯代碼都將脫離 Activity 類,由此在某些情況下,獲取 Context 并非那么容易。
Android 提供了一個 Application 類,每當應用程序啟動的時候,系統(tǒng)就會自動將這個類進行初始化。而我們可以定制一個自己的 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()
方法得到了一個應用程序級別的 Context,然后又提供了一個靜態(tài)的 getContext()
方法,在這里將剛才獲取到的 Context 進行返回。
接下來需要告知系統(tǒng),當程序啟動的時候應該初始化 MyApplication 類,在 AndroidManifest 文件的<application>標簽下進行指定就可以了。
<application android:name="MyApplication"> ... </application>
這樣就已經(jīng)實現(xiàn)了一種全局獲取 Context 的機制,之后不管你想在項目的任何地方使用 Context,只需要調(diào)用一下 MyApplication.getContext()
就可以了。
復制代碼 代碼如下:
Toast.makeText(MyApplication.getContext(),"全局Context獲取成功",Toast.LENGTH_SHORT).show();
二、使用Intent傳遞對象
使用 Intent 來傳遞對象通常有兩種實現(xiàn)方式,Serializable 和 Parcelable。
Serializable方式:
Serializable 是序列化的意思,表示將一個對象轉(zhuǎn)換成可存儲或可傳輸?shù)臓顟B(tài)。序列化后的對象可以在網(wǎng)絡上進行傳輸,也可存儲到本地。至于序列化的方法也很簡單,只需要讓一個類去實現(xiàn) Serizable 這個接口就可以了。
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 類實現(xiàn)了 Serializable 接口,這樣所有的 Festival 對象就都是可以序列化的了。
Festival festival = new Festival("元旦節(jié)","1月1日"); Intent intent = new Intent(FirstActivity.this,SecondActivity.class); intent.putExtra("festival_object",festival); startActivity(intent);
這里我們創(chuàng)建了一個 Festival 的實例,然后就直接將它傳入到 putExtra()方法中,通過 startActivity()傳遞這個對象。
復制代碼 代碼如下:
Festival festival = (Festival)getIntent().getSerializableExtra("festival_object");
這里調(diào)用了 getSerializableExtra()
方法來獲取傳遞過來的序列化對象,接著再將它向下轉(zhuǎn)型成 Festival 對象,這樣就成功實現(xiàn)了使用 Intent 傳遞對象的功能了。
Parcelable方式:
Parcelable 方式的實現(xiàn)原理是將一個完整的對象進行分解,而分解后的每一部分都是 Intent 所支持的數(shù)據(jù)類型,這樣也就實現(xiàn)傳遞對象的功能了。
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 類實現(xiàn) Parcelable 接口,這樣就必須重寫 describeContents()
和 writeToParcel()
這兩個方法。其中describeContents()方法直接返回 0 就可以了,而 writeToParcel()方法中需要調(diào)用 Parcel 的 writeXxx()
方法將 Person 類中的字段一一寫出。
除此之外,還必須在 Person 類中提供一個名為 CREATOR 的常量,這里創(chuàng)建了 Parcelable.Creator
接口的一個實現(xiàn),并將泛型指定為 Person。
接著需要重寫 createFromParcel()
和 newArray()
這兩個方法,在 createFromParcel()方法中去讀取剛才寫出的 name 和 age 字段,并創(chuàng)建一個 Person 對象進行返回,其中 name和age都是調(diào)用 Parcel 的 readXxx()方法讀取到的,注意這里的讀取順序一定要和寫出順序完全相同。而newArray()方法中只需要new出一個Person數(shù)組,并使用方法中傳入的 size 作為數(shù)組大小就可以了。
Person person = (Person)getIntent().getParcelableExtra("person_object");
依然可以使用相同的代碼來傳遞 Person 對象,只不過獲取對象時調(diào)用的是 getParcelableExtra()
方法,其他地方完全相同。
在傳遞對象時,Serializable 和 Parcelable 方法都是可行的,對比一下,Serializable 的方式較為簡單,但由于會把整個對象進行序列化,因此效率方面會比 Parcelable方式低一些,根據(jù)情況需要合理運用這兩種方式。
Android是一種基于Linux內(nèi)核的自由及開放源代碼的操作系統(tǒng),主要使用于移動設備,如智能手機和平板電腦,由美國Google公司和開放手機聯(lián)盟領導及開發(fā)。
以上是“Android編程如何實現(xiàn)全局獲取Context及使用Intent傳遞對象”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關知識,歡迎關注億速云行業(yè)資訊頻道!
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。