Intent是一種運行時綁定(run-time binding)機制,它能在程序運行過程中連接兩個不同的組件。通過Intent,你的程序可以向Android表達某種請求或者意願,Android會根據意願的內容選擇適當的組件來完成請求。
1、使用Intent向下一個活動傳遞數據
- 在activity_main.xml中添加一個Button
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <Button android:id="@+id/btn1" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/btn1" /> </LinearLayout>
2.在MainActivity中為Button1寫監聽事件
(Button) findViewById(R.id.btn1).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { /* 利用Intent傳遞數據給下一個活動 */ String data = "Hello World !!!"; Intent intent = new Intent(); intent.setClass(MainActivity.this,SecondActivity.class); intent.putExtra("extra_data",data); startActivity(intent); });
3.新建一個SecondActivity,接收來自MainActivity的數據
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_second); /* 利用Intent傳遞數據給下一個活動 */ Intent intent = getIntent(); String data = intent.getStringExtra("extra_data"); Toast.makeText(SecondActivity.this,data,Toast.LENGTH_SHORT).show(); }
2、利用Intent返回數據給上一個活動
1.在SecondActivity添加一個Button2
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" android:orientation="vertical" tools:context="com.tony.intenttest.SecondActivity"> <Button android:id="@+id/btn2" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/btn2" /> </LinearLayout>
2.在MainActivity中為Button1寫監聽事件
public class MainActivity extends Activity { private Button btn1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_main); btn1 = (Button) findViewById(R.id.btn1); btn1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { /* 利用Intent返回數據給上一個活動 */ Intent intent = new Intent(MainActivity.this, SecondActivity.class); startActivityForResult(intent, 1); } }); }
說明:startActivityForResult()方法接收另個參數,第一個參數還是Intent,第二個參數是請求碼(請求碼只要是一個唯一值就行了),用於在之后的回調中判斷數據的來源。
3.在SecondActivity中為Button2注冊點擊事件
public class SecondActivity extends Activity { private Button btn2; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_second); /* 利用Intent返回數據給上一個活動 */ btn2 = (Button) findViewById(R.id.btn2); btn2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(); intent.putExtra("return_data","Hello MainActivity !!!"); setResult(RESULT_OK,intent); finish(); } }); } /* onBackPressed()方法是如果按返回鍵(Back鍵)則調用該方法 */ @Override public void onBackPressed(){ Intent intent = new Intent(); intent.putExtra("return_data","Hello MainActivity !!!"); setResult(RESULT_OK,intent); finish(); } }
說明:putExtra()方法接收兩個參數,第一個參數是鍵,用於后面從Intent中取值,第二個參數才是要傳遞的數據。
這里又構建了一個Intent,只不過這個Intent僅僅是用來傳遞數據而已,它沒有指定任何的“意圖”。緊接着把要傳遞的數據放在Intent中,調用setResult()方法。
setResult()方法接收兩個參數,第一個參數用於向上一個活動返回處理結果,一般只使用RESULT_OK和RESULT_CANCLED,第二個參數則是把帶有數據的Intent傳遞回去,然后調用finish()方法銷毀當前活動。
4.在MainActivity中接收數據,重寫onActivityResult()方法。
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { case 1: if (resultCode == RESULT_OK) { String returnedData = data.getStringExtra("return_data"); Log.d("tag", returnedData); } break; default: } }
說明:由於采用的是startActivityForResult()方法來啟動SecondActivity的,在SecondActivity被銷毀之后會回調上一個活動的onActivityResult()方法,因此,在MainActivity
中要重寫onActivityResult()方法。
onActivityResult()方法帶有三個參數,第一個參數requestCode,即我們在啟動活動是傳入的請求碼,第二個參數resultCode,即我們在返回數據時傳入的處理結果。第三個參數data,即攜帶者返回數據的Intent。
由於在一個活動中可能會調用startActivityForResult()方法去啟動很多不同的活動,每一個活動返回的數據都會回調到onActivityResult()這個方法中。因此,要通過檢查
requestCode的值來判斷數據來源,確定數據是從SecondActivity返回的之后,在通過resultCode的值來判斷處理結果是否成功。