Intent trong Android: Vai trò và cách sử dụng

791

Khi các bạn cần phải kết nối các thành phần ứng dụng Android thì đều phải sử dụng Intent. Vậy Intent là gì? Vai trò và cách sử dụng như thế nào trong ứng dụng Android.

Bài viết này mình  hướng dẫn các bạn tìm hiểu bản chất cũng như cách sử dụng Intent trong android để có thể gửi dữ liệu giữa các thành phần (Activity, Service…)

Trước khi vào bài viết mình chợt nghĩ đến ví dụ: Con người làm bất kể việc gì đều có mục đích cả. Từ xem TV, mua sắm, lập trình ứng dụng… đều có một số mục đích đằng sau nó.

Android hoạt động theo cách tương tự. Trước khi một ứng dụng có thể thực hiện một hành động nào đó (Thuật ngữ gọi là action), nó cần phải biết trước mục đích của các hành động đó, để có thể thực hiện các action đó đúng cách.

Hóa ra, con người và Android cũng không khác biệt chút nào, đúng không ^_^
Sau bài viết này, chúng ta sẽ biết được:

  • Intent là gì và vai trò của Intent trong Android như thế nào?
  • Có bao nhiêu loại intent?
  • Sử dụng Intent để gửi dữ liệu giữa các Activity
  • Sử dụng Parcelable và Serializable để Intent có thể truyền được dữ liệu là các đối tượng (Object)

Chúng ta bắt đầu nhé!

#1. Intent là gì? Vai trò của Intent trong Android như thế nào?

Intent là một khái niệm khá trừu tượng về công việc, chức năng có thể được thực hiện bởi ứng dụng của bạn. Intent có thể được dùng để kết nối các thành phần trong ứng dụng Android. Trong quá trình kết nối, nó cũng có thể yêu cầu thành phần đó thực hiện một tác vụ được định trước. Các thành phần cơ bản của một Intent:

  • Actions: Là những thứ mà Intent cần thực thi, chẳng hạn như quay số điện thoại, mở URL hoặc chỉnh sửa dữ liệu. Một action đơn giản là một String mô tả cho tác vụ cần thực hiện. Ví dụ: ACTION_VIEW, ACTION_EDIT, ACTION_MAIN…
  • Data: Đây chính là dữ liệu để intent hoạt động. Nó được biểu diễn dưới dạng Uniform Resource Identifier(Uri) – một kiểu định danh cho một tài nguyên cụ thể. Kiểu của Data yêu cầu (nếu có) tùy thuộc vào action. Ví dụ: Bạn sẽ không muốn tạo một dial number Intent mà lại lấy số điện thoại từ một hình ảnh đúng không?

Khả năng kết hợp các action và data này cho phép Android biết chính xác intent đang yêu cầu gì và những đối tượng nào có thể thực hiện nó. Đơn giản như vậy!

Intents có thể được sử dụng để:

  • Mở một Activity mới và truyền dữ liệu cho Activity đó
  • Mở một Fragments / Giao tiếp giữa các Fragments.
  • Mở hoặc dừng một Service
  • Hoặc có thể gọi một Activity bằng Broadcast Receiver 

♥ Có thể bạn cần đến cách thêm Fragment vào Activity

#2. Phân loại Intent

Có hai loại Intents

Explicit Intent – Intent dạng tường minh

Intent tường mình tức là khi tạo một đối tượng Intent, chúng ta chỉ định rõ và truyền trực tiếp tên thành phần đích vào intent. Ví dụ: như đoạn code bên dưới, intent được chỉ định rõ OtherActivity sẽ là thành phần nhận và xử lý intent này.

  • val intent = Intent(this, OtherActivity::class.java)
  • startActivity(intent)

Intent trong Android

  Tìm hiểu cấu trúc dữ liệu ArrayMap trong Android

  Clean Code Android: Bạn đã thật sự hiểu đúng chưa?

Implicit Intent – Intent không tường minh

Thay vì trong intent  Android được chỉ định sẵn một Activity nào đó thực hiện, thì sẽ chỉ truyền vào action và gửi cho Android. Android sẽ dựa vào action đó mà lọc những thành phần nào đã đăng kí action đó gọi ra.

Vì vậy, Android có thể tự động kích hoạt thành phần từ cùng một ứng dụng hoặc một số ứng dụng khác để xử lý intent đó.

Ví dụ, chúng ta cần phải hiển thị một vị trí lên bản đồ. Thay vì chúng ta phải mã hóa và viết hẳn module bản đồ để hiển thị thì có thể gửi vị trí đó vào intent, rồi Android sẽ tự tìm xem có ứng dụng nào phù hợp ( như Google Map chẳng hạn) để hiển thị nó.

Implicit Intent

Thông thường, chúng ta dùng các intent tường minh để kích hoạt các thành phần trong ứng dụng, còn intent không tường minh để chạy các thành phần của ứng dụng bên thứ 3.

Đây là một đoạn code minh họa cho intent không tường minh( sử dụng ACTION_VIEWđể gọi ứng dụng nào có thể hiển thị được link)

class ImplicitIntentActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_implicit_intent)
    }

    fun showWebPage(view: View) {
        val intent = Intent(Intent.ACTION_VIEW,
                Uri.parse("http://www.ebookfrenzy.com"))

        startActivity(intent)
    }
}

Kết quả sẽ như bên dưới

Implicit Intent

Tìm việc làm Android lương cao trên TopDev!

#3. Intent Flags

Flags giống như các tùy chọn(option) cho intent trong android. Bạn có thể sử dụng các flags này để cấu hình intent, các flags này giúp Android “hành xử” với intent đúng ý đồ của lập trình viên.

Ví dụ: Mặc định khi sử dụng intent để gọi Activity thì activity đó sẽ được đưa vào stack. Và khi người dùng nhấn nút back trên điện thoại thì Android sẽ gọi các activity được lưu trong stack lên.

Để ngăn chặn điêu này, bạn có thể dùng flag:
FLAG_ACTIVITY_SINGLE_TOP. Nếu đặt flag này, thì intent sẽ không thể gọi activity nếu activity đó đang ở top của stack

intent.flags = Intent.FLAG_ACTIVITY_SINGLE_TOP

Tương tự , sử dụng flag: FLAT_ACTIVITY_CLEAR_TOP sẽ xóa tất cả các activity khác trong stack và đặt activity đc gọi lên top của stack.

Có rất nhiều flag hữu ích cho ứng dụng, các bạn có thể tham khảo thêm ở đây.

#4. Truyền dữ liệu giữa các Activity bằng Intent

Để truyền dữ liệu sang cho activity mới chúng ta sử dụng các cặp key-value trong hàm putExtraputStringArrayListExtra.

putExtra chỉ truyền được dữ liệu kiểu cơ bản: Int, Float, Char, Double, Boolean, String

Truyền dữ liệu giữa các Activity bằng Intent

Ví dụ:

val intent = Intent(this, OtherActivity::class.java)
intent.putExtra("keyString", "Androidly String data")

Sau đó các giá trị trong Extras được đóng gói vào Bundle trước khi nó được gửi đi.

Truy xuất dữ liệu trong một Activity mới

val bundle: Bundle? = intent.extras
val string: String? = intent.getString("keyString")
val myArray: ArrayList<String>? = intent.getStringArrayList("myArray")

Intent, extras tương ứng với getIntent()getExtras() nếu viết bằng Java.

Chúng ta vừa dùng toán tử nullable Bundle? để phòng trường hợp bị  NullPointerExceptions khi không có dữ liệu.

Tương tự, khi lấy giá trị thông qua các Key, chúng ta dùng kiểu nullable  để phòng ngừa NPE có thể xảy ra khi key không chính xác

#5. Truyền dữ liệu là đối tượng bằng intent sử dụng Parcelable và Serializable Data

Như mình đã nói ở trên thì với các truyền dữ liệu thông thường qua hàm putExtra(), sẽ chỉ truyền được các loại dữ liệu cơ bản, không thể truyền được dữ liệu kiểu object.

Để khắc phục điều này, chúng ta implement interface Parcelable hoặc Serializable.

Điểm khác nhau giữ Parcelable và Serializable

  • Parcelable Interface là một phần của Android SDK. Còn Serializable là một interface tiêu chuẩn của Java.
  • Trong Parcelable bạn cần đặt tất cả dữ liệu mà bạn cần truyền vào đối tượng Parcel và override lại phương thức writeToParcel(). Trong serializable chỉ cần implement interface là đủ để truyền dữ liệu.
  • Parcelable được đánh giá là nhanh hơn Serializable.

Cách sử dụng Parcelable

Kotlin đưa ra một số annotations rất tiện để lưu chúng từ việc override phương thức writeToParcel() để đưa dữ liệu vào Parcelable. Thay vào đó, chúng ta có thể dùng annotations @Parcelize như bên dưới:

@Parcelize
data class Student(
        val name: String = "Anupam",
        val age: Int = 24
) : Parcelable
Chú ý: hiện tại trong build.gradle bạn phải thêm đoạn code sau để annotations @Parcelize có thể hoạt động
android {
    androidExtensions {
        experimental = true
    }
//..
....
}

Và bên Activity nhận, để lấy dữ liệu giống như cách thông thường:

val student = Student()
val intent = Intent(this, OtherActivity::class.java)
intent.putExtra("studentData", student)
startActivity(intent)

Cách sử dụng  Serializable

Cách làm sẽ tương tự như Parcelize nên mình không giải thích thêm nhé

data class Blog(val name: String = "Androidly", val year: Int = 2018) : Serializable

val blog = Blog("a", 1)
val intent = Intent(this, OtherActivity::class.java)
intent.putExtra("blogData", blog as Serializable)
startActivity(intent)

Các bạn có thể download project mình minh họa tại đây nhé

 Download Source Code

Như vậy mình đã chia sẻ những kiến thức rất căn bản để có thể hiểu bản chất Intent trong android cũng như cách sử dụng. Các bạn nên nhớ Intent là một phần rất quan trọng, vì vậy nếu chưa hiểu phần nào thì comment bên dưới để mình và mọi người hỗ trợ nhé. Phần sau, mình sẽ chia sẻ về cách xử lý sự kiện như: click, touch…vào các view trong Android.

Bài viết gốc được đăng tải tại vntalking.com

Xem thêm:

Tìm việc làm IT mọi cấp độ tại TopDev