安卓權威編程指南 - 第五章學習筆記(兩個Activity)

來源:互聯網
上載者:User

標籤:相互   請求   log   images   其他   toast   方法   bool   turn   

學習安卓編程權威指南第五章的時候自己寫了個簡單的Demo來加深理解兩個Activity互相傳遞資料的問題,然後將自己的學習筆記貼上來,如有錯誤還請指正。

 

IntentActivityDemo學習筆記

題目:ActivityA登入介面(使用者名稱、密碼、登陸按鈕),ActivityB(Edit,返回按鍵:SubmitButton)。A介面輸入使用者名稱和密碼傳到B中,B驗證使用者輸入的使用者名稱和密碼,如果錯誤就返回A,並用Toast 顯示使用者名稱和密碼錯誤;如果正確,就在第二個 activity中顯示一個Edit,使用者輸入後點擊SubmitButton回到A,用 Toast 提示使用者計算結束。

 

這裡使用的方法是顯式的intent。

一個activity啟動另一個activity最簡單的方式是使用以下startActivity方法:

public void startActivity(Intent intent)

調用請求發送給了作業系統的ActivityManager,ActivityManager負責建立activityB執行個體並調用其onCreate(...)方法,如下:

 

 

intent是一種多用途通訊工具。 Intent類提供了多個構造方法,以滿足不同的使用需求。

 

public Intent(Context packageContext, Class<?> cls)

傳入該方法的Class型別參數告訴ActivityManager應該啟動哪個activity; Context參數告訴ActivityManager在哪裡可以找到它。原理

 

 

 

 

 

如果是簡單的啟動一個Activity這個方法就可以了,我們這裡需要傳遞username,password到ActivityB中,需要兩個Activity之間相互傳遞資料。我們使用startActivityForResult函數,在這之前,先說一下intent extra。之後再說startActivityForResult(0x02)

 

Extra也是一種索引值結構,要將extra資料資訊添加給intent,需要調用Intent.putExtra(...)方法。確切地說,是調用

public Intent putExtra(String name, boolean value)

Intent.putExtra(...)方法形式多變。不變的是,它總是有兩個參數。一個參數是固定為String類型的鍵,另一個參數值可以是多種資料類型。該方法返回intent自身,因此,需要時可進行鏈式調用。

相對應的還有獲得extra的資訊的方法:

要從extra擷取資料,會用到如下方法:

public boolean getBooleanExtra(String name, boolean defaultValue)

第一個參數是extra的名字。 getBooleanExtra(...)方法的第二個參數是指定預設值(預設答案),它在無法獲得有效索引值時使用,當無法獲得有效值的時候,true\false會根據這個函數的設定而確定。

 

接下來我們開始寫簡單的代碼了。

 

0x01

首先,A中輸入username、password點擊loginButton,所以我們在loginButton添加事件監聽,並且將我們輸入的username和password傳到B中。

Activity可能啟動自不同的地方,我們應該為activity擷取和使用的extra定義鍵。 並且使用包名修飾extra資料資訊,可以避免來自不同應用的extra間發生命名衝突, 如代碼所示:

//login username 索引值
private staticfinal String EXTRA_LOGIN_USERNAME =
        "com.example.zc.practice_geoquiz.login_usename";
//login password索引值
private staticfinal String EXTRA_LOGIN_PASSWORD =
        "com.example.zc.practice_geoquiz.login_password";

 

現在,可以返回到QuizActivity並將extra附加到intent上。不過我們有個更好的實現方法。

對於ActivityB處理extra資訊的實現細節,ActivityA和應用的其他代碼無需知道。因而,我們可轉而在newIntent(...)方法中封裝這些邏輯。

在ActivityB中,建立newIntent(...)方法,如代碼所示。

public static Intent newIntent(
            Context packageContext, String username, String password)
    {
        Intent i = new Intent(packageContext, ActivityB.class);

        //username 放到EXTRA_LOGIN_USERNAME 索引值中
       
i.putExtra(EXTRA_LOGIN_USERNAME, username);
        i.putExtra(EXTRA_LOGIN_PASSWORD, password);


        return i;
   
}
之後會上原始碼,原始碼中的注釋會詳細一些。

好的這裡調試一下看是否得到:

 

 

這裡我設定的正確的是123 123

故意輸錯 22 22:

 

 

好的這裡得到了。

 

0x02

我們接著來,我們在B中要判斷username和password正確與否並且要將這個驗證結果返還給A。

因為我們需要從B中獲得資料到A中所以我們之前的啟動Activity使用的是startActivityForResult。

public void startActivityForResult(Intent intent, int requestCode)

該方法的第一個參數同前述的intent。第二個參數是請求代碼。 請求代碼是先發送給子activity,然後再返回給父activity的使用者定義整數值。當一個activity啟動多個不同類型的子activity,

且需要判斷區分訊息回饋方時,通常會用到該請求代碼。雖然QuizActivity只啟動一種類型的子activity,但為應對未來的需求變化,現在就應佈建要求代碼常量。

代碼如下;

/*REQUEST_LOGININFO
   onActivityResult(int requestCode, int resultCode, Intent intent)
   
中的requestCode
        */
startActivityForResult(v1, REQUEST_LOGININFO);

 

0x03

設定結果值

因為B要告訴A你給我傳過來的那些username和password對不對,所以我們這裡同樣也是使用索引值EXTRA_IS_LOGIN,然後使用setResult來設定結果值反給A,A自動走onActivityResult(後面我們要自己重寫),注意B這裡後面必須調用finish()函數或者是back動作後,才會到A的onActivityResult中。

代碼如下:

private void IsLogIn(boolean IsLogIn)
{
    Intent v1 = new Intent();
    v1.putExtra(EXTRA_IS_LOGIN, IsLogIn);
    setResult(RESULT_OK, v1);

    /*
   
第二個頁面finish()動作或者back動作後,會回調第一個頁面的onActivityResult()方法
     */
   
finish();
}

調試一下,就能否到A的onActivityResult中:

 

 

然後

 

 

好的走到了,接下來就是來看看你給我的是什麼資訊。

 

在B中,代碼如下:
public static boolean IsInfor(Intent intent)
{
    return intent.getBooleanExtra(EXTRA_IS_LOGIN, true);
    /*
   
第二參數有影響,如果沒有被設定就是預設值!!!!
    這個沒有被設定的情況就是
B中的editA的情況
     */
}

然後A中,代碼如下:

mIsLoginSuccess = ActivityB.IsInfor(intent);

if(mIsLoginSuccess == false)
{
    Toast.makeText(this, "使用者名稱和密碼錯誤", Toast.LENGTH_SHORT)
            .show();
}

調試一下:

1) 輸入 22 22 錯誤的情況:

 

 

 

2) 輸入123 123 正確進入

 

到這裡我們的第一步,登入介面的東西就寫完了也就是A到B 可以了,接下來B到A:

0x04

在submitbutton點擊事件監聽中,代碼如下:

mResultText = (EditText) findViewById(R.id.result_text);
                existedText = mResultText.getText().toString();

                Intent v1 = new Intent();
                v1.putExtra(EXTRA_EDITVIEW_RESULT, existedText);
                setResult(RESULT_OK, v1);
/*
第二個頁面finish()動作或者back動作後,會回調第一個頁面的onActivityResult()方法
 */
               
finish();

 

一樣也是使用putExtra把資料設定到索引值中,使用setResult和finish到A中調用onActivityResult。

A中代碼如下:

if(mIsLoginSuccess == false)
{
    Toast.makeText(this, "使用者名稱和密碼錯誤", Toast.LENGTH_SHORT)
            .show();
}


else
{
    Result = ActivityB.GetResult(intent);
    Toast.makeText(this, Result, Toast.LENGTH_SHORT)
            .show();

}

 

自訂方法GetResult:

public static String GetResult(Intent intent)
{
    return intent.getStringExtra(EXTRA_EDITVIEW_RESULT);
}

 

調試:

B:

 

 

A:

 

成功。

 

0x05

之前getBooleanExtra方法中第二參數一開始不瞭解,後來通過調試理解什麼意思:

正確的代碼:

 

 

這裡我們將第二參數設定為false:

 

 

 

對於username和password錯誤的情況沒有問題:

 

 

 

對於B給A傳資料的時候,由於有這一句:

 

 

 

因為第二次的條件下,我們的username,password是正確的,所以不會走到這個裡面:

 

 

所以,我們B給A資料的時候會走預設:

 

 

所以會返回false,進入:

 

 

如下:

0x01:

 

 

密碼正確,使用者名稱正確

 

0x02:

 

 

點擊submit

0x03:

 

 

 

所以可以理解那個預設的意思了。

 

原始碼:
連結:http://pan.baidu.com/s/1bplhlXt 密碼:x0x2

 

安卓權威編程指南 - 第五章學習筆記(兩個Activity)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.