利用 Bundle 在 Acitivity 之間傳遞數據

一我的的夜晚,獨享白日裏數億人的天空,很難不讓人感慨這一番多有可貴。
話很少說,開始研習Activity之間數據傳遞。ide

Activity跳轉與傳值,主要是經過Intent類來鏈接多個Activity,以及傳遞數據。
Intent是Android一個很重要的類。Intent直譯是「意圖」,什麼是意圖呢?好比你想從這個Activity跳轉到另一個Activity,這就是一個意圖。
Activity跳轉,無返回結果
這是最簡單的Activity跳轉方式。從一個Activity啓動另外一個Activity,直接函數

startActivity(new Intent(當前Activity.this, 下一Activity.class))。

    ((Button) findViewById(R.id.Notepadv1)).setOnClickListener( new OnClickListener() {     
        public void onClick(View v) {     
            startActivity(new Intent (MyAndroidAppActivity.this, Notepadv1.class) );     
        }     
    });

Activity跳轉,返回數據/結果
須要返回數據或結果的,則使用startActivityForResult (Intent intent, int requestCode),requestCode的值是自定義的,用於識別跳轉的目標Activity。
跳轉的目標Activity所要作的就是返回數據/結果,setResult(int resultCode)只返回結果不帶數據,或者setResult(int resultCode, Intent data)二者都返回!
而接收返回的數據/結果的處理函數是onActivityResult(int requestCode, int resultCode, Intent data),這裏的requestCode就是startActivityForResult的requestCode,resultCode就是setResult裏面的resultCode,返回的數據在data裏面。this

MyAndroidAppActivity:code

static final int SEND_SMS_REQUEST = 0;    
static final int CALL_REQUEST = 1;    
        
((Button) findViewById(R.id.sms)).setOnClickListener( new OnClickListener() {    
    public void onClick(View v) {    
        Intent intent = new Intent(MyAndroidAppActivity.this, SendSMSActivity.class);    
        startActivityForResult(intent, SEND_SMS_REQUEST);    
    }    
});    
        
@Override    
protected void onActivityResult(int requestCode, int resultCode, Intent data) {    
    if (requestCode == SEND_SMS_REQUEST) {    
        if (resultCode == RESULT_OK) {    
            Toast.makeText(this, "Send SMS RESULT_OK", Toast.LENGTH_SHORT).show();    
        }else if (resultCode == RESULT_CANCELED) {    
            Bundle bundle = data.getExtras();    
            String phoneno = bundle.getString("phoneNO");     
            Toast.makeText(this, "Send SMS RESULT_CANCELED "+phoneno, Toast.LENGTH_SHORT).show();    
        }    
    }else if (requestCode == CALL_REQUEST) {    
        if (resultCode == RESULT_CANCELED) {    
            Toast.makeText(this, "Call RESULT_CANCELED", Toast.LENGTH_SHORT).show();    
        }    
    }    
}
 

SendSMSActivity:
((Button) findViewById(R.id.send)).setOnClickListener( new Button.OnClickListener() {    
    public void onClick(View v) {    
        SendSMSActivity.this.setResult(RESULT_OK);    
        SendSMSActivity.this.finish();    
    }    
}):

** 注意,在setResult後,要調用finish()銷燬當前的Activity,不然沒法返回到原來的Activity,就沒法執行原來Activity的onActivityResult函數,看到當前的Activity沒反應。
RESULT_OK和RESULT_CANCELED是系統空間裏面的常量,不須要自定義,直接使用就行。
另外在運行過程當中,發現按Back鍵後,是能夠返回RESULT_CANCELED的,看了SDK doc後,原來真的是那樣,並且不帶有數據的。這意味着,若是你設想在返回RESULT_CANCELED時並返回數據,那麼須要截獲Back鍵的事件處理,把原來返回RESULT_CANCELED的核心邏輯copy到事件處理裏面。這裏給個例子:對象

((Button) findViewById(R.id.cancel)).setOnClickListener( new Button.OnClickListener() {    
    public void onClick(View v) {    
        // 實例化 Bundle,設置須要傳遞的參數    
        Bundle bundle = new Bundle();    
        bundle.putString("phoneNO", "020-123");    
        
        SendSMSActivity.this.setResult(RESULT_CANCELED, SendSMSActivity.this.getIntent().putExtras(bundle));    
        SendSMSActivity.this.finish();    
    }    
});    
        
@Override    
public boolean onKeyDown(int keyCode, KeyEvent event) {    
    // 是否觸發按鍵爲back鍵       
    if (keyCode == KeyEvent.KEYCODE_BACK) {    
                
        // 實例化 Bundle,設置須要傳遞的參數    
        Bundle bundle = new Bundle();    
        bundle.putString("phoneNO", "020-123");    
                
        setResult(RESULT_CANCELED, this.getIntent().putExtras(bundle));    
        this.finish();    
        return true;    
    }else {    
        return super.onKeyDown(keyCode, event);    
    }    
}

這裏要注意的是,在處理Back鍵事件後return true則表示本事件再也不傳遞給其餘函數處理,可理解爲由當前函數全權負責處理,因此在return前finish當前Activity,保持原來的行爲表現,固然咱們能夠設置爲隱藏當前Activity等其餘行爲。
Activity傳送數據
在上面的代碼中,咱們能夠看到使用Bundle來存儲數據,並將其putExtras到Intent裏面。Bundle使用「名字-值」來存儲數據。那麼,從原來的Activity A傳送數據到新的Activity B, Activity B如何獲取傳送過來的Intent參數時呢?最近寫了這樣的一個例子:
In Activity A:事件

// 在某個按鈕響應事件裏    
Intent intent = new Intent(this, TextInputActivity.class);    
intent.putExtra("Text", mText);    
intent.putExtra("TextColor", mTextColor);    
intent.putExtra("TextSize", mTextSize);    
intent.putExtra("TextBold", mTextBold);    
        
startActivityForResult(intent, REQUEST_TEXT);
In Activity B:


// in onCreate(Bundle savedInstanceState)    
Bundle extras = getIntent().getExtras();    
mText = extras.getString("Text");    
mTextColor = extras.getInt("TextColor");    
mTextSize = extras.getFloat("TextSize");    
mTextBold = extras.getBoolean("TextBold");

關於Bundle

extra只是intent所帶的一種數據
而bundle是這個數據的一種形式get

//新建一個Bundle
Bundle mBundle = new Bundle();
//Bundle中加入數據
mBundle.putString("Data","data fore Bundle");
//新建一個Intent數據,將Bundle傳入這個intent對象
Intent intent = new Intent(TestBundle.this,Target.class);
//壓入mBundle到intent中
intent.putExtra(mBundle);
//啓動其餘activity
startActivity(intent);
相關文章
相關標籤/搜索