星期三, 10月 26, 2011

Activity (三)

Amdroid應用程式學習筆記

Starting an Activity

你可以呼叫startActivity()啟動其他activity,傳入Intent物件來描述你想啟動的activity,Intent不是明確指定你想起動的activity就是描述你想執行的動作類型(系統會為你挑選適合的activity,可能是不同應用程式的activity),Intent物件也可以攜帶小量的數據到你想啟動的activity使用。

當你在自己的應用程式完成啟動其他activity,通常都是啟動已知的activity,你可以建立一個intent明確地用類別名稱定義你想啟動的activity是哪個,以下就是一個activity如何啟動另一個名稱為SignInActivity的activity的例子。


Intent intent = new Intent(this, SignInActivity.class);
startActivity(intent);

然而,你的應用程式也想執行一些動作,例如發送電子郵件、編輯簡訊或是狀態更新,既然這樣,你的應用程式也許沒有自己的activities可以執行這些動作,所以你可以使用在裝置上其他應用程式所提供的activity,且這些activity可以執行動作。這是intent有價值的地方-你可以建立一個intent描述你想執行的動作,然後系統啟動來自其他應用程式適合的activity。如果有許多activity都可以完成intent描述的動作,用戶可以選擇其中一個使用。舉例,你想允許用戶寄發電子訊息,你可以如此建立intent:


Intent intent = new Intent(Intent.ACTION_SEND);
intent.putExtra(Intent.EXTRA_EMAIL, recipientArray);
startActivity(intent);

EXTRA_EMAIL額外加到intent的是電子郵件地址的字串陣列,當電子郵件應用程式回應這個intent,應用程式讀取intent中的字串陣列。在此狀況,電子郵件應用程式啟動,用戶用完,你的activity就會恢復。


Starting an activity for a result


有時候你可能想要從你啟動的activity接收結果,既然這樣,呼叫startActivityForResult()方法啟動activity取代startActivity()方法,從被啟動的activity接收結果,實現onActivityResult()回調方法,以下為如何建立intent與處理結果:


private void pickContact() {
    // Create an intent to "pick" a contact, as defined by the content provider URI
    Intent intent = new Intent(Intent.ACTION_PICK, Contacts.CONTENT_URI);
    startActivityForResult(intent, PICK_CONTACT_REQUEST);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // If the request went well (OK) and the request was PICK_CONTACT_REQUEST
    if (resultCode == Activity.RESULT_OK && requestCode == PICK_CONTACT_REQUEST) {
        // Perform a query to the contact's content provider for the contact's name
        Cursor cursor = getContentResolver().query(data.getData(),
        new String[] {Contacts.DISPLAY_NAME}, null, null, null);
        if (cursor.moveToFirst()) { // True if the cursor is not empty
            int columnIndex = cursor.getColumnIndex(Contacts.DISPLAY_NAME);
            String name = cursor.getString(columnIndex);
            // Do something with the selected contact's name...
        }
    }
}

在此例子中,演示了你使用onActivityResult()方法處理activity結果的基本邏輯,第一個條件式檢查請求是否成功-如果成功,resultCode為RESULT_OK-回應的請求是否已知,requestCode配對startActivytForResult()的第二個參數。

contentResolver執行查詢,回傳一個Cursor物件,通過cursor物件讀取結果。

沒有留言:

張貼留言