Android #2 - Tìm hiểu Intent trong Android

bài viết trước, chúng ta đã tìm hiểu sơ lược về Shared Preferences.
Hôm nay, chúng ta sẽ tìm hiểu về Intent - Một trong những chức năng quan trọng của Android.



Bạn hãy tưởng tượng bạn đang có ý định "xơi" một chiếc pizza tại một cửa hàng trong thành phố, cửa hàng đó hỗ trợ khách hàng các phương thức đặt hàng thông qua số điện thoại, hoặc đặt hàng online, hoặc order tại chỗ, nhưng vấn đề là bạn quá lười nên bạn chọn đặt hàng online qua mạng. Sau khi đặt hàng, cửa hàng pizza sẽ xác nhận đơn hàng của bạn và trả về thông tin đặt hàng và thời gian dự kiến giao hàng.

Intent cũng có cách thức hoạt động tương tự như vậy, nó có thể gửi đi một luồng thông tin yêu cầu một hành động bên ngoài ứng dụng, và có thể trả kết quả về hành động đó cho ứng dụng xử lý.
Ví dụ, bạn muốn gửi đi một email cho một người bạn, nhưng đáng tiếc là ứng dụng của bạn chỉ có chức năng soạn email mà thôi. Do đó bạn chọn sử dụng một ứng dụng bên ngoài có khả năng gửi mail (Gmail chẳng hạn) để thực hiện hành động của mình. Khi đó Intent sẽ giúp chúng ta liên kết ứng dụng và Gmail, sau đó Gmail sẽ trả về một thông tin và ứng dụng của bạn có thể dựa trên thông tin này mà xử lý tiếp.

Intent thường sử dụng để khởi chạy một Activity trong ứng dụng

Điều cơ bản nhất chúng ta biết về Intent là nó được sử dụng để khởi chạy một Actvitiy khác trong ứng dụng chỉ với cú pháp đơn giản:
Intent secondActivity = new Intent(this, SecondActivity.class);
startActivity(secondActivity);
hoặc gọn hơn:
startActivity(new Intent(this, SecondActivity.class));
Nhưng Intent không đơn giản như vậy, bạn có thể "đính kèm" dữ liệu vào trong Intent bằng 2 cách thức:

Cách truyền thống

Bạn có thể gắn dữ liệu vào trực tiếp cho Intent bằng các phương thức putExtra():
Intent intent = new Intent(this, SecondActivity.class); // khởi tạo một Intent
intent.putExtra(<Key>, <Value>); // truyền dữ liệu vào Intent
startActivity(intent); // khởi chạy Activity

Sử dụng Bundle để đóng gói dữ liệu

Sử dụng Bundle nhìn chung sẽ gọn gàng hơn cách truyền trực tiếp, bằng cách truyền hết những dữ liệu vào một gói Bundle, rồi truyền Bundle này vào intent:
Intent intent = new Intent(this, SecondActivity.class);
Bundle bundle = new Bundle();
intent.putExtra(<Key>, bundle);
startActivity(intent);

Explicit intents và Implicit intents

Explicit Intents

Explicit Intents (Ý định rõ ràng) nghĩa là chúng ta đã xác định rõ các thành phần cụ thể tham gia hành động. Chẳng hạn trong ví dụ khởi chạy một Activity phía bên trên là một ví dụ điển hình của Explicit Intents.

Implicit Intents

Khi chúng ta tạo một Implicit intents, hệ thống Android sẽ tiến hành tìm kiếm tất cả những thành phần tương xứng với nội dung của hành động bằng cách so sánh nội dung đó với intent filters đã được xác định trong file manifest của những ứng dụng khác. Nếu chỉ có một ứng dụng có thể thực hiện được hành động đó, Android sẽ tự động thực hiện luôn mà không cần hỏi. Còn nếu có nhiều ứng dụng có thể thực hiện hành động đó, Android sẽ hỏi ý kiến của bạn trước khi thực hiện.

Lấy ví dụ điển hình trên hệ điều hành Windows, khi bạn mở một file .txt, bạn có thể mở nó bằng nhiều ứng dụng khác nhau như Notepad, Notepad++, Sublime Text,... Nếu như bạn chưa cài đặt ứng dụng mặc định để chạy loại file này, Windows cũng sẽ hỏi bạn chọn ứng dụng trước khi thực hiện hành động. Điều này cũng tương tự như trong Android.

Đây là ví dụ về Implicit Intents thực hiện hành động mở một trang web:
Intent implicit_intent = new Intent(Intent.ACTION_VIEW);
implicit_intent.setData(Uri.parse("https://www.duongtech.com/"));
startActivity(implicit_intent);

Nhận dữ liệu từ intent

Như ở phần đầu tiên chúng ta đã nói, khi chúng ta "đính kèm" dữ liệu vào trong intent thông qua một Key, chúng ta sẽ sử dụng key này để lấy dữ liệu ra từ Activity mới được mở.
// MainActivity.class
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
intent.putExtra("myInteger", 19);
startActivity(intent);
// -----------------------------------------------------------------------------
// SecondActivity.class
Intent intent = getIntent();
int myInt = intent.getIntExtra("myInteger", 0);

Tương tự với Bundle:
// MainActivity.class
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
Bundle bundle = new Bundle();
bundle.putInt("myInteger", 19);
intent.putExtras(bundle);
startActivity(intent);
// -----------------------------------------------------------------------------
// SecondActivity.class
Intent intent = getIntent();
int myInt = intent.getExtras().getInt("myInteger");
Phân biệt putExtras()putExtra()
  • putExtras() có một điểm lợi đó chính là truyền dữ liệu không cần Key như cách ở trên, nhưng phương thức này chỉ có thể truyền một intent hoặc một Bundle
  • putExtra() có thể truyền nhiều kiểu đối tượng dữ liệu (có thể truyền nhiều Bundle) nhưng cần Key để phân biệt các đối tượng.

Lắng nghe kết quả trả về từ Activity

Như mình đã lấy ví dụ bạn đầu về việc đặt hàng bánh pizza, sau khi đặt hàng, ta sẽ đợi phản hồi từ cửa hàng để biết xem đơn hàng của bạn đã được xác nhận chưa.

Tương tự, Intent cũng sẽ hỗ trợ bạn lắng nghe kết quả trả về sau khi thực hiện hành động thông qua phương thức startActivityForResult(Intent intent, int requestCode).

requestCode là gì và tại sao nó lại xuất hiện ở đây?! requestCode này rất quan trọng, nó sẽ giúp ta phân biệt với những hành động khác cùng được gửi đến một Activity, khi đó sẽ dễ dàng quản lý được các hành động khi nhận kết quả về.
// MainActivity.class
final int REQUEST_CODE = 9;
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
intent.putExtra("string1", "DuongTech");
intent.putExtra("string2", "https://www.duongtech.com/");

startActivityForResult(intent, REQUEST_CODE);

requestCode là mã số khi chúng ta gửi hành động đi, vậy để phân biệt kết quả trả về, Intent sẽ cung cấp thêm một loại mã số mới gọi là resultCode. Thường thì resultCode sẽ được thiết lập sau khi chúng ta kết thúc Activity hoặc kết thúc hành động thông qua nút Back. Khi nút Back được nhấn, phương thức finish() sẽ được gọi, khi đó chúng ta sẽ thiết lập resultCode ở đây.
@Override
public void finish() {
        final int RESULT_CODE = 999;
        
        // Chuẩn bị dữ liệu trả về
        Intent intent = new Intent();
        intent.putExtra("result_string1", "Chia sẻ thủ thuật lập trình");
        intent.putExtra("result_string2", "Machine Learning, Android");

        setResult(RESULT_CODE, intent);
        super.finish();
}
Đã truyền đi, đã trả về, bây giờ chúng ta chỉ việc nhận kết quả đó trong phương thức onActivityResult():
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        if (requestCode == 9 && resultCode == 999 && data != null){
            String result1 = data.getStringExtra("result_string1");
            String result2 = data.getStringExtra("result_string2");
        }
}

Ở bài viết sau, chúng ta sẽ tiếp tục tìm hiểu một khía cạnh khác của Activity, đó là dòng đời của Activity (Activity life-cycle).

Tìm hiểu thêm

Android #2 - Tìm hiểu Intent trong Android Android #2 - Tìm hiểu Intent trong Android Reviewed by Duong-Tran Thanh on 9/02/2019 09:11:00 CH Rating: 5

Không có bình luận nào!

Được tạo bởi Blogger.
BACK TO TOP