【Android基礎】利用Intent在Activity之間傳遞資料,androidintent

來源:互聯網
上載者:User

【Android基礎】利用Intent在Activity之間傳遞資料,androidintent
前言:上一篇文章給大家聊了Intent的用法,如何用Intent啟動Activity和隱式Intent,這一篇文章給大家聊聊如何利用Intent在Activity之間進行溝通。 從一個Activity擷取返回結果:

啟動一個Activity不僅僅是startActivity(Intent intent)一種方法,你也可以通過startActivityForResult()啟動一個Activity並且在它退出的時候收到一個返回結果。

比如,你可以調用系統相機在你的應用中,拍了一張照片,然後返回到你的Activity,這個時候就可以通過這種方法把照片作為結果返回給你的Activity。再比如,你可以通過這種方法啟動系統連絡人應用,然後擷取一個人的詳細連絡方式。

注意:在調用startActivityForResult()時你可以利用顯示Intent或者隱式Intent,但是在你能夠利用顯式Intent的時候盡量利用顯式Intent,這樣能夠保證返回的結果是你期待的正確結果。
 啟動一個Activity: 

在用startActivityForResult()來啟動一個Activity時,Intent的寫法與startActivity()是一樣的,沒有任何區別,只是你需要傳遞一個額外的Integer的變數作為啟動參數,當啟動的那個Activity退出時這個參數會被作為回呼函數的一個參數,用來區分返回結果,也就是說你啟動Activity時傳遞的參數(requestCode)和返回結果時的那個參數(requestCode)是一致的。

下面是一個調用startActivityForResult()擷取連絡人的例子:

static final int PICK_CONTACT_REQUEST = 1;  // The request code... private void pickContact() {     Intent pickContactIntent = new Intent(Intent.ACTION_PICK, Uri.parse("content://contacts"));    pickContactIntent.setType(Phone.CONTENT_TYPE); // Show user only contacts w/ phone numbers    startActivityForResult(pickContactIntent, PICK_CONTACT_REQUEST);}

  

startActivityForResult()函數在Activity源碼中是這樣的:

 /**     * Same as calling {@link #startActivityForResult(Intent, int, Bundle)}     * with no options.     *     * @param intent The intent to start.     * @param requestCode If >= 0, this code will be returned in     *                    onActivityResult() when the activity exits.     *     * @throws android.content.ActivityNotFoundException     *     * @see #startActivity     */    public void startActivityForResult(Intent intent, int requestCode) {        startActivityForResult(intent, requestCode, null);    }

  

這個方法在Activity中進行了重載,startActivityForResult(intent, requestCode, null);方法就不貼出來了。但是對於這個方法使用時的注意事項我給大家翻譯一下:
  • 這個方法只能用來啟動一個帶有返回結果的Activity,Intent的參數設定需要注意一下,你不能啟動一個Activity使用singleTask的launch mode,用singleTask啟動Activity,那個Activity在另外的一個Activity棧中,你會立刻收到RESULT_CANCELED訊息;
  • 不能在Activity生命週期函數onResume之前調用startActivityForResult()方法,如果你在onResume之前調用了,那麼所在的Activity就無法顯示,直到啟動的那個Activity退出然後返回結果,這是為了避免在重新定向到另外Activity時視窗閃爍;
 接收返回結果:

當startActivityForResult()啟動的Activity完成任務退出時,系統會回調你調用Activity的onActivityResult()方法,這個方法有三個參數:

  • resquestCode : 啟動Activity時傳遞的requestCode;
  • resultCode: 表示調用成功或者失敗的變數,值為下面二者之一;    /** Standard activity result: operation canceled. */    public static final int RESULT_CANCELED    = 0;    /** Standard activity result: operation succeeded. */    public static final int RESULT_OK           = -1;
  • Intent:包含返回內容的Intent;
下面的代碼是處理擷取連絡人結果的例子:
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {    // Check which request we're responding to     if (requestCode == PICK_CONTACT_REQUEST) {        // Make sure the request was successful         if (resultCode == RESULT_OK) {            // The user picked a contact.             // The Intent's data Uri identifies which contact was selected.              // Do something with the contact here (bigger example below)         }     } }

  

注意:為了正確的處理返回的Intent結果,你需要清楚的瞭解Intent返回結果的格式。如果是你自己寫的Intent作為返回結果你會很清楚,但是如果是調用的系統APP(相機,連絡人等),那麼Intent返回結果格式你應該清楚的知道。比如:連絡人應用是返回的連絡人URI,相機返回的是Bitmap資料。
 處理返回結果:下面的代碼是如何處理擷取連絡人的結果:
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {    // Check which request it is that we're responding to     if (requestCode == PICK_CONTACT_REQUEST) {        // Make sure the request was successful         if (resultCode == RESULT_OK) {            // Get the URI that points to the selected contact             Uri contactUri = data.getData();            // We only need the NUMBER column, because there will be only one row in the result             String[] projection = {Phone.NUMBER};             // Perform the query on the contact to get the NUMBER column             // We don't need a selection or sort order (there's only one result for the given URI)             // CAUTION: The query() method should be called from a separate thread to avoid blocking             // your app's UI thread. (For simplicity of the sample, this code doesn't do that.)             // Consider using CursorLoader to perform the query.             Cursor cursor = getContentResolver()                    .query(contactUri, projection, null, null, null);            cursor.moveToFirst();             // Retrieve the phone number from the NUMBER column             int column = cursor.getColumnIndex(Phone.NUMBER);            String number = cursor.getString(column);             // Do something with the phone number...         }     } }

  

下面的代碼是處理調用系統相機返回的結果:
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {    if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {        Bundle extras = data.getExtras();        Bitmap imageBitmap = (Bitmap) extras.get("data");        mImageView.setImageBitmap(imageBitmap);    } }

  

擷取啟動Intent:

在被啟動的Activity中你可以接收啟動這個Activity的Intent,在生命週期範圍內都能調用getIntent()來擷取這個Intent,但是一般都是在onCreat和onStart函數中擷取,下面就是一個擷取Intent的例子:

@Override protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);     setContentView(R.layout.main);     // Get the intent that started this activity     Intent intent = getIntent();    Uri data = intent.getData();     // Figure out what to do based on the intent type     if (intent.getType().indexOf("image/") != -1) {        // Handle intents with image data ...     } else if (intent.getType().equals("text/plain")) {        // Handle intents with text ...     } }

  

設定返回Intent:

上面介紹了怎麼在onActivityResult()中處理Intent,但是怎麼在你的應用中設定這個返回Intent呢?如果你想給調用你的Activity返回一個結果可以通過調用setResult()設定返回內容,然後結束這個Activity。下面的代碼是一個樣本:

// Create intent to deliver some kind of result data Intent result = new Intent("com.example.RESULT_ACTION", Uri.parse("content://result_uri");setResult(Activity.RESULT_OK, result);finish();

  

以上就是使用Intent在不同Activity進行資訊傳遞和溝通的講解,到此Intent系列文章完結,前兩篇文章是關於Intent詳解和Intent使用的文章,有什麼不明白的請留言,大家共同學習,共同進步,謝謝!

大家如果對編程感興趣,想瞭解更多的編程知識,解決編程問題,想要系統學習某一種開發知識,我們這裡有java高手,C++/C高 手,windows/Linux高手,android/ios高手,請大家關注我的公眾號:程式員互動聯盟or coder_online,大牛線上為您提供服務。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.