iT邦幫忙

DAY 7
5

Android 學習手札系列 第 7

Day 7 - Android - 傳遞訊息用的包裹

  • 分享至 

  • xImage
  •  

中秋節剛過,相信大家都有聽過月餅的由來~
而 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 裡面取得哦

《串連 吐司不夠吃啦~


上一篇
Day 6 - Android - 串連
下一篇
Day 8 - Android - 吐司不夠吃啦~
系列文
Android 學習手札30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
海綿寶寶
iT邦大神 1 級 ‧ 2012-10-01 21:33:56

mosil提到:
這次 Moogle1 所接受的動作,不是寫在 onCreate() 裡面,而是一個稱為 onStart() 的函式裡,至於為什麼,我們留待之後再解釋

我倒是覺得Moogle1,2接收動作的部份
應該都寫在onStart中
會比較一致

記得要解釋
以前參加一些seminar
有些講者會說:這個後面會說明
等講到後面時會說:這個前面已經講過了
暈

mosil iT邦新手 4 級 ‧ 2012-10-01 21:51:55 檢舉

哇!今天好快就交卷了灑花

記得要解釋
以前參加一些seminar
有些講者會說:這個後面會說明
等講到後面時會說:這個前面已經講過了

別擔心,不會讓你失望的rock

iT邦幫忙MVPantijava提到:
有些講者會說:這個後面會說明
等講到後面時會說:這個前面已經講過了

其實這是我自己簡報時
對付不認真的客戶的方法
偷笑

鐵殼心 iT邦高手 1 級 ‧ 2012-10-02 09:27:14 檢舉

antijava提到:
其實這是我自己簡報時
對付不認真的客戶的方法

我們全程都有錄音錄影, 來人啊! 調影像檔出來

我要留言

立即登入留言