1. 程式人生 > >Android基礎之Activity系列

Android基礎之Activity系列

學習android已有時日,但是舊時的知識都好似遺忘了,所以想通過寫技術部落格來溫習知識。孔子曰:“溫故而知新,可以為師矣”。鄙人第一次寫部落格,文筆也不是很好,如若有表述不清,技術點有錯誤之處,還望各路大神們指點迷津,小弟在此謝過!

寄望:1.寫部落格當然希望有人看啦~\(≧▽≦)/~啦啦啦,不過沒人看也不打緊啦,我也會堅持每天溫習和更新自己所學的知識點,我想往實際操作細節方面寫,因為當初我學習的時候,很多小小的細節就把我卡住了,浪費好多時間,希望正走在路上的朋友們都能少走點彎路,共同進步。

2.第二個希望通過寫部落格增強自己的文字表述能力,最好能形成自己的知識體系那就更好啦!O(∩_∩)O哈哈~

3.希望自己能夠養成堅持不懈努力的習慣,從堅持寫部落格到生活的方方面面都能夠養成良好的習慣。既然內心已經做出了最重要的選擇,那就付出所有激情和熱血去開創自己的路吧!

Activity間的資料傳遞

Intent:(資料傳遞的靈魂

Android的應用程式包含三種重要元件:Activity、Service、BroadcastReceiver,應用程式採用一致的方式來啟動他們——都是依靠Intent來啟動的,Intent封裝了程式想要啟動的程式的意圖。

Intent意圖:分隱式意圖和顯示意圖,具體詳細知識可以檢視視訊:

我給出一個基礎的視訊連結,極客學院的,個人覺得講得很詳細,不過需要註冊登入成為會員才能觀看:

http://www.jikexueyuan.com/course/681.html

Intent啟動Activity的兩種方式:startActivity(Intent intent)和 startActivityForResult(Intent intent,int requestCode)

1.使用Intent攜帶資料

建立兩個Activity, FirstActivity和SecondActivity,從FirstActivity中傳遞資料到SecondActivty中,如下:

在FirstActivity中書寫程式碼傳遞資料出去:

<span style="font-size:14px;">String data = "Hello SecondActivity";
Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
intent.putExtra("key",data);//key是取資料時需要用到的鍵,相當於一把鑰匙
startActivity(intent);//啟動下一個Activity</span>

在SecondActivity中接收資料:

<span style="font-size:14px;">Intent intent = getIntent();//記住接收資料時是使用 getIntent()方法獲得intent物件
String data = intent.getStringExtra("key");//通過key取值(即傳遞資料時候用到的鍵,相應的,取值時,要傳入對應的key)
Log.i("SecondActivity",data);//通過日誌打印出獲取到的資料</span>

2.使用Bundle包裝資料

建立Bundle物件,然後把需要傳遞的資料都儲存在Bundle物件中,然後再將Bundle物件存放在Intent裡。到了指定Activity後,先從Intent取出Bundle,再從Bundle中將資料一一取出。

使用bundle 傳遞資料 步驟:

 (1)先建立一個Bundle的物件            Intent intent = new Intent();            Bundle bundle = new Bundle();                    bundle.putString("name", "阿花");                    bundle.putString("sex", "女");                    bundle.putInt("age", 18);   (2)將Bundle物件放在Intent物件中                    intent.putExtra("bundle", bundle);   (3)啟動Activity                    startActivity(intent );

接收資料:

Bundle取值                                                                                                                                                                                                                                 Inten
<span style="font-size:14px;">        Bundle bundle = intent.getBundleExtra("bundle"); //bundle物件中是以一個數組的形式存放資料
        String name = bundle.getString("name");
        String sex = bundle.getString("sex);
        int age = bundle.getInt("age");</span>

3.序列化物件Seriazable

首先建立一個Person類,讓Person類實現Serializable介面。Person類中有name,sex,age三個屬性,實現Person類的 get 、set 方法。(!注意:該物件的類必需實現Serializable介面 把要傳遞到下一個Activity的資料存放在Person類的物件中,啟動Activity把資料傳遞出去    
Intent i = new Intent();</span>
Person p = new Person();
       p.setName("錢多多");//通過set方法把資料存到Person類物件p中
       p.setSex("男");
       p.setAge(22);
       i.putExtra("key", p); //向Intent物件中存入Person物件P
       startActivity(i);
在另一個Activity中取傳遞過來的物件資料:
Intent i = new Intent();</span>
Serializable p = i.getSerializableExtra("key"); //反序列化資料物件
     if (p instanceof Person) { 
            Person person = (Person) p; //獲取到攜帶資料的Person物件p</span>
tv.setText("name:"+ person.getName());//使用資料,把資料展示在TextView上
     }

4.Application傳值(不常用) 建立一個類MyApplication ,該類要繼承與Application。     1.建立一個Application的類 :MyApplication     2.獲得AppLication的物件          MyApplication application = (MyApplication) MainActivity.this.getApplication();     3.給MyApplication物件賦值          application.setData("abc"); 取值:        MyApplication application = (MyApplication) getApplication();         String data = application.getData();

5.Parcelable(最常用,傳遞資料效率更高

(1)實現序列化的方法

Android中實現序列化有兩個選擇:一是實現Serializable介面(是JavaSE本身就支援的),一是實現Parcelable介面(是Android特有功能,效率比實現Serializable介面高效,可用於Intent資料傳遞,也可以用於程序間通訊(IPC))。實現Serializable介面非常簡單,宣告一下就可以了,而實現Parcelable介面稍微複雜一些,但效率更高,推薦用這種方法提高效能。

(2)為什麼要序列化? 1)永久性儲存物件,儲存物件的位元組序列到本地檔案中; 2)通過序列化物件在網路中傳遞物件; 3)通過序列化在程序間傳遞物件。 (3)實現Parcelable步驟 1)implements Parcelable 2)重寫writeToParcel方法,將你的物件序列化為一個Parcel物件,即:將類的資料寫入外部提供的Parcel中,打包需要傳遞的資料到Parcel容器儲存,以便從 Parcel容器獲取資料 3)重寫describeContents方法,內容介面描述,預設返回0就可以 4)例項化靜態內部物件CREATOR實現介面Parcelable.Creator public static final Parcelable.Creator<T> CREATOR 注:其中public static final一個都不能少,內部物件CREATOR的名稱也不能改變,必須全部大寫。需重寫本介面中的兩個方法:createFromParcel(Parcel in) 實現從Parcel容器中讀取傳遞資料值,封裝成Parcelable物件返回邏輯層,newArray(int size) 建立一個型別為T,長度為size的陣列,僅一句話即可(return new T[size]),供外部類反序列化本類陣列使用。 總結:簡而言之:        通過writeToParcel將你的物件對映成Parcel物件,再通過createFromParcel將Parcel物件對映成你的物件。也可以將Parcel看成是一個流,通過writeToParcel把物件寫到流裡面,在通過createFromParcel從流裡讀取物件只不過這個過程需要你來實現,因此寫的順序和讀的順序必須一致。

這部分有點難哦,單單看文字表述還是很難學得懂得,所以看具體程式碼或許更能理解多一點,如果要真正掌握,那就必須用它去實現具體功能才能做到了。(實踐是檢驗真理的唯一標準,還是要多練才行啊,單看是學不會程式設計的呀!)

例子:

import android.os.Parcel;
import android.os.Parcelable;
public class InfoBean implements Parcelable {//序列化資訊類
	public InfoBean(String name){//構造方法
		description = name;
	}
	public String description;//描述 -- 取一個欄位(資訊類InfoBean的一個屬性)
	public static final Parcelable.Creator<InfoBean> CREATOR
			=new Parcelable.Creator<InfoBean>(){
		/**
		 *
		 * 2.再通過createFromParcel將Parcel物件對映成你的物件。
		 * @param source
		 * @return
		 */
		@Override
		public InfoBean createFromParcel(Parcel source) {
			//再通過createFromParcel從流裡讀取物件
			String description = source.readString();
			//把物件儲存在資料類物件的構造引數中,返回包含有資料的物件
			return new InfoBean(description) ;
		}
		@Override
		public InfoBean[] newArray(int size) {
			return new InfoBean[size];
		}
	};
	@Override
	public int describeContents() {
		return 0;
	}
	/**
	 * 1.通過writeToParcel將你的物件對映成Parcel物件,
	 * @param dest
	 * @param flags
	 */
	@Override
	public void writeToParcel(Parcel dest, int flags) {
		//通過writeToParcel把物件寫到流裡面,
		dest.writeString(description);
	}
}

好難,想要表述清楚自己想說的東西不容易啊。希望下一次能進步一點點。