Android之Activiy間數據的傳遞

前言

Activity間數據的傳遞其實是很基礎的內容,但是隻知道大概,並沒有搞清楚到底能夠傳遞哪些內容,藉此機會,進行一次整理,儘量將所有情況都涵蓋。

從當前的Activity傳遞數據給下一個Activity

其實呢很簡單,我們都知道啓動一個Activity,我們通常是創建一個Intent對象,表明意圖,再調用startActivity或者startActivityForResult方法,來啓動下一個Activity,而傳遞數據時,我們只需要將數據使用Intent對象的putExtra方法保存起來,然後到下一個界面時,通過key值取出即可。
下面是我傳遞數據的代碼:

        Intent intent = new Intent (this,OtherActivity.class);

        intent.putExtra ("byte",10);
        intent.putExtra ("char",'a');
        intent.putExtra ("short",100);
        intent.putExtra ("int",1000);
        intent.putExtra ("long",10000);
        intent.putExtra ("float",100.01);
        intent.putExtra ("double",100.001);
        intent.putExtra ("boolean",true);
        intent.putExtra ("string","string");
        byte[] bytes = new byte[]{ (byte) 0x85, (byte) 0x82 };
        intent.putExtra ("byteArray",bytes);
        char[] chars = new char[]{'a','b','A','B'};
        intent.putExtra ("charArray",chars);
        short[] shorts = new short[]{};
        intent.putExtra ("shortArray",shorts);
        int[] ints = new int[]{1,2,3,4};
        intent.putExtra ("intArray",ints);
        long[] longs = new long[]{10000,20000};
        intent.putExtra ("longArray",longs);
        float[] floats = new float[]{ (float) 100.01,(float) 100.02,(float) 100.03};
        intent.putExtra ("floatArray",floats);
        double[] doubles = new double[]{100.001,100.002,100.003};
        intent.putExtra ("doubleArray",doubles);
        boolean[] booleans = new boolean[]{true,false,true};
        intent.putExtra ("booleanArray",booleans);
        String[] strings = new String[]{"abc","def","ABC"};
        intent.putExtra ("stringArray",strings);
        intent.putExtra ("CharSequence","CharSequence");
        CharSequence[] charSequences = new CharSequence[]{"CharSequence1","CharSequence2"};
        intent.putExtra ("charSequences",charSequences);
        ParcelableImp parcelableImp = new ParcelableImp ();
        parcelableImp.setTestInt (88);
        parcelableImp.setTestString ("surprise");
        intent.putExtra ("Parcelable",parcelableImp);
        SerializableImp serializableImp = new SerializableImp ();
        serializableImp.setTestDouble (100.002);
        serializableImp.setTestBoolean (true);
        intent.putExtra ("serializableImp",serializableImp);

        ArrayList<Integer> integers = new ArrayList<> ();
        for(int i=10;i>0;i--){
            integers.add (i);
        }
        intent.putIntegerArrayListExtra ("intList",integers);
        ArrayList<CharSequence> charSequenceArrayList = new ArrayList<> ();
        for(int i=0;i<10;i++){
            charSequenceArrayList.add ("CharSequence"+i);
        }
        intent.putCharSequenceArrayListExtra ("charSequenceArrayList",charSequenceArrayList);
        ArrayList<String> stringArrayList = new ArrayList<> ();
        for(int i=0;i<10;i++){
            stringArrayList.add ("String"+i);
        }
        intent.putStringArrayListExtra ("stringArrayList",stringArrayList);
        ParcelableImp parcelableImp1 = new ParcelableImp ();
        parcelableImp1.setTestInt (66);
        parcelableImp.setTestString ("eleven");
        ParcelableImp parcelableImp2 = new ParcelableImp ();
        parcelableImp2.setTestInt (26);
        parcelableImp.setTestString ("twelve");
        ArrayList<ParcelableImp> parcelableImpArrayList = new ArrayList<> ();
        parcelableImpArrayList.add (parcelableImp1);
        parcelableImpArrayList.add (parcelableImp2);
        intent.putParcelableArrayListExtra ("parcelableImpArrayList",parcelableImpArrayList);



        Bundle bundle = new Bundle ();
        bundle.putByte ("byte", (byte) 10);
        bundle.putChar ("char",'a');
        bundle.putShort ("short", (short) 100);
        bundle.putInt ("int",1000);
        bundle.putLong ("long",10000);
        bundle.putFloat ("float", (float) 100.01);
        bundle.putDouble ("double",100.001);
        bundle.putString ("string","string");
        bundle.putBoolean ("boolean",true);
        bundle.putByteArray ("byteArray",bytes);
        bundle.putCharArray ("charArray",chars);
        bundle.putShortArray ("shortArray",shorts);
        bundle.putIntArray ("intArray",ints);
        bundle.putLongArray ("longArray",longs);
        bundle.putFloatArray ("floatArray",floats);
        bundle.putDoubleArray ("doubleArray",doubles);
        bundle.putBooleanArray ("booleanArray",booleans);
        bundle.putStringArray ("stringArray",strings);
        ArrayList<String> stringList = new ArrayList<> ();
        for(int i=0;i<10;i++){
            stringList.add ("a"+i);
        }
        bundle.putStringArrayList ("stringList", stringList);
        bundle.putCharSequence ("CharSequence","CharSequence");
        bundle.putIntegerArrayList ("intList",integers);
        bundle.putParcelableArrayList ("parcelableImpArrayList",parcelableImpArrayList);
        bundle.putCharSequenceArrayList ("charSequenceArrayList",charSequenceArrayList);
        bundle.putSerializable ("serializableImp",serializableImp);
        bundle.putParcelable ("Parcelable",parcelableImp);
        intent.putExtra ("Bundle",bundle);
        intent.putExtras (bundle);
        intent.putExtras (intent);

        startActivityForResult (intent,0);

我將接受到的數據一一打印出來,接下來是我接受數據的代碼:

        Intent intent = getIntent ();
        byte aByte = intent.getByteExtra ("byte", (byte) 0);
        LogUtils.i ("aByte"+aByte);
        short aShort = intent.getShortExtra ("short", (short) 0);
        LogUtils.i ("aShort"+aShort);
        int anInt = intent.getIntExtra ("int", 0);
        LogUtils.i ("anInt"+anInt);
        long aLong = intent.getLongExtra ("long", 0);
        LogUtils.i ("aLong"+aLong);
        float aFloat = intent.getFloatExtra ("float", 0);
        LogUtils.i ("aFloat"+aFloat);
        double aDouble = intent.getDoubleExtra ("double", 0);
        LogUtils.i ("aDouble"+aDouble);
        char charExtra = intent.getCharExtra ("char", 'a');
        LogUtils.i ("charExtra"+charExtra);
        boolean aBoolean = intent.getBooleanExtra ("boolean", false);
        LogUtils.i ("aBoolean"+aBoolean);
        String string = intent.getStringExtra ("string");
        LogUtils.i ("string"+string);
        SerializableImp serializableImp =
            (SerializableImp) intent.getSerializableExtra ("serializableImp");
        LogUtils.i ("serializableImp"+serializableImp);
        ParcelableImp parcelableImp = intent.getParcelableExtra ("Parcelable");
        LogUtils.i ("parcelableImp"+parcelableImp);
        byte[] byteArrays = intent.getByteArrayExtra ("byteArray");
        for(int i=0;i<byteArrays.length;i++){
            LogUtils.i ("byteArrays"+i+":"+byteArrays[i]);
        }
        short[] shortArrays = intent.getShortArrayExtra ("shortArray");
        for(int i=0;i<shortArrays.length;i++){
            LogUtils.i ("shortArrays"+i+":"+shortArrays[i]);
        }
        int[] intArrays = intent.getIntArrayExtra ("intArray");
        for(int i=0;i<intArrays.length;i++){
            LogUtils.i ("intArrays"+i+":"+intArrays[i]);
        }
        long[] longArrays = intent.getLongArrayExtra ("longArray");
        for(int i=0;i<longArrays.length;i++){
            LogUtils.i ("longArrays"+i+":"+longArrays[i]);
        }
        boolean[] booleanArrays = intent.getBooleanArrayExtra ("booleanArray");
        for(int i=0;i<booleanArrays.length;i++){
            LogUtils.i ("booleanArrays"+i+":"+booleanArrays[i]);
        }
        char[] charArrays = intent.getCharArrayExtra ("charArray");
        for(int i=0;i<charArrays.length;i++){
            LogUtils.i ("charArrays"+i+":"+charArrays[i]);
        }
        float[] floatArrays = intent.getFloatArrayExtra ("floatArray");
        for(int i=0;i<floatArrays.length;i++){
            LogUtils.i ("floatArrays"+i+":"+floatArrays[i]);
        }
        double[] doubleArrays = intent.getDoubleArrayExtra ("doubleArray");
        for(int i=0;i<doubleArrays.length;i++){
            LogUtils.i ("doubleArrays"+i+":"+doubleArrays[i]);
        }
        CharSequence[] charSequences = intent.getCharSequenceArrayExtra ("charSequences");
        for(int i=0;i<charSequences.length;i++){
            LogUtils.i ("charSequences"+i+":"+charSequences[i]);
        }
        ArrayList<Integer> integerArrayListExtra = intent.getIntegerArrayListExtra ("intList");
        for(int i=0;i<integerArrayListExtra.size ();i++){
            LogUtils.i ("integerArrayListExtra"+i+":"+integerArrayListExtra.get (i));
        }
        ArrayList<CharSequence> charSequenceArrayList =
            intent.getCharSequenceArrayListExtra ("charSequenceArrayList");
        for(int i=0;i<charSequenceArrayList.size ();i++){
            LogUtils.i ("charSequenceArrayList"+i+":"+charSequenceArrayList.get (i));
        }

        ArrayList<Parcelable> parcelableImpArrayList =
            intent.getParcelableArrayListExtra ("parcelableImpArrayList");
        for(int i=0;i<parcelableImpArrayList.size ();i++){
            LogUtils.i ("parcelableImpArrayList"+i+":"+parcelableImpArrayList.get (i));
        }
        ArrayList<String> stringArrayList = intent.getStringArrayListExtra ("stringArrayList");
        for(int i=0;i<stringArrayList.size ();i++){
            LogUtils.i ("stringArrayList"+i+":"+stringArrayList.get (i));
        }

        Bundle bundle = intent.getBundleExtra ("Bundle");
        LogUtils.i ("bundle:"+bundle.toString ());
        byte aByte2 = bundle.getByte ("byte");
        LogUtils.i ("aByte2"+aByte2);

        Bundle extras = intent.getExtras ();
        LogUtils.i ("extras:"+extras);
        byte aByte1 = extras.getByte ("byte");
        LogUtils.i ("aByte1"+aByte1);

最後是程序的部分運行結果,可以看到,傳遞過來的數據準確的打印了出來:
這裏寫圖片描述

從當前的Activity傳遞數據給上一個Activity

具體的意思是,關閉當前的Activity時,將當前的頁面的數據傳遞給下一個要顯示的Activity。具體的方法就是:在調用finish方法之前,要執行以下程序,創建一個Intent對象,在該對象裏使用putExtra方法保存數據,接着調用setResult(int resultCode,Intent intent)方法,代碼如下:

        Intent intent = new Intent ();
        intent.putExtra ("Result","result data");
        setResult (RESULT_CODE,intent);
        finish ();

這裏我只是簡單的傳遞了一個字符串,其它數據類型的傳遞方式與上面傳遞的方式一樣。當我們關閉當前Activity之後,界面會顯示另一個Activity,在這個Activity中,複寫它的onActivityResult(int requestCode,int resultCode,Intent data)方法,可以通過第二個參數resultCode來判斷是從哪個界面傳遞過來的數據,第三個參數則是攜帶數據的Intent對象,至於第一個參數,它是請求碼,用於判斷是哪個按鈕啓動的下一個Activity,這裏就不着重講解。下面看一下重寫的該方法的代碼:

    @Override protected void onActivityResult (int requestCode, int resultCode, Intent data) {
        LogUtils.i ("resultCode:"+resultCode);
        if(resultCode == OtherActivity.RESULT_CODE){
            String result = data.getStringExtra ("Result");
            LogUtils.i ("result:"+result);
        }
        super.onActivityResult (requestCode, resultCode, data);
    }

同樣我將傳遞過來的數據打印了出來,以便驗證是不是我要傳過來的數據:
這裏寫圖片描述
這裏需要注意的是:當從當前的Activity傳遞數據給上一個Activity時,啓動Activity時,必須使用startActiviytForResult()方法,否則當finish第二個Activity時,第一個Activity不會回調onActivityResult方法。

總結:

綜上所述,我認爲Activity間傳遞數據,有以下幾點需要注意:
1.傳遞的方式是通過Intent對象的putExtra()方法,將數據保存起來,到下一個Activity時,然後通過getXXX方法獲取出來;
2.可以傳遞的內容有:八種基本數據類型、八種基本數據類型的數組、Integer對象的集合、實現Serializable接口的類對象、實現Serializable接口的類對象的集合、字符串、字符串數組、字符串集合、接口CharSequence,接口CharSequence數組、接口CharSequence集合、實現Parcelable接口的類對象、實現Parcelable接口的類對象的數組,實現Parcelable接口的類對象的ArrayList集合、Bundle對象。
3. 通過翻看源碼可以發現,其它傳遞數據的方式,都是使用Bundle對象傳遞的,Intent類只是將它進行了封裝。
4. 從當前的Activity傳遞數據給下一個Activity與從當前的Activity傳遞數據給上一個Activity的區別就是,第一種哪種方式啓動Activity都可以,第二種啓動Activity時,必須使用startActiviytForResult()方法,才能獲取到傳遞的數據。
5. 如有補充,謝謝留言。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章