中秋節剛過,相信大家都有聽過月餅的由來~
而 android 在彼此串連的溝通用意圖這個方式在進行,但是若是想要挾帶多的訊息我們要怎麼處理呢?
今天的主題~包裹(Bundle)
因為今天的專案跟昨天的內容只是對了一點東西,所以今天一開始就先帶各位怎麼新增一個既有專案
我們將昨天完成的地圖視為一個既有專案,這時請點看左上圖示工具列的"new",選擇"Android Project from Existing Code",如下圖所示:
再來點選"Browser"選擇一個放在某處的專案,而我們原本的專案是放在workspace下的"Day6_Index"
然後請記得勾選"Copy project into workspace",SDK 會將該專案目錄複製一份到我們的 Workspace 目錄裡,其實不勾選也可以,自己記得專案擇放在哪兒就可以了。
這邊有一點要注意,SDK 在追加既有專案進專案列表時,會自動以該專案原有的 package name 為專案名稱,所以要注意原有的專案名稱中,是否有跟這個欲加入之專案同名。
加入後,請再將之依下圖順序改為新的專案名稱"Day7_Intent2",
其實最快的方式按"F2"就好了XD(謎之音:喂!那上面那麼複雜的方法還說…)
再來就進入正題了!什麼是Bundle呢?有聽過月餅的由來吧,而Bundle就是幫我們將要傳遞的訊息打包起來,讓 Moogle1 可以在溝通時一併傳給 Moogle2,這樣就可以在請求支援時多提出一些要求了
再來我們要在 Intent 下面加上一個新的物件定義
Bundle bundle = new Bundle();
起手式完成!再來就是放入我們要傳遞的資訊,這個資訊必需要考慮資訊的類型,若是數值的話就是用 Int、字串用 String,語法如下:
bundle.putInt(key, 數值內容)
bundle.putString(key, 字串內容)
...
由上可以看得出來,他是一種 key-value 的格式,而要放進去的內容都放好後,就正式要"包"起來了,
intent.putExtras(bundle);
這個語法看起來很有"打包"的fu吧!
所以我們接下來就正式在 mBtnCallMoogle2.setOnClickListener 裡加入的內容如下:
/* TODO: 被點擊後要執行的動作 */
Intent intent = new Intent(Moogle1Activity.this, Moogle2Activity.class);
//亂數取一個0~10的數值
int signal = (int)(Math.random()*10) + 1;
Bundle bundle = new Bundle();
//關鍵字(key)為"Signal",值是亂數產生的一個隨機值
bundle.putInt("Signal", signal);
bundle.putStr
intent.putExtras(bundle);
startActivity(intent);
至於要接收的 Moogle2 要怎麼接呢?一樣是寫在 onCreate() 裡面,直接來看程式碼吧
/* TODO: 取得暗號 */
try{
//取得包裹
Bundle bundleForMoogle1 = getIntent().getExtras();
//再加兩個判斷式,確定包裹裡有我們要的訊息
if(bundleForMoogle1 != null && bundleForMoogle1.containsKey("Signal")){
mSignal = bundleForMoogle1.getInt("Signal");
}
} catch(Exception ex){
mSignal = -1;
}
為了避免發生"丟包"的狀況,這邊做了雙重保護,一者用try..catch...包起來,二者,追加兩個判斷,先判斷接到的 bundle 有沒有東西( != null) ,再判斷是否有關鍵字:Signal的訊息,取值的方式跟放值的語法putXXX的模式雷同,是用**getXXX(key)**來取值。接到訊息後,當然我們就要再回報前端我們解密後的內容啦!
在btnRequestToMoogle1.setOnClickListener的動作裡,我們要寫入這樣的內容
/* TODO: 被點擊後要執行的動作 */
Intent intent = new Intent(Moogle2Activity.this, Moogle1Activity.class);
String message;
/* 解析內容,請自行設定吧 */
if(mSignal == -1){
message = "回報!看不懂!";
} else if(mSignal == 0) {
message = "那我們就去休息了!";
} else {
message = "我們帶了" + String.valueOf(mSignal * 100) + "個弟兄來了!";
}
/* 如法炮製,放入要回應的資訊 */
Bundle bundleRequestMoogle1 = new Bundle();
bundleRequestMoogle1.putInt("Signal", mSignal);
bundleRequestMoogle1.putString("Message", message);
intent.putExtras(bundleRequestMoogle1);
startActivity(intent);
這邊除了原本獲得的訊號外,再加傳回一個解析後的訊息:Message。
到這邊,還看得懂嗎?休息一下,接下來是 Moogle1 要將取得的訊息再用吐司呈現給我們看哦!
這次 Moogle1 所接受的動作,不是寫在 onCreate() 裡面,而是一個稱為 onStart() 的函式裡,至於為什麼,我們留待之後再解釋,先來看看這段程式動作的內容。
@Override
protected void onStart() {
super.onStart();
String message;
int signal;
try{
//取得 Moogle2 傳來的包裹
Bundle bundleFromMoogle2 = getIntent().getExtras();
if(bundleFromMoogle2 != null){
/* 解譯 Moogle2 傳來的訊息 */
signal = (bundleFromMoogle2.containsKey("Signal"))?
bundleFromMoogle2.getInt("Signal") : -1;
if(signal == -1){
message = "找出有問題的地方後,再重傳一次吧!";
} else {
message = (bundleFromMoogle2.containsKey("Message")) ?
bundleFromMoogle2.getString("Message") : "回報兵被殲滅!";
}
//用吐司(Toast)來傳出訊息
Toast.makeText(this, message, Toast.LENGTH_LONG).show();
}
} catch(Exception ex){
message = "無法解譯!";
}
}
這邊用了一個三元運算子的語法,若是看不懂的話,麻煩再留言告知,或是上網查一下吧!
最後,這是從 Moogle2 回傳訊息後取得內容的畫面哦!
本篇中有些地方直接略過的原因,是因為該處不算是這次內容的重點,只是為了些趣味性而加入,若是不理解再請告知。
同樣地,今天的程式碼都可以在 Mosil's GitHub 裡面取得哦
mosil提到:
這次 Moogle1 所接受的動作,不是寫在 onCreate() 裡面,而是一個稱為 onStart() 的函式裡,至於為什麼,我們留待之後再解釋
我倒是覺得Moogle1,2接收動作的部份
應該都寫在onStart中
會比較一致
記得要解釋
以前參加一些seminar
有些講者會說:這個後面會說明
等講到後面時會說:這個前面已經講過了
哇!今天好快就交卷了
記得要解釋
以前參加一些seminar
有些講者會說:這個後面會說明
等講到後面時會說:這個前面已經講過了
別擔心,不會讓你失望的
iT邦幫忙MVPantijava提到:
有些講者會說:這個後面會說明
等講到後面時會說:這個前面已經講過了
其實這是我自己簡報時
對付不認真的客戶的方法
antijava提到:
其實這是我自己簡報時
對付不認真的客戶的方法
我們全程都有錄音錄影, 來人啊! 調影像檔出來