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

Khi những bạn cần phải liên kết những 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 những bạn tìm hiểu và khám phá thực chất cũng như cách sử dụng Intent trong android để hoàn toàn có thể gửi tài liệu giữa những thành phần ( Activity, Service … )

Trước đó bạn có thể nên đọc thêm bài viết về vòng đời activityservice trong Android mà mình đã viết nhé.

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 giải trí theo cách tựa như. Trước khi một ứng dụng hoàn toàn có thể triển khai một hành vi nào đó ( Thuật ngữ gọi là action ), nó cần phải biết trước mục tiêu của những hành vi đó, để hoàn toàn có thể thực thi những 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 mở màn nhé !

Intent trong android

# 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ề việc làm, công dụng hoàn toàn có thể được triển khai bởi ứng dụng của bạn. Intent hoàn toàn có thể được dùng để liên kết những thành phần trong ứng dụng Android. Trong quy trình liên kết, nó cũng hoàn toàn có thể nhu yếu thành phần đó triển khai 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 tích hợp những action và data này được cho phép Android biết đúng mực intent đang nhu yếu gì và những đối tượng người dùng nào hoàn toàn có thể triển khai nó. Đơn giản như vậy !
Intents hoàn toàn 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 người tiêu dùng Intent, tất cả 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à giải quyết và xử lý intent này .

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

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

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

Thay vì trong intent Android được chỉ định sẵn một Activity nào đó triển khai, 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 hoàn toàn có thể tự động hóa kích hoạt thành phần từ cùng một ứng dụng hoặc 1 số ít ứng dụng khác để giải quyết và xử lý intent đó .
Ví dụ, tất cả chúng ta cần phải hiển thị một vị trí lên map. Thay vì tất cả chúng ta phải mã hóa và viết hẳn module map để hiển thị thì hoàn toàn có thể gửi vị trí đó vào intent, rồi Android sẽ tự tìm xem có ứng dụng nào tương thích ( như Google Map ví dụ điển hình ) để hiển thị nó .

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

Thông thường, tất cả chúng ta dùng những intent tường minh để kích hoạt những thành phần trong ứng dụng, còn intent không tường minh để chạy những 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

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

  • Tìm hiểu thêm: Fragments trong Android

# 3. Intent Flags

Flags giống như những tùy chọn ( option ) cho intent trong android. Bạn hoàn toàn có thể sử dụng những flags này để thông số kỹ thuật intent, những 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 cảm ứng thì Android sẽ gọi những 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_TOPsẽ 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 dụng cho ứng dụng, những bạn hoàn toàn có thể tìm hiểu thêm thêm ở đây

# 4. Truyền dữ liệu giữa những 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 putExtra, putStringArrayListExtra.

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

Truyen du lieu giua activity bang intent

Ví dụ :

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

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

  • Dành cho bạn: Layout trong Android và cách thiết kế layout hỗ trợ đa màn hình

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

val bundle: Bundle? = intent.extras
val string: String? = intent.getString("keyString")
val myArray: ArrayList? = 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ị trải qua những Key, tất cả chúng ta dùng kiểu nullable để phòng ngừa NPE hoàn toàn có thể xảy ra khi key không đúng chuẩn

# 5. Truyền dữ liệu là đối tượng người dù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 @Parcelizenhư 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 hoàn toàn có thể hoạt động giải trí

android {
    androidExtensions {
        experimental = true
    }
//..
....
}

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

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ư như Parcelize nên mình không lý giải 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é

Như vậy mình đã san sẻ những kiến thức và kỹ năng rất cơ bản để hoàn toàn có thể hiểu thực 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ì thế nếu chưa hiểu phần nào thì comment bên dưới để mình và mọi người tương hỗ nhé. Phần sau, mình sẽ san sẻ về cách xử lý sự kiện như : click, touch … vào những view trong Android .
Đừng quên share và like bài viết để mình có động lực liên tục series .