Giới thiệu về hoạt động

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);
Nếu bạn có ý định xây dựng một ứng dụng độc lập và không cho phép các ứng dụng khác kích hoạt các hoạt động của Google cần bất kỳ bộ lọc ý định nào khác. Các hoạt động bạn không muốn thực hiện dành cho các ứng dụng khác không được có bộ lọc ý định và bạn có thể hãy tự mình bắt đầu sử dụng ý định tường minh. Để biết thêm thông tin về cách các hoạt động của bạn có thể phản hồi ý định, hãy xem bài viết Ý định và Intent Filter (Bộ lọc ý định).

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.