Truyền dữ liệu giữa các Activity trong android

4.5/5 - (8 votes)

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:

1 Comment

Thảo luận

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Xem thêm
Đi nhanh qua Process và thành phần App Mặc định các…
 
 
 
 
Facetime iPhone

Main Menu