Android之intent傳值的三種方法
Android之intent傳值的三種方法分別是:1、startActivity();2、startActivityForResult();3、調用在下個activity自訂的方法“actionStart()”,也就是最佳的方法。
一、一般方式傳值跳轉:startActivity()方法
/* 在MainActivity中定義如下代碼 */button1.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent _intent = new Intent(MainActivity.this,TwoActivity.class); //在Intent對象當中添加一個索引值對 _intent.putExtra(key,value); startActivity(_intent); }});
public class TwoActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.second_layout); Button button2 = (Button) findViewById(R.id.button_2); button2.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { //取得從上一個Activity當中傳遞過來的Intent對象 Intent _intent = getIntent(); //從Intent當中根據key取得value if (_intent != null) { String _value = _intent.getStringExtra(key); Toast.makeText(TwoActivity.this, _value, Toast.LENGTH_SHORT).show(); } } }); }}
二、回調資料式傳值跳轉:startActivityForResult()方法
/* 在MainActivity中定義如下代碼 */button1.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent _intent = new Intent(MainActivity.this,TwoActivity.class); _intent.putExtra(key, value); // 第二個參數是請求碼,只要是一個唯一值 startActivityForResult(_intent, 1234); }}); // 由於我們是使用startActivityForResult()方法來啟動TwoActivity的 // 在TwoActivity被銷毀之後會回調上一個活動的onActivityResult()方法 @Override protected void onActivityResult(int requestCode, int resultCode, Intent intent) { switch (requestCode) { case 1234: if (resultCode == RESULT_OK) { String returnedData = intent.getStringExtra(key1); Toast.makeText(MainActivity.this, returnedData, Toast.LENGTH_SHORT).show(); } break; default: } }
onActivityResult()方法帶有三個參數,第一個參數requestCode,即我們在啟動活動時傳入的請求碼。第二個參數resultCode,即我們在返回資料時傳入結果碼。第三個參數data,即攜帶著返回資料的Intent。由於在一個活動中有可能調用startActivityForResult()方法去啟動很多不同的活動,每一個活動返回的資料都會回調到onActivityResult()這個方法中,因此我們首先要做的就是通過檢查requestCode的值來判斷資料來源。確定資料是從TwoActivity返回的之後,我們再通過resultCode的值來判斷處理結果是否成功。最後從data中取值並列印出來,這樣就完成了向上一個活動返回資料的工作。
public class TwoActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.second_layout); Button button2 = (Button) findViewById(R.id.button_2); // 接收從MainaActivity傳遞的資料 Intent _intent = getIntent(); if (_intent != null) { String _value = _intent.getStringExtra(key); Toast.makeText(TwoActivity.this, _value, Toast.LENGTH_SHORT).show(); } button2.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(); intent.putExtra(key1,value two activity); // 專門用於向上一個活動返回資料 // 第一個參數用於向上一個活動返回結果碼,一般只使用RESULT_OK或RESULT_CANCELED這兩個值 // 第二個參數則是把帶有資料的Intent傳遞迴去 setResult(RESULT_OK, intent); // 調用了finish()方法來銷毀當前活動 finish(); } }); }}
三、啟動活動的最佳寫法
在真正的項目開發中經常會有對接的問題出現。比如TwoActivity並不是由你開發的,但現在你負責的部分需要有啟動TwoActivity這個功能,而你卻不清楚啟動這個活動需要傳遞哪些資料。這時無非就有兩種辦法,一個是你自己去閱讀TwoActivity中的代碼,二是詢問負責編寫TwoActivity的同事。你會不會覺得很麻煩呢?其實只需要換一種寫法,就可以輕鬆解決掉上面的窘境。
/* 在MainActivity中定義如下代碼 */button1.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { /*最佳資料傳值方法:調用在下個activity自訂的方法*/ TwoActivity.actionStart(MainActivity.this, data1, data2); }});
public class TwoActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.second_layout); } /*最佳資料傳值方法*/ public static void actionStart(Context context, String data1, String data2) { Intent intent = new Intent(context, TwoActivity.class); intent.putExtra(param1, data1); intent.putExtra(param2, data2); context.startActivity(intent); }}
實現後,所有TwoActivity中需要的資料都是通過actionStart()方法的參數傳遞過來的,然後把它們儲存到Intent中,最後調用startActivity()方法啟動TwoActivity。