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);
}
}
好難,想要表述清楚自己想說的東西不容易啊。希望下一次能進步一點點。