1. 程式人生 > >Android-Intent與Bundle在傳值上的區別

Android-Intent與Bundle在傳值上的區別

Intent與Bundle在activity之間傳值的區別

Intent的putExtra()方法有:

    public Intent putExtra(String name, boolean value);
    public Intent putExtra(String name, byte value);
    public Intent putExtra(String name, char value);
    public Intent putExtra(String name, short value);
    public Intent putExtra(String name, int value);
    public Intent putExtra(String name, long value);
    public Intent putExtra(String name, float value);
    public Intent putExtra(String name, double value);
    public Intent putExtra(String name, String value);
    public Intent putExtra(String name, CharSequence value);
    public Intent putExtra(String name, Parcelable value);
    public Intent putExtra(String name, Parcelable[] value);
    ...</span>

檢視putExtra()方法中的原始碼,方法裡面還是使用了Bundle物件,mExtras變數是在Intent類中定義的;Intent內部還是用bundle來實現資料傳遞的,只是在外面封裝了一層。
    public Intent putExtra(String name, String value) {
        if (mExtras == null) {
            mExtras = new Bundle();
        }
        mExtras.putString(name, value);
        return this;
    }</span>

Bundle類的作用

  Bundle類用作攜帶資料,它類似於Map,用於存放key-value名值對形式的值。相對於Map,它提供了各種常用型別的putXxx()/getXxx()方法,如:putString()/getString()和putInt()/getInt(),putXxx()用於往Bundle物件放入資料,getXxx()方法用於從Bundle物件裡獲取資料。

Bundle的內部實際上是使用了HashMap<String, Object>型別的變數來存放putXxx()方法放入的值。簡單地說,Bundle就是一個封裝好的包,專門用於匯入Intent傳值的包。

    public void putBoolean(String key, boolean value);
    public void putByte(String key, byte value);
    public void putChar(String key, char value);
    ...
Intent在傳值時沒有Bundle的情況:

傳送資料的Activity

	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		editText = (EditText) findViewById(R.id.edit);
		button = (Button) findViewById(R.id.button1);
		String txt = editText.getText().toString();
		button.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				String string = editText.getText().toString();
				Intent intent = new Intent(MainActivity.this, main.class);
				intent.putExtra("name", string);
				startActivity(intent);
			}
		});
	}

接收資料的Activity
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		textView = (TextView) findViewById(R.id.txt2);
		Intent intent = getIntent();
		String string = intent.getStringExtra("name");
		textView.setText(string);
	}

使用Bundle 進行傳值:

傳送資料的Activity

	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		editText = (EditText) findViewById(R.id.edit);
		button = (Button) findViewById(R.id.button1);
		String txt = editText.getText().toString();
		button.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				String string = editText.getText().toString();
				Intent intent = new Intent(MainActivity.this, main.class);
				Bundle bundle = new Bundle();
				bundle.putString("name", string);
				intent.putExtras(bundle);
				startActivity(intent);
			}
		});
	}

接收方的Activity
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		textView = (TextView) findViewById(R.id.txt2);
		Intent intent = getIntent();
		Bundle bundle = intent.getExtras();
		String string = bundle.getString("name");
		textView.setText(string);
	}

Bundle在存取資料是比較靈活的,而Intent在存取資料的種類很少且沒有指定資料型別;

想對資料進行比較靈活的操作如批量操作的話就用bundle;
Bundle是可以對物件進行操作的,而Intent不可以。Bundle相對於Intent比較偏下層,比Intent介面更多,更靈活,但Bundle仍需要藉助Intent才能在Activity之間傳遞。

概括一下,Intent旨在資料傳遞,bundle旨在存取資料,當然intent也提供一部分資料的存取,但比起bundle就顯得很不靈活。