天天看點

Activity資料傳遞(Intent、Bundle)Activity之間資料傳遞

轉載請注明出處: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對應的值取出來。

Activity資料傳遞(Intent、Bundle)Activity之間資料傳遞

可以看到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);
           

結果:

Activity資料傳遞(Intent、Bundle)Activity之間資料傳遞

OK!Activity之間傳遞資料就講到這了。↖(^ω^)↗

code在這

繼續閱讀