Andoid Intent學習之在各個活動之間傳遞數據


       Intent是一種運行時綁定(run-time binding)機制,它能在程序運行過程中連接兩個不同的組件。通過Intent,你的程序可以向Android表達某種請求或者意願,Android會根據意願的內容選擇適當的組件來完成請求。

1、使用Intent向下一個活動傳遞數據

  1. 在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的值來判斷處理結果是否成功。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM