總結了一下:
從A跳到B,A onPause()
後不會馬上執行onStop()
,而是要等到
B onCreate(),onStart(),onResume()
之後再執行onStop()
;
若是B沒有完全遮擋住A,例如B是一個dialog的話,onStop()
便不會執行了。
從MainActivity通過Intent跳轉到B,需要
new Intent(MainActivity.this,B.class)
,
而B中可以通過getIntent()
來取得它們之間這個橋樑Intent
,並且取到保存的鍵值對參數。
Bundle對象獲取字符串的時候有一個重載的方法:
getString("鍵名","若不存在時的默認值")
這樣若是Bundle中沒有這個key的value,則取出的是默認值。
與Intent對應的取值:
putExtra("key",Bundle)
— getBundleExtra("key")
putExtras(Bundle)
— getExtras()
如果不對對象進行任何處理,那麼
intent.putExtra("user",new User("jackie",21));
所以,應該對實體對象進行處理:兩種方式
1、implements Serializable
A:intent.putExtra("user",new User("jackie",21));
B:intent.getSerializableExtra("user");//此處注意是Serializable
2、implements Parcelable
User類要重寫兩個方法,其中
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
dest.writeInt(age);
}
parcelable
沒有自動序列化的機制需要我們手動實現,如上
另外,還要在User裏寫一個
public static final Creator<User> CREATOR = new Creator<User>() {
@Override
public User createFromParcel(Parcel in) {
return new User(in);
}
@Override
public User[] newArray(int size) {
return new User[size];
}
};
A:intent.putExtra("user",new User("jackie",21));
B:intent.getParcelableExtra("user");//此處注意是Parcelable
後者是安卓爲開發者提供的序列化方法,不使用系統序列化機制,速度較快,雖然操作複雜了些。
在B的按鈕處:使用setResult()
方法,並且新聲明一個intent
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent();
intent.putExtra("BName",editText.getText().toString());
setResult(1,intent);
}
});
而在A中,要想接收到返回值就不能通過startActivity(intent);
要使用startActivityForResult(intent,0);//0表示一種兩者交互的行爲
並且A中要重寫一個方法來對返回數據進行處理
onActivityResult(int requestCode, int resultCode, Intent data)
這裏的data就是B中返回的那個intent,那麼通過它就能取到B中EditText的值
String name=data.getStringExtra("BName");
textView.setText(name);
也就是說關鍵在於(限於幅面參數省略)
A:startActivityForResult()
,onActivityResult()
B:setResult();