Intent trong Android: Vai trò và cách sử dụng
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)
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ó.
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
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 putExtra, putStringArrayListExtra.
putExtra chỉ truyền được dữ liệu kiểu cơ bản: Int, Float, Char, Double, Boolean, String
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
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é
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ổng Hợp Các Công Cụ Lập Trình Android Mà Bạn Nên Biết (Phần 1)
- Mẹo viết code Kotlin cho Android developer không nên bỏ qua
- AsyncTask trong Android – công cụ xử lý đa luồng hữu hiệu
Tìm việc làm IT mọi cấp độ tại TopDev
- G Giải Quyết Bài Toán Kinh Doanh Bằng Big Data và AI
- B BenQ RD Series – Dòng Màn Hình Lập Trình 4k+ Đầu Tiên Trên Thế Giới
- F Framework nào tốt nhất cho dự án của bạn? – Checklist chi tiết
- K Kinh nghiệm xử lý responsive table hiệu quả
- S Stackoverflow là gì? Bí kíp tận dụng Stack Overflow hiệu quả
- 7 7 kinh nghiệm hữu ích khi làm việc với GIT trong dự án
- B Bài tập Python từ cơ bản đến nâng cao (có lời giải)
- B Bảo mật API là gì? Một số nguyên tắc và kỹ thuật cần biết
- H Hướng dẫn cài đặt và tự học lập trình Python cơ bản từ A-Z
- C Chinh Phục Phân Tích Dữ Liệu Với Pandas Trong Python: Hướng Dẫn Từng Bước