Android編程如何實(shí)現(xiàn)全局獲取Context及使用Intent傳遞對象

這篇文章主要介紹Android編程如何實(shí)現(xiàn)全局獲取Context及使用Intent傳遞對象,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!

我們提供的服務(wù)有:做網(wǎng)站、成都做網(wǎng)站、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、江岸ssl等。為上千余家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的江岸網(wǎng)站制作公司

一、全局獲取 Context

Android 開發(fā)中很多地方需要用到 Context,比如彈出 Toast、啟動(dòng)活動(dòng)、發(fā)送廣播、操作數(shù)據(jù)庫……

由于很多操作都是在活動(dòng)中進(jìn)行的,而活動(dòng)本身就是一個(gè) Context 對象,所以獲取 Context 并不是那么困難。

但是,當(dāng)應(yīng)用程序的架構(gòu)逐漸開始復(fù)雜起來的時(shí)候,很多的邏輯代碼都將脫離 Activity 類,由此在某些情況下,獲取 Context 并非那么容易。

Android 提供了一個(gè) Application 類,每當(dāng)應(yīng)用程序啟動(dòng)的時(shí)候,系統(tǒng)就會自動(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)用程序級別的 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()就可以了。

復(fù)制代碼 代碼如下:

Toast.makeText(MyApplication.getContext(),"全局Context獲取成功",Toast.LENGTH_SHORT).show();

二、使用Intent傳遞對象

使用 Intent 來傳遞對象通常有兩種實(shí)現(xiàn)方式,Serializable 和 Parcelable。

Serializable方式:

Serializable 是序列化的意思,表示將一個(gè)對象轉(zhuǎn)換成可存儲或可傳輸?shù)臓顟B(tài)。序列化后的對象可以在網(wǎng)絡(luò)上進(jì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 對象就都是可以序列化的了。

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è)對象。

復(fù)制代碼 代碼如下:

Festival festival = (Festival)getIntent().getSerializableExtra("festival_object");

這里調(diào)用了 getSerializableExtra()方法來獲取傳遞過來的序列化對象,接著再將它向下轉(zhuǎn)型成 Festival 對象,這樣就成功實(shí)現(xiàn)了使用 Intent 傳遞對象的功能了。

Parcelable方式:

Parcelable 方式的實(shí)現(xiàn)原理是將一個(gè)完整的對象進(jìn)行分解,而分解后的每一部分都是 Intent 所支持的數(shù)據(jù)類型,這樣也就實(shí)現(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 類實(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 對象進(jìn)行返回,其中 name和age都是調(diào)用 Parcel 的 readXxx()方法讀取到的,注意這里的讀取順序一定要和寫出順序完全相同。而newArray()方法中只需要new出一個(gè)Person數(shù)組,并使用方法中傳入的 size 作為數(shù)組大小就可以了。

Person person = (Person)getIntent().getParcelableExtra("person_object");

依然可以使用相同的代碼來傳遞 Person 對象,只不過獲取對象時(shí)調(diào)用的是 getParcelableExtra() 方法,其他地方完全相同。

在傳遞對象時(shí),Serializable 和 Parcelable 方法都是可行的,對比一下,Serializable 的方式較為簡單,但由于會把整個(gè)對象進(jìn)行序列化,因此效率方面會比 Parcelable方式低一些,根據(jù)情況需要合理運(yùn)用這兩種方式。

Android是什么

Android是一種基于Linux內(nèi)核的自由及開放源代碼的操作系統(tǒng),主要使用于移動(dòng)設(shè)備,如智能手機(jī)和平板電腦,由美國Google公司和開放手機(jī)聯(lián)盟領(lǐng)導(dǎo)及開發(fā)。

以上是“Android編程如何實(shí)現(xiàn)全局獲取Context及使用Intent傳遞對象”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

網(wǎng)頁題目:Android編程如何實(shí)現(xiàn)全局獲取Context及使用Intent傳遞對象
本文網(wǎng)址:http://bm7419.com/article12/pcsggc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供靜態(tài)網(wǎng)站、微信公眾號、網(wǎng)站策劃定制開發(fā)、網(wǎng)站建設(shè)、App開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

小程序開發(fā)