Tập tành học làm Android (P6) - Intent
Bài đăng này đã không được cập nhật trong 4 năm
Trong bài viết trước chúng ta đã tìm hiểu về những kiến cơ bản về Fragment và thực hiện 1 ví dụ đơn giản với Fragment sử dụng Kotlin
. Trong bài viết này mình cùng các bạn tìm hiểu về thành phần rất quan trọng trong Android đó là Intent
. Bắt đầu nào
Intent là gì?
Intent
là một đối tượng truyền tin mà bạn có thể sử dụng để request một action hay để kết nối giữa các thành phần Android như activity, content providers, broadcast receivers and services
Sử dụng Intent khi nào?
Intent được sử dụng trong 3 trường hợp cơ bản sau:
Bắt đầu một Activity
- Activity là gì bạn có thể tham khảo trong bài viết về Activity của mình
- Để bắt đầu một Activity chúng ta sử dụng startActivity() để chuyển từ activity này sang activity khác, có thể truyền dữ liệu cần thiết
- Nếu muốn nhận lại dữ liệu khi đã xử lý ở màn hình thứ 2 xong thì có thể dùng startActivityForResult(), dữ liệu được nhận lại trong hàm onActivityResult()
Bắt đầu một service
- Service là một thành phần có chức năng thực hiện các thao tác nền mà không cần giao diện người dùng
- Chúng ta bắt đầu một service bằng cách chuyển
Intent
tới startService().Intent
mô tả service cần bắt đầu và mang theo những dữ liệu cần thiết
Vận chuyển một broadcast
Broadcast
là một tin nhắn mà bất kỳ ứng dụng nào cũng có thể nhận được. Hệ thống sẽ chuyển cácBroadcast
khác nhau tới các sự kiện hệ thống. Bạn có thể chuyển mộtBroadcast
tới các ứng dụng khác bằng cách chuyển mộtIntent
tớisendBroadcast()
,sendOrderedBroadcast()
, hoặcsendStickyBroadcast()
Phân loại Intent
Intent có 2 loại:
Explicit Intent (Intent tường minh)
- Đây là loại Intent mà được khai báo một cách tường minh các thành phần sẽ nhận và xử lý
Intent
. - Loại này thường được sử dụng để trao đổi dữ liệu cho các activity, service,.. trong cùng một ứng dụng.
Implicit Intent (Intent không tường minh)
- Đây là loại
intent
có các action được Android xây dựng sẵn. - Nó là loại intent không rõ đối tượng truyền đến, thường dùng để chuyển dữ liệu sang một ứng dụng khác
Cấu trúc Intent
action
- Các action chung được thực hiện, như ACTION_VIEW, ACTION_EDIT, ACTION_MAIN,...
data
- Dữ liệu để hoạt động như những dữ liệu nguyên thủy String, int, float,… tới những kiểu dữ liệu dạng object(có implement Serializable), và có thể truyền trực tiếp hay truyền qua bundle dưới dạng key-value
category
- Cung cấp thêm thông tin về
Action
để thực thi - Là một phần tùy ý của đối tượng Intent và nó là một chuỗi chứa thông tin bổ sung về loại thành phần mà nên xử lý Intent đó. Nó kết hợp với action để chạy các ứng dụng phù hợp như calendar, calculator,..
type
- Chỉ định một type tường minh (một loại MIME) của dữ liệu
Intent
. Thông thường loại được suy ra từ chính dữ liệu đó. Bằng cách đặt thuộc tính này, bạn vô hiệu hóa evaluation đó và force một type rõ ràng.
Flags
- Flags là phần tùy ý của đối tượng Intent và chỉ thị hệ điều hành Android cách chạy một Activity, và cách xử lý sau khi nó đã chạy,…
extras
- Là một bundle của các thông tin được thêm vào khi chúng ta truyền dữ liệu, cung cấp dữ liệu cho các component khác
Làm việc với Intent
Điều hướng màn hình
- Intent này sử dụng để mở một activity khác từ activity hiện tại
- Sử dụng putExtra() và get<type>Extra() để truyền dữ liệu qua lại giữa các activity.
- Các phương thức cần thiết:
- Intent(context,class) : khởi tạo 1 intent tường minh để chuyển từ activity hiện tại sang class truyền vào.
- PutExtra(name, value) : truyền data giá trị value với key là name
- getStringExtra(name): lấy giá trị tương ứng với giá trị có key là name
- getIntExtra(name,default): lấy giá trị tương ứng với key là name, nếu không có giá trị nào thì trả về giá trị mặc định là default.
- Tương tự ta có getSerialiazbleExtra(), getBundleExtra(), getBooleanExtra(),…
Xem Url trên trình duyệt web
- Sử dụng ACTION_VIEW để mở Url. Đây là 1 intent không tường minh. Intent này cần quyền internet.
Gọi, chuyển màn hình quay số của điện thoại
- Thêm một loại về Implicit Intent. Cần cấp quyền CALL_PHONE
Yêu cầu ảnh từ camera
Yêu cầu ảnh từ bộ sưu tập
Demo
- Mình có một file
MainActivity.kt
và sử dụng một fragment để tạo giao diện cho Activity này với giao diện như sau:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".FirstFragment">
<TextView
android:id="@+id/textview_first"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_first_fragment"
app:layout_constraintBottom_toTopOf="@id/button_first"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/button_first"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Explicit Intent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/textview_first" />
<Button
android:layout_marginTop="30dp"
android:text="Implicit Intent"
app:layout_constraintEnd_toEndOf="@id/button_first"
app:layout_constraintStart_toStartOf="@id/button_first"
app:layout_constraintTop_toBottomOf="@id/button_first"
android:id="@+id/btn_second"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</androidx.constraintlayout.widget.ConstraintLayout>
Ở trong giao diện này mình có 2 button để demo về 2 loại của Intent
là tường minh và không tường minh
Intent tường minh
-
Ở demo
Intent
tường minh mình sẽ chuyển từMain Activity
sang mộtActivity
khác. Như ở giao diện phía trên sẽ có một button làExplicit Intent
. Sau khi bấm vào button này thì sẽ từ Activity hiện tại sẽ nhảy sang một Activity mới: -
Màn hình ban đầu:
Sau khi Click button Explicit Intent
:
button_first.setOnClickListener({
val intent: Intent = Intent(context, Activity1::class.java)
var content = "Demo Explicit Intent"
val bundle = Bundle()
bundle.putString("CONTENT",content)
intent.putExtra("KEY_1",bundle)
context?.startActivity(intent)
})
- Ở trong
fragment
để hiển thị ở trongActivity
ban đầu mình sẽ bắt sự kiện cho buttonExplicit Intent
. Ở đây mình khai báo mộtIntent
và truyền vàoActivity
mới mà mình cẩn hiển thị. Sau đó truyền dữ liệu để hiển thị lênActivity
mới. Và cuối cùng chúng ta startActivity() là xong - Trong
Activity
mới mình chỉ cần lấy dữ liệu trong bundle và set vào TextView để hiển thị - Note: Ở đây chúng ta có thể không sử dụng bundle rồi mới truyền dữ liệu sang activity mới. Tuy nhiên, khi số lượng value mình muốn truyền sang càng nhiều thì ở bên Activity khó kiểm soát và phải khai báo nhiều biến. Chúng ta nên sử dụng bundle rồi đưa dữ liệu vào bundle và truyền sang Activity mới
Intent không tường minh
- Ở demo
Intent không tường minh
này mình sẽ dùng Intent để mở một website - Màn hình ban đầu:
Sau khi click button Implicit Intent
:
- Có nhiều bạn sẽ thắc mắc tại sao khi bấm vào button
Implicit Intent
lại sang website của google
btn_second.setOnClickListener({
val intent = Intent()
intent.setAction(ACTION_VIEW)
intent.setData(Uri.parse("https://www.google.com"))
startActivity(intent)
})
Thì Ở trong fragment
để hiển thị ở trong Activity
ban đầu mình sẽ bắt sự kiện cho button Implicit Intent
, mình set cho Intent
một action là ACTION_VIEW
và truyền vào một uri là trang chủ của google. Sau khi startActivity() sẽ nhảy sang trang chủ website của google
Kết Luận
Trong bài viết này mình đã giới thiệu với các bạn một thành phần quan trọng trong Android là Intent
. Trong bài viết tiếp theo cùng mình tìm hiểu về BroadcastReceiver. Cảm ơn các bạn đã theo dõi bài viết
Tài liệu tham khảo:
All rights reserved