簡體   English   中英

你如何在 Android 的活動之間來回傳遞數據?

[英]How do you pass data back and forth between activities in Android?

我有兩個活動應該使用意圖來回傳遞數據。 我不確定在哪里放置一些看跌期權。

對於 Activity1 (MainActivity),我有一個按鈕,按下它會創建一個意圖,然后將其放入 Activity2,然后使用 startActivity(intent) 啟動它。

btn.setOnClickListener((v) -> {
    Intent intent = new Intent(this, Activity2.class);
    intent.putExtra("test", testClass);
    startActivity(intent);
});

然后在 Activity2 中,我使用 getIntent 在 onCreate() 函數中獲取該信息。

現在我想要做的是在 Activity2 中有一個按鈕,它將數據傳遞給 Activity1,但不一定“啟動/顯示”活動。

所以我想知道如何做到這一點。

我的想法是具有與以前類似的以下內容:

活動2:

btn.setOnClickListener((v) -> {
    Intent intent = new Intent(this, MainActivity.class);
    intent.putExtra("info", info);
});

但我對兩件事感到困惑

  1. 我可以在不立即開始活動的情況下執行此操作嗎
  2. 我在哪里可以在 MainActivity 中調用 getIntent 來檢索這些數據

您可以使用startActivityForResult來啟動Activity2並接收返回給Activity1的結果

活動一

int LAUNCH_ACTIVITY_TWO = 1;
Intent i = new Intent(this, Activity2.class);
i.putExtra("test", testClass);
startActivityForResult(i, LAUNCH_ACTIVITY_TWO);

//onActivityResult
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == LAUNCH_ACTIVITY_TWO) {
        if(resultCode == Activity.RESULT_OK){
            String result=data.getStringExtra("result");
        }
    }
}

活動二

Intent returnIntent = new Intent();
returnIntent.putExtra("result", result);
setResult(Activity.RESULT_OK, returnIntent);
finish();

完整活動 1 代碼:

 public class MainActivity extends AppCompatActivity {
    public static int LAUNCH_ACTIVITY_TWO = 1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button btn = (Button) findViewById(R.id.btn);

        btn.setOnClickListener((v) -> {
            Intent i = new Intent(this, Activity2.class);
            i.putExtra("test", testClass);
            startActivityForResult(i, LAUNCH_ACTIVITY_TWO);
        });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (requestCode == LAUNCH_ACTIVITY_TWO) {
            if(resultCode == Activity.RESULT_OK){
                String result= data.getStringExtra("result");
            }
        }
    }
}

完整活動 2 代碼:

public class Activity2 extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        if(getIntent().getExtras() != null) {
            // Get intent extras from Activity 1
        }
        
        Button btn = (Button) findViewById(R.id.btn);

        btn.setOnClickListener((v) -> {
            Intent returnIntent = new Intent();
            returnIntent.putExtra("result", result);
            setResult(Activity.RESULT_OK, returnIntent);
            finish();
        });
    }
}

例如,您可以在活動 2 中創建一個列表,向其中添加要傳遞給活動 1 的數據。 在開始 activity1 之前,您從數組中取出值並將它們作為附加值添加到輸入中。 您可以將數據添加到 JSONObject 並使用序列化程序,這樣您就不必自己添加所有項目。

如果您想在不啟動的情況下將數據傳遞給活動 1,那么活動 1 處理數據,這是不可能的。 當您處於活動 2 中時,活動不會執行任何操作,對於這種情況,您使用片段。

如果您使用片段,您可以將所有數據放在綁定到活動而不是每個片段的視圖模型中。

有幾種方法可以實現這一點,具體取決於您正在查看傳遞的數據類型。

如果它是一個完整的類對象,那么使類可解析。 您可以將課程復制並粘貼到此網站http://www.parcelabler.com/ 中,它會自動為您設置格式。 你所做的就是將它作為一個額外的意圖傳遞。

如果您正在查看需要對其執行操作然后傳遞給另一個活動的數據,我建議使用和意圖服務。 您可以在等待服務中收到的意圖之前執行某些操作。

如果您希望僅在應用程序中發生 XYZ 后執行某些操作,則使用共享首選項。 這些可以很容易地在任何地方訪問。

最后,如果您持續使用需要保持持久性的批量數據,請使用本地數據庫存儲並在需要時進行查詢。

您可以為此使用SharedPreferences或靜態變量/字段。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM