Android 全局獲取 Context 與使用 Intent 傳遞對象


=====================全局獲取 Context========================

Android 開發中很多地方需要用到 Context,比如彈出 Toast、啟動活動、發送廣播、操作數據庫……

由於很多操作都是在活動中進行的,而活動本身就是一個 Context 對象,所以獲取 Context 並不是那么困難。

但是,當應用程序的架構逐漸開始復雜起來的時候,很多的邏輯代碼都將脫離 Activity 類,由此在某些情況下,獲取 Context 並非那么容易。

Android 提供了一個 Application 類,每當應用程序啟動的時候,系統就會自動將這個類進行初始化。而我們可以定制一個自己的 Application 類,以便管理程序內一些全局的狀態信息,比如說全局 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( )方法,並通過調用 getApplicationContext( )方法得到了一個應用程序級別的 Context,然后又提供了一個靜態的 getContext( )方法,在這里將剛才獲取到的 Context 進行返回。

接下來需要告知系統,當程序啟動的時候應該初始化 MyApplication 類,在 AndroidManifest 文件的<application>標簽下進行指定就可以了。

<application android:name="MyApplication">  ...  </application>

這樣就已經實現了一種全局獲取 Context 的機制,之后不管你想在項目的任何地方使用 Context,只需要調用一下 MyApplication.getContext( )就可以了。

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

=====================使用Intent傳遞對象=======================

使用 Intent 來傳遞對象通常有兩種實現方式,Serializable 和 Parcelable。

Serializable方式:

  Serializable 是序列化的意思,表示將一個對象轉換成可存儲或可傳輸的狀態。序列化后的對象可以在網絡上進行傳輸,也可存儲到本地。至於序列化的方法也很簡單,只需要讓一個類去實現 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 類實現了 Serializable 接口,這樣所有的 Festival 對象就都是可以序列化的了。

        Festival festival = new Festival("元旦節","1月1日");
        Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
        intent.putExtra("festival_object",festival);
        startActivity(intent);

這里我們創建了一個 Festival 的實例,然后就直接將它傳入到 putExtra( )方法中,通過 startActivity( )傳遞這個對象。

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

這里調用了 getSerializableExtra( )方法來獲取傳遞過來的序列化對象,接着再將它向下轉型成 Festival 對象,這樣就成功實現了使用 Intent 傳遞對象的功能了。

Parcelable方式:

  Parcelable 方式的實現原理是將一個完整的對象進行分解,而分解后的每一部分都是 Intent 所支持的數據類型,這樣也就實現傳遞對象的功能了。

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 類實現 Parcelable 接口,這樣就必須重寫 describeContents( )和 writeToParcel( )這兩個方法。其中describeContents( )方法直接返回 0 就可以了,而 writeToParcel( )方法中需要調用 Parcel 的 writeXxx( )方法將 Person 類中的字段一一寫出。

除此之外,還必須在 Person 類中提供一個名為 CREATOR 的常量,這里創建了 Parcelable.Creator 接口的一個實現,並將泛型指定為 Person。

接着需要重寫 createFromParcel( )和 newArray( )這兩個方法,在 createFromParcel( )方法中去讀取剛才寫出的 name 和 age 字段,並創建一個 Person 對象進行返回,其中 name和age都是調用 Parcel 的 readXxx( )方法讀取到的,注意這里的讀取順序一定要和寫出順序完全相同。而newArray()方法中只需要new出一個Person數組,並使用方法中傳入的 size 作為數組大小就可以了。

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

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

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM