轉載請注明出處:http://blog.csdn.net/huiblog/article/details/53222810
在上一篇文章《Activity(Intent-filter詳解及跳轉)》中,我們講解了使用Intent進行Activity的簡單跳轉。這一節我們把Activity跳轉時傳遞資料講一下。
Activity之間資料傳遞
Activity跳轉之間使用Intent傳遞資料。
Intent
Intent->
public class Intent implements Parcelable, Cloneable
是一個實作了序列化的類。使用起來比較簡單。先來例子:
MainActivity.java
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void testIntent(View view){
Intent intent = new Intent(this, SecondActivity.class);
intent.putExtra("main","你最牛!");//直接将main->"你最牛!"鍵值對形式存入Intent中
Bundle bundle = new Bundle();//建立bundle對象
bundle.putFloat("lala",f);//将lala->2.234f對應的值存入bundle中
bundle.putBoolean("haha", true);
intent.putExtras(bundle);//将bundle存入Intent中
startActivity(intent);
}
}
SecondActivity.java
public class SecondActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
Intent intent = getIntent();//擷取到intent對象
if(intent != null){
String main = intent.getStringExtra("main");//擷取存入intent中的main對應的值
Log.e("hui", "SecondActivity收到的資料是:"+main);
}
Bundle bundle = intent.getExtras();//拿到intent中存入的bundle
if(bundle != null){
float lala = bundle.getFloat("lala", f);//拿到bundle中存入的lala對應的值,預設值設為6.6( 如果bund中沒有lala對應的值,則傳回6.6)
boolean haha = bundle.getBoolean("haha", false);
Log.e("hui", "Bundle收到的lala=:"+lala);
Log.e("hui", "Bundle收到的haha=:"+haha);
}
}
}
結果:
/com.example.asia.testintent E/hui: SecondActivity收到的資料是:你最牛!
/com.example.asia.testintent E/hui: Bundle收到的lala=:
/com.example.asia.testintent E/hui: Bundle收到的haha=:true
分析:
在MainActivity中使用intent.putExtra(“main”,”你最牛!”);了存資料,putExtra是一種鍵值對存取資料的方法。在這裡main對應的資料就是”你最牛!”,将這個值封裝到Intent中,然後跳轉到SecondActivity後,先使用getIntent拿到存取資料的intent,然後再使用intent.getStringExtra(key)将Intent中封裝的key對應的值取出來。
可以看到putExtra有很多重載方法,可以封裝八大基本資料類型和字元串以及他們的數組,還有實作了序列化接口的對象,還有Bundle對象。
Bundle
- 發送資料
- 建立bundle對象
-
将資料使用bundle.putFloat(key,value)或bundle.putBoolean(key, value)等等方式将資料存入bundle中
*建立Intent對象, 将bundle對象存入inent對象中
- 拿到資料
- 在目的Activity中getIntent得到intent對象
- 使用 intent.getExtras()拿到bundle對象
- 使用bundle.getFloat(key)之類的拿到key對應的資料
現在我們已經知道了從A跳轉到B時,把A中的資料攜帶到B中該怎麼做了。在開發中我們經常會遇到關閉目前Activity把資料傳回到上一級Activity的情況。對于這種情況怎麼弄呢?Google很屌,當然有辦法的。
setResult/onActivityResult
上代碼。
在MainActivity中添加代碼
private int requestCode = ;
public void setResult_onActivityResult(View view){
Intent intent = new Intent(this, SecondActivity.class);
startActivityForResult(intent, requestCode);
}
/**
* 以startActivity(intent)啟動的Activity銷毀的Activity傳回的資料傳回到這裡
* @param requestCode startActivityForResult(intent, requestCode)中的requestCode
* @param resultCode setResult(int resultCode, Intent data)中的resultCode
* @param data 傳回的資料封裝在這裡
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(data != null){
String fanhui = data.getStringExtra("fanhui");
Log.e("hui", "傳回的資料是:"+fanhui);
}
Log.e("hui", "requestCode=:"+requestCode);
Log.e("hui", "resultCode:"+resultCode);
}
在SecondActivity的onCreate中添加如下代碼
Intent intent2 = new Intent();
intent2.putExtra("fanhui", "傳回的資料是我最帥");
/**
* void setResult(int resultCode, Intent data)
* resultCode:傳回的結果碼,對應void onActivityResult(int requestCode, int resultCode, Intent data)中的resultCode
* data:将傳回的資料封裝到data中
*/
setResult(, intent2);
結果:
OK!Activity之間傳遞資料就講到這了。↖(^ω^)↗
code在這