Lớp Activity
là một thành phần quan trọng của Android
ứng dụng, cũng như cách khởi chạy và tập hợp các hoạt động là một yếu tố cơ bản
của mô hình ứng dụng của nền tảng. Không giống như các mô hình lập trình trong
ứng dụng nào được khởi chạy bằng phương thức main()
, Android
hệ thống sẽ bắt đầu mã trong thực thể Activity
bằng cách
gọi phương thức gọi lại cụ thể tương ứng với các giai đoạn cụ thể của
vòng đời của nó.
Tài liệu này giới thiệu khái niệm về hoạt động, sau đó cung cấp một số hướng dẫn đơn giản về cách làm việc với các công cụ này. Để biết thêm thông tin về các phương pháp hay nhất khi thiết kế ứng dụng, xem Hướng dẫn về Cấu trúc ứng dụng.
Khái niệm về hoạt động
Trải nghiệm trên ứng dụng di động khác với phiên bản trên máy tính ở chỗ hoạt động tương tác của người dùng với ứng dụng không phải lúc nào cũng bắt đầu tại cùng một nơi. Thay vào đó, hành trình của người dùng thường bắt đầu một cách không xác định. Ví dụ: nếu mở ứng dụng email từ màn hình chính, bạn có thể thấy danh sách email. Ngược lại, nếu bạn đang dùng một ứng dụng mạng xã hội mà sau đó chạy ứng dụng email của mình, bạn có thể chuyển thẳng đến màn hình của ứng dụng email để soạn email.
Lớp Activity
được thiết kế để hỗ trợ mô hình này.
Khi một ứng dụng gọi một ứng dụng khác, ứng dụng gọi sẽ gọi một hoạt động trong ứng dụng kia
ứng dụng thay vì toàn bộ ứng dụng ở dạng nguyên tử. Theo đó, hoạt động đóng vai trò
điểm truy cập cho hoạt động tương tác giữa ứng dụng với người dùng. Bạn triển khai một
hoạt động dưới dạng lớp con của lớp Activity
.
Một hoạt động cung cấp cửa sổ để ứng dụng vẽ giao diện người dùng. Cửa sổ này thường lấp đầy màn hình, nhưng có thể nhỏ hơn màn hình và nổi lên trên các cửa sổ khác. Thông thường, một hoạt động triển khai một màn hình trong một ứng dụng. Ví dụ: một trong các hoạt động của một ứng dụng có thể triển khai màn hình Preferences (Lựa chọn ưu tiên), trong khi một hoạt động khác triển khai màn hình Chọn ảnh.
Hầu hết ứng dụng đều chứa nhiều màn hình, tức là chúng bao gồm nhiều màn hình hoạt động. Thông thường, một hoạt động trong ứng dụng được chỉ định là hoạt động chính activity, đó là màn hình đầu tiên xuất hiện khi người dùng khởi chạy ứng dụng. Sau đó, mỗi hoạt động có thể bắt đầu một hoạt động khác để thực hiện các hành động khác nhau. Ví dụ: hoạt động chính trong một email đơn giản có thể cung cấp màn hình hiển thị hộp thư đến email. Từ đó, hoạt động có thể khởi chạy các hoạt động khác cung cấp màn hình cho các tác vụ như viết email và mở email riêng lẻ.
Mặc dù các hoạt động phối hợp cùng nhau để tạo thành trải nghiệm người dùng liền mạch trong ứng dụng, mỗi hoạt động chỉ được liên kết lỏng lẻo với các hoạt động khác; có thường có phần phụ thuộc tối thiểu giữa các hoạt động trong một ứng dụng. Trên thực tế, các hoạt động thường khởi động hoạt động thuộc về ứng dụng khác. Ví dụ: ứng dụng trình duyệt có thể khởi chạy hoạt động Chia sẻ của một ứng dụng mạng xã hội.
Để sử dụng các hoạt động trong ứng dụng của mình, bạn phải đăng ký thông tin về các hoạt động đó trong tệp kê khai của ứng dụng và bạn phải quản lý vòng đời hoạt động một cách thích hợp. Phần còn lại của tài liệu này giới thiệu về các chủ đề này.
Định cấu hình tệp kê khai
Để ứng dụng của bạn có thể sử dụng các hoạt động, bạn phải khai báo các hoạt động đó, và một số thuộc tính nhất định của chúng trong tệp kê khai.
Khai báo hoạt động
Để khai báo hoạt động của bạn, hãy mở tệp kê khai rồi thêm một <hoạt động> là phần tử con của phần tử <ứng dụng> . Ví dụ:
<manifest ... > <application ... > <activity android:name=".ExampleActivity" /> ... </application ... > ... </manifest >
Thuộc tính bắt buộc duy nhất cho phần tử này là android:name, Mã này chỉ định tên lớp của hoạt động. Bạn cũng có thể thêm các thuộc tính xác định đặc điểm hoạt động, chẳng hạn như nhãn, biểu tượng hoặc giao diện người dùng. Để biết thêm thông tin về các thuộc tính này và các thuộc tính khác, hãy xem <hoạt động> tài liệu tham khảo về phần tử.
Lưu ý: Sau khi xuất bản ứng dụng, bạn không nên thay đổi hoạt động tên. Nếu làm vậy, bạn có thể làm hỏng một số chức năng, chẳng hạn như lối tắt ứng dụng. Để biết thêm thông tin về những thay đổi cần tránh sau khi xuất bản video, hãy xem Những điều không thể thay đổi.
Khai báo bộ lọc ý định
Bộ lọc ý định là một tính năng rất mạnh mẽ của nền tảng Android. Chúng mang lại khả năng khởi chạy một hoạt động không chỉ dựa trên rõ ràng nhưng cũng là yêu cầu ngầm ẩn. Ví dụ: một yêu cầu rõ ràng có thể yêu cầu hệ thống “Bắt đầu hoạt động Gửi email trong ứng dụng Gmail". Ngược lại, yêu cầu ngầm ẩn sẽ cho "Bắt đầu màn hình Gửi email trong bất kỳ có thể thực hiện công việc". Khi giao diện người dùng hệ thống hỏi người dùng nên sử dụng ứng dụng nào khi thực hiện một tác vụ, đó chính là bộ lọc ý định tại nơi làm việc.
Bạn có thể tận dụng tính năng này bằng cách khai báo <intent-filter> trong <activity>. Định nghĩa của phần tử này bao gồm phần tử <action> và (không bắt buộc) <category> và/hoặc <data> . Các phần tử này kết hợp để chỉ định loại ý định mà hoạt động có thể phản hồi. Cho đoạn mã sau đây cho biết cách định cấu hình một hoạt động gửi dữ liệu văn bản và nhận yêu cầu từ các hoạt động khác để thực hiện việc này:
<activity android:name=".ExampleActivity" android:icon="@drawable/app_icon"> <intent-filter> <action android:name="android.intent.action.SEND" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="text/plain" /> </intent-filter> </activity>
Trong phần này
Ví dụ: thẻ <action>
chỉ định rằng hoạt động này gửi dữ liệu.
Khai báo <category>
phần tử vì DEFAULT
bật hoạt động
để nhận các yêu cầu khởi chạy. Trường <data>
chỉ định kiểu dữ liệu
mà hoạt động này có thể gửi. Đoạn mã sau đây cho biết cách gọi hàm
hoạt động được mô tả ở trên:
Kotlin
val sendIntent = Intent().apply { action = Intent.ACTION_SEND type = "text/plain" putExtra(Intent.EXTRA_TEXT, textMessage) } startActivity(sendIntent)
Java
// Create the text message with a string Intent sendIntent = new Intent(); sendIntent.setAction(Intent.ACTION_SEND); sendIntent.setType("text/plain"); sendIntent.putExtra(Intent.EXTRA_TEXT, textMessage); // Start the activity startActivity(sendIntent);
Khai báo quyền
Bạn có thể sử dụng
Thẻ <activity>
để kiểm soát
ứng dụng nào có thể bắt đầu một hoạt động cụ thể. Hoạt động của cha mẹ không thể chạy
hoạt động của trẻ trừ phi cả hai hoạt động đều có cùng quyền trong
tệp kê khai. Nếu bạn khai báo một
<uses-permission>
mỗi hoạt động con phải có một phần tử phù hợp
<uses-permission>
.
Ví dụ: nếu ứng dụng của bạn muốn sử dụng một ứng dụng giả định có tên là SocialApp để chia sẻ một bài đăng lên mạng xã hội, chính SocialApp phải xác định quyền mà một ứng dụng gọi nó phải có:
<manifest> <activity android:name="...." android:permission=”com.google.socialapp.permission.SHARE_POST” />
Sau đó, để được phép gọi mạng xã hội, ứng dụng của bạn phải khớp với quyền được đặt trong Tệp kê khai của SocialApp:
<manifest> <uses-permission android:name="com.google.socialapp.permission.SHARE_POST" /> </manifest>
Để biết thêm thông tin về quyền và bảo mật nói chung, hãy xem Tính bảo mật và quyền truy cập.
Quản lý vòng đời hoạt động
Trong suốt thời gian tồn tại, một hoạt động sẽ trải qua một số trạng thái. Bạn sử dụng một loạt lệnh gọi lại để xử lý quá trình chuyển đổi giữa các trạng thái. Các phần sau ra mắt các lệnh gọi lại này.
onCreate()
Bạn phải triển khai lệnh gọi lại này. Lệnh gọi lại này sẽ kích hoạt khi hệ thống tạo
của bạn. Quá trình triển khai của bạn sẽ khởi chạy các thành phần thiết yếu của
hoạt động của bạn: Ví dụ: ứng dụng sẽ tạo các thành phần hiển thị và liên kết dữ liệu với
danh sách tại đây. Quan trọng nhất là đây là nơi bạn phải gọi
setContentView()
để xác định bố cục cho giao diện người dùng của hoạt động.
Khi onCreate()
kết thúc,
lệnh gọi lại tiếp theo luôn là onStart()
.
onStart()
Khi onCreate()
thoát, hoạt động
chuyển sang trạng thái Started (Đã khởi động) và hoạt động sẽ được hiển thị cho người dùng.
Lệnh gọi lại này chứa số tiền cần thiết cho bước chuẩn bị cuối cùng của hoạt động
truy cập vào nền trước và có tính tương tác.
onResume()
Hệ thống gọi lệnh gọi lại này ngay trước khi hoạt động bắt đầu tương tác
với người dùng. Tại thời điểm này, hoạt động nằm ở đầu hoạt động
ngăn xếp và ghi lại toàn bộ hoạt động đầu vào của người dùng. Hầu hết chức năng cốt lõi của ứng dụng là
được triển khai trong phương thức onResume()
.
Lệnh gọi lại onPause()
luôn luôn
tuân theo onResume()
.
onPause()
Hệ thống sẽ gọi onPause()
khi hoạt động bị mất
lấy tiêu điểm và chuyển sang trạng thái Paused (Đã tạm dừng). Ví dụ: trạng thái này xảy ra khi người dùng
nhấn vào nút Quay lại hoặc Gần đây. Khi hệ thống gọi
onPause()
cho hoạt động của bạn,
về mặt kỹ thuật thì điều đó có nghĩa là hoạt động của bạn vẫn hiển thị một phần, nhưng thông thường nhất là một dấu hiệu cho biết
người dùng rời khỏi hoạt động và hoạt động sẽ sớm nhập
Trạng thái đã dừng hoặc Đã tiếp tục.
Một hoạt động ở trạng thái Bị tạm dừng có thể tiếp tục cập nhật giao diện người dùng nếu người dùng đang mong đợi giao diện người dùng cập nhật. Ví dụ về hoạt động này bao gồm hoạt động cho thấy thao tác điều hướng màn hình bản đồ hoặc trình phát nội dung đa phương tiện đang phát. Ngay cả khi các hoạt động đó mất tập trung, người dùng muốn giao diện người dùng tiếp tục cập nhật.
Bạn không nên sử dụng
onPause()
để lưu ứng dụng hoặc người dùng
dữ liệu, thực hiện lệnh gọi mạng hoặc thực thi các giao dịch cơ sở dữ liệu.
Để biết thông tin về cách lưu dữ liệu, xem
Lưu và khôi phục trạng thái hoạt động.
Sau khi thực thi xong onPause()
,
lệnh gọi lại tiếp theo là onStop()
hoặc
onResume()
, tuỳ thuộc vào
xảy ra sau khi hoạt động chuyển sang trạng thái Đã tạm dừng.
onStop()
Hệ thống gọi onStop()
khi
hoạt động không còn hiển thị cho người dùng.
Điều này có thể xảy ra vì hoạt động đang bị huỷ bỏ, một hoạt động mới
hoặc một hoạt động hiện có đang tham gia
trạng thái Đã tiếp tục và bao gồm hoạt động đã dừng.
Trong tất cả các trường hợp này, hoạt động bị dừng sẽ không còn
hiển thị chút nào.
Lệnh gọi lại tiếp theo mà hệ thống gọi là
onRestart()
, nếu
quay lại để tương tác với người dùng hoặc bằng cách
onDestroy()
nếu hoạt động này chấm dứt hoàn toàn.
onRestart()
Hệ thống gọi lệnh gọi lại này khi một hoạt động ở trạng thái Đã dừng là
khởi động lại. onRestart()
khôi phục trạng thái của hoạt động kể từ thời điểm hoạt động bị dừng.
Lệnh gọi lại này luôn đứng trước
onStart()
.
onDestroy()
Hệ thống sẽ gọi lệnh gọi lại này trước khi một hoạt động bị huỷ.
Lệnh gọi lại này là lệnh gọi lại cuối cùng mà hoạt động nhận được.
onDestroy()
là
thường được triển khai để đảm bảo rằng tất cả tài nguyên của một hoạt động
giải phóng khi hoạt động hoặc quy trình chứa hoạt động đó bị huỷ bỏ.
Phần này chỉ giới thiệu về chủ đề này. Để biết thêm xử lý chi tiết vòng đời hoạt động và các lệnh gọi lại của nó, xem Hoạt động Vòng đời.