Bài 16: Intent trong Android - Lập trình Android cơ bản

Đăng bởi: Admin | Lượt xem: 6217 | Chuyên mục: Android


1. Intent là gì ?

Intents là một thành phần quan trọng trong Android như trong bào 3 chúng ta đã tìm hiểu. Nó cho phép các thành phần ứng dụng có thể yêu cầu các hàm từ các thành phần ứng dụng Android khác. Ví dụ một Activity có thể chạy một Activity khác ở bên ngoài để chụp ảnh.
Intents là một objects của android.content.Intent. Intents sẽ được gửi đến hệ thống Android để xác định hành động bạn muốn thực hiện, đối tượng bạn muốn xử lý.
Intents có thể bao gồm dữ liệu thông qua Bundle. Bundle giống như một cái hộp. Bên nhận sẽ mở bundle ra nhờ key và lấy ra dữ liệu.
1.1 Các loại Intent
Intent có 2 loại chính là Explicit Intent và Implicit Intent:
Implicit Intent : là loại intents ẩn chỉ rõ hành động cần được thực hiện và dữ liệu cho hành động. Nếu một intents ẩn được gửi đến hệ thống android, nó sẽ tìm kiếm tất cả các thành phần đã được đăng ký cho các hành động cụ thể (thành phần dùng để start cái hành động đó) và kiểu dữ liệu phù hợp. Nếu chỉ có một thành phần được tìm thấy, hệ thống android sẽ start thành phần này ngay lập tức. Nếu có một vài thành phần được tìm thấy. Người dùng sẽ nhận được hộp thoại lựa chọn và phải quyết đinh thành phần nào được sử dụng cho intents.
Ví dụ : đoạn code dưới đây sẽ yêu cầu hệ thống android để xem một trang web.Tất cả các trình duyệt web phải được đăng ký tương ứng vào dữ liệu intent thông qua bộ lọc intent
Intent intent2 = new Intent(Intent.ACTION_VIEW, Uri.parse("https://vncoder.vn/"));
                startActivity(intent2);
Các loại action:
Là một chuỗi xác định hành động chung để thực hiện (chẳng hạn như xem hoặc chọn) Dưới đây là 2 action phổ biến để start một activity:
  1. ACTION_VIEW: như tên gọi của nó activity gửi intent với một action là ACTION_VIEW có nghĩa activity tương thích với intent này đang có thông tin để hiển thị cho người dùng như xem ảnh trong ứng dụng gallery hay xem địa chỉ trong google map (hay hiểu đơn giản Activity A đang muốn xem thông tin đc hiển thị ở Activity B).
  2. ACTION_SEND: Còn được gọi là Intent chia sẻ. sử dụng action này trong trường hợp bạn có một số dữ liệu mà người dùng có thể chia sẻ thông qua một ứng dụng khác (chẳng hạn như facebook, email, các ứng dụng mạng xã hội).
  3. Ngoài ra còn có rất nhiều các action có sẵn như trên bạn có thể chỉ định action cho một intent với setAction hoặc hàm tạo Intent:
Nếu bạn xác định action của riêng mình, hãy đảm bảo bao gồm tên gói của ứng dụng làm tiền tố.
Ví dụ :
static final String ACTION_TIMETRAVEL = "com.example.action.TIMETRAVEL";
Explicit intents : dịch word by word thì có nghĩa là intent rõ ràng. Các bạn hiểu đơn giản explicit intents xác định rõ, cụ thể các thành phần tham gia hành động (giống như ví dụ phần 2, nó chỉ rõ intent này dùng để start ActivityTow.class) hoặc hỏi hệ thống Android để ước lượng, đánh giá các thành phần đã được đăng ký trên dữ liệu của intent.
Explicit intents xác định một cách rõ ràng các thành phần sẽ được gọi bởi hệ thống Android. Ví dụ dưới đây sẽ cho bạn biết làm thế nào để khởi tạo một intents rõ ràng và gửi nó đến hệ thống Android để chạy một Activity.

2. Truyền dữ liệu bằng Intent

2.1 Chia sẻ dữ liệu bằng intent

Gửi dữ liệu sử dụng explicit intent
Để truyền dữ liệu cho intent, ta dùng phương thức putExtra().
Extra là một cặp key/value. Key luôn luôn là kiểu string. Value bạn có thể sử dụng kiểu dữ liệu nguyên thủy hoặc đối tượng của String, Bundle,…
Thành phần tiếp nhận có thể lấy lại được đối tượng intent thông qua hàm getIntent(). Để lấy ra được dữ liệu, tùy thuộc vào kiểu dữ liệu chúng ta truyền đi, sử dụng các phương thức getStringExtra(), getIntExtra().
ví dụ :
public void sendByExtra(){
        Intent intent = new Intent(ActivityA.this,ActivityB.class);
        intent.putExtra(TITLE,edtTitle.getText().toString());
        intent.putExtra(DESCRIPTION,edtDescription.getText().toString());
        startActivity(intent);
    }
Hoặc sử dụng đối tượng Bundle. Đóng gói tất cả dữ liệu vào trong Bundle, sau đó chèn bundle vào intent bằng method putExtras().
Ví dụ :
public void sendByBundle(){
        Intent intent = new Intent(ActivityA.this,ActivityB.class);
        Bundle bundle = new Bundle();
        bundle.putString(TITLE,edtTitle.getText().toString());
        bundle.putString(DESCRIPTION,edtDescription.getText().toString());
        intent.putExtras(bundle); 
        //intent.putExtra(BUNDLE,bundle);(hoặc) 
        startActivity(intent);
    }

2.2 Truyền dữ liệu sử dụng Implicit Intent

để gửi một implicit intent bạn cần set cho nó một số thuộc tính như setAction, setType, setData,…
Có rất nhiều ứng dụng android cho phép bạn chia sẻ dữ liệu với những người khác như facebook, G+, Gmail… Bạn có thể gửi dữ liệu tới một vài thành phần nào đó.
Ví dụ :
Intent intent = new Intent(Intent.ACTION_SEND); 
intent.setType("text/plain");
intent.putExtra(android.content.Intent.EXTRA_TEXT,"News for you!"); 
startActivity(intent);

3. Intent Result (lấy lại kết quả từ activity)

Một activity có thể được đóng lại thông qua button back trên điện thoại.
Trong trường hợp đó, hàm finish() sẽ được thực thi. Nếu activity đã được khởi chạy cùng với hàm startActivity(intent), người gọi không cần thiết phải có kết quả hoặc phản hồi từ activity mà có thể close ngay lập tức.
Nếu bạn start một activity cùng với hàm startActivityForResult(), như vậy là bạn mong muốn có phản hồi từ sub-activity.
Khi một sub-activity kết thúc, hàm onActivityResult() trên activity cha sẽ được gọi và bạn có thể thực hiện hành động dựa trên kết quả.
public void onClick(View view) {
            Intent i = new Intent(this,ActivityTow.class);
            i.putExtra("value1","This value one for activityTow");
            i.putExtra("Value2", "This value two ActivityTwo");
                    // set the request code to any code you like,
                    // you can identify the callback via this code
                    startActivityForResult(i, REQUEST_CODE);
        }
Nếu bạn sử dụng hàm startActivityForResult(), thì sau khi start activity sẽ gọi đến sub-activity. Khi hàm sub-activity kết thúc, nó sẽ gửi dữ liệu đến activity cha đã gọi nó thông qua intent.
Điều này được xử lý trên hàm finish(). Hoặc bạn có thể setResult ngay trên call back onCreate() sau đó kết thúc sub-actitvity bằng finish()
@Override
        public void finish() {
            // Prepare data intent
            Intent data = new Intent();
            data.putExtra("returnKey1", "Swinging on a star. ");
            data.putExtra("returnKey2", "You could be better then you are. ");
            // Activity finished ok, return the data
            setResult(RESULT_OK, data);
            super.finish();
        }
Một sub-activity kết thúc, hàm onActivityResult() trong activity cha sẽ được gọi:
@Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            if (resultCode == RESULT_OK && requestCode == REQUEST_CODE) {
                if (data.hasExtra("returnKey1")) {
                    Toast.makeText(this, data.getExtras().getString("returnKey1"),
                    Toast.LENGTH_SHORT).show();
                }
            }
        }
Bài viết tham khảo tài liệu : https://topdev.vn/blog/intent-trong-android-la-gi/
Bài tiếp theo: Lưu trữ dữ liệu trong Android >>
vncoder logo

Theo dõi VnCoder trên Facebook, để cập nhật những bài viết, tin tức và khoá học mới nhất!