![](/img/trans.png)
[英]Best practice for switching back and forth between two android activities
[英]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);
});
但我對兩件事感到困惑
您可以使用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.