標籤:相互 請求 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中的edit給A的情況
*/
}
然後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)