1. 程式人生 > >Activity之間進行傳值的方式以及Activity的回傳值(補充版)

Activity之間進行傳值的方式以及Activity的回傳值(補充版)

1、使用Intent進行Activity傳值

1)使用setClass方法來制定我們要跳轉的Activity
Intent intent=new Intent(this,SecondActivity.class);
intent.putExtra(key,value);
startActivity(intent);
//或者
Intent intent=new Intent();
intent.setClass(MainActivity.this,SecondActivity.class);
intent.putExtra(key,value);
startActivity(intent);
2)使用setAction方法來完成跳轉Activity
Intent  intent = new Intent();
intent.setAction("com.example.android_intent.second");
intent.putExtra(key,value);
startActivity(intent);
 
注意必須在mainfest.xml檔案中的SecondActivity中設定action

<activity 
            android:name="com.example.activitytest.SecondActivity"
            android:label="SecondActivity">
            <intent-filter>
                <action android:name="com.example.android_intent.second"/>
                <category android:name="android.intent.category.DEFAULT"/>//切記是default
            </intent-filter>
</activity>

2、使用本地儲存SharedPreferences、SQLite、Content Provider和File進行Activity傳值

3、使用回撥CallBack

4、使用EventBus

5、使用startActivityForResult()、onActivityResult()、setResult()方法進行傳遞和返回值

一、A Activity-->B Activity=======>返回值給A Activity
1)在第一個Activity中使用startActivityForResult()方法進行跳轉,使用onActivityResult()進行接收
private int REQUEST_GET_NAME=0;
@Override
    public void onClick(View view) {
//        Intent intent=new Intent();
//        intent.setClass(MainActivity.this,SecondActivity.class);
//        startActivity(intent);
        Intent intent=new Intent(this,SecondActivity.class);
        //第一個引數是Intent物件,
        //第二個requestCode指定我們的一個啟動標誌值,因為我們可能有多個按鈕,如果都是跳轉到同一個 
        //Activity物件上,
        //我們需要對其進行標誌,才知道是哪個Activity物件跳轉過來的。
        startActivityForResult(intent,REQUEST_GET_NAME);
-----------------------------------------------------------------------------------------
 /**
     * 所有的Activity物件的返回值都是由這個方法來接收
     * requestCode    If >= 0, this code will be returned in onActivityResult() when the activity exits.
     * @param requestCode 表示的是啟動一個Activity時傳過去的requestCode值
     * @param resultCode 表示的是啟動後的Activity回傳值時的resultCode值
     * @param data 表示的是啟動後的Activity回傳過來的Intent物件
     */
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
            if(requestCode==REQUEST_GET_TIME&&resultCode==RESULT_OK){
                textView.setText(data.getStringExtra("name"));
            }
    }
2)在第二個頁面中使用setResult()方法

 Intent intent=new Intent();
        intent.putExtra("name",""小明);
        setResult(RESULT_OK,intent);
        this.finish();
二、A Activity頁面中多個點選事件跳轉各個Activity,並相應給A Activity返回資訊
1)、A Activity多個點選事件跳轉對應的頁面
private static final int REQUEST_GET_SEX = 1;
private static final int REQUEST_GET_NAME = 2;

binding.tvSecond.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(context, SecondActivity.class);//第二個頁面
                startActivityForResult(intent, REQUEST_GET_SEX);
            }
        });
        binding.tvThree.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this, ThreeActivity.class);//第三個頁面
                startActivityForResult(intent, REQUEST_GET_NAME);
//                startActivity(intent);
            }
        });

2)接收返回值得方法
 @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        switch (requestCode) {
            case 1:
                if (resultCode == 1) {
                    Toast.makeText(context, "性別::" + data.getStringExtra("sex"), Toast.LENGTH_SHORT).show();
                }
                break;
            case 2:
                if (resultCode == RESULT_OK) {
                    Toast.makeText(context, "姓名::" + data.getStringExtra("name"), Toast.LENGTH_SHORT).show();
                }
                break;

        }

    }


3)對應各個頁面的方法
 binding.sex.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(SecondActivity.this, MainActivity.class);
                intent.putExtra("sex", "男");
                setResult(1, intent);
                finish();
            }
        });

 binding.back.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(ThreeActivity.this, MainActivity.class);
                intent.putExtra("name", "麻子");
                setResult(RESULT_OK, intent);//使用系統自帶或者自定義resultCode都行
                finish();
            }
        });