Tóm tắt thật nhanh thật ngắn gọn và dễ hểu với ngữ cảnh như sau:
Activity chính có 2 nút, click nút nào thì sẽ mở ra 1 activity mới đó ra. Mỗi cái Activity mới có 1 cái EditText và 1 nút, click vào nút ấy sẽ truyền dữ liệu đã nhập vào EditText lại cho Activity chính.
Hết. chỉ đơn giản vậy thôi, và đây là code khi click vào nút ở Activity chính:
Button btn1 = (Button) findViewById(R.id.button1);
btn1.setOnClickListener(new View.OnClickListener() {
public void onClick(View arg0) {
Intent intent = new Intent(MainActivity.this, SubActivity1.class);
Bundle myBun = new Bundle();
myBun.putString("sub1", "Trinh Thanh Do 1");
intent.putExtra("bundle1", myBun);
startActivityForResult(intent, 1000);
}
});
Button btn2 = (Button) findViewById(R.id.button2);
btn2.setOnClickListener(new View.OnClickListener() {
public void onClick(View arg0) {
Intent intent = new Intent(MainActivity.this, SubActivity2.class);
Bundle myBun = new Bundle();
myBun.putString("sub2", "Trinh Thanh Do 2");
intent.putExtra("bundle2", myBun);
startActivityForResult(intent, 2000);
}
});
Ở đây bắt sự kện click và vất dữ liệu vào bundle sau đó dùng Intent chuyển sang Activity mới. Cái 1000 và 2000 là requestCode để dựa vào đó mà hàm onActivityResult mình biết được là kết quả do thằng Activity nào trả về.
Đây là hàm onActivityResult trong Activity chính:
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); switch (resultCode) { case Activity.RESULT_OK: // trường hợp thành công khi bên kia gọi setResult(Activity.RESULT_OK, intent); if (requestCode == 1000) { String myData = data.getStringExtra("TraveChoSub1"); Toast.makeText(this, myData, Toast.LENGTH_SHORT).show(); } if (requestCode == 2000) { String myData = data.getBundleExtra("bundle2").getString("TraveChoSub2"); Toast.makeText(this, myData, Toast.LENGTH_SHORT).show(); } break; case Activity.RESULT_CANCELED: // trường hợp thành công khi bên kia gọi setResult(Activity.RESULT_CANCELED, intent); hoặc ấn nút back. if (requestCode == 1000) { Toast.makeText(this, "RESULT_CANCELED 1000", Toast.LENGTH_SHORT).show(); } if (requestCode == 2000) { Toast.makeText(this, "RESULT_CANCELED 2000", Toast.LENGTH_SHORT).show(); } break; } }
Đây là code phần xử lý Activity 1 được mở:
final EditText editTxt = (EditText) findViewById(R.id.editText);
editTxt.setText(getIntent().getBundleExtra("bundle1").getString("sub1"));
Button btn = (Button) findViewById(R.id.btntrove);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
Intent intent = new Intent();
intent.putExtra("TraveChoSub1", editTxt.getText().toString());
setResult(Activity.RESULT_OK, intent);
finish();
}
});
Phần setResult ở hàm trên thì dùng resultCode của Activity khi muốn cancel không gửi dữ liệu gì thì set là cancel:
Intent returnIntent = new Intent(); setResult(Activity.RESULT_CANCELED, returnIntent); finish();
Ok, tiếp tục với phần bên trên, đây là code Activity thứ 2 khi được mở:
if (getIntent() != null) {
txtView.setText(getIntent().getBundleExtra("bundle2").getString("sub2"));
}
btnId.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
Bundle bundle = new Bundle();
bundle.putString("TraveChoSub2", editText.getText().toString());
intent.putExtra("bundle2", bundle);
setResult(Activity.RESULT_OK, intent);
finish();
}
});
Đọc thêm ở đây https://stackoverflow.com/questions/10407159/how-to-manage-startactivityforresult-on-android
Tóm tắt kiến thức về Activity
- Thông thường 1 App sẽ có 1 Module nhưng nếu app đặc biết có thể có nhiều Module (tức là có nhiều file AndroidManifest.xml và nhiều file app1/build.gradle, app2/build.gradle, app3/build.gradle).
- 1 TASK là 1 Stack mà Stack lại chứa nhiều Activity.
- Thông thường mỗi TASK là một ứng dụng (ấn nút xem các app đang chạy thực chất là đang xem các TASK – nút Overview Screen).
- STACK chứ nhiều Activity họ gọi là Back Stack, chúng ta có thể nói Back Stack của 1 TASK.
- Từ Activity A sang Activity B thì A sẽ dừng, nếu ở Activity B người dùng ấn nút Back thì Activity B sẽ bị huỷ và mở lại Activity A tại hàm onResume()
- Từ Activity A sang Activity B và user ấn nút HOME thì hệ thống duy trì trạng thái của cả 2 Activity A và Activity B, khi quay lại app thì hàm onResume() của Activity B sẽ chạy.
- Từ Activity A sang Activity B và tại Activity B này có thể tạo thêm 1 thể hiện khác Activity A. Lúc này sẽ có 3 Activity trong Stack.
- FLAG_ACTIVITY_CLEAR_TOP khi tạo 1 Activity với cờ này thì nó sẽ clear tất cả Activity ngáng đường nó. Clear từ top đến Activity đích.
- FLAG_ACTIVITY_SINGLE_TOP khi tạo một Activity mà dùng flag này nó sẽ không tạo mới nếu cái Activity đich đang ở Top của Stack (nhưng hàm onNewIntent của Activity đó sẽ được gọi). Nếu Activity đích không ở Top của Stack thì nó sẽ vẫn được tạo.
- Có thể dùng TaskStackBuilder để mở ra một Activity con khi mà Activity con này cần 1 Activity khác mở ra (hay gặp khi mở app từ Notification)
Ok vậy là cũng sơ sơ rồi, nếu chưa rõ bạn nên đọc thêm các blog khác xin cám ơn.
Đọc thêm về TASK:
https://developer.android.com/guide/components/activities/tasks-and-back-stack
https://medium.com/wiselteach/activity-back-stack-and-launch-mode-part-1-693130682120
Các bài viết không xem thì tiếc:
- Truyền dữ liệu giữa 2 fragment trong android
- Vòng đời Acivity trong android cơ bản
- Fragment và Activity trong android cơ bản
- Cách dùng Eventbus để truyền dữ liệu trong Android
- KHÔNG CÀI ĐƯỢC APP TRONG ANDROID
- Chuyển một đối tượng sang Json trong Android
- Tạo shortcut cho ứng dụng khi cài Android app programmatically
- Lập trình với Recyclerview trong Android – Bài 2 | dotrinh.com
- Cách dùng AsyncTask trong Android
- Lập trình phóng to thu nhỏ ảnh pinch in – pinch out trong Android
- Siêu tổng hợp android code snippets (cập nhật thường xuyên)
- Phóng to thu nhỏ trong Android với ScaleGestureDetector
- Lập trình với Recyclerview trong Android – Bài 1 | dotrinh.com
- Ý nghĩa của clipToPadding trong Android
- Gửi dữ liệu đến BLESerial3 bằng Bluetooth LE Android
1 Comment