Chương 1. Nền tảng Android 1. Giới thiệu chung về Android Android là hệ điều hành mã nguồn mở, dựa trên Linux, được tạo ra cho một loạt các thiết bị và yếu tố hình thức.1 cho biết các thành phần chính của nền tảng Android [2]: - Tầng hạt nhân Linux: nền tảng của hệ điều hành Android là hạt nhân Linux. Tất cả mọi hoạt động của thiết bị đều phải thực thi ở tầng này.
Tầng này bao gồm các tiến trình quản lý bộ nhớ (memory management), giao tiếp với phần cứng (driver model), bảo mật (security), quản lý tiến trình (process). Sử dụng hạt nhân Linux cho phép Android tận dụng các tính năng bảo mật then chốt và cho phép các nhà sản xuất thiết bị phát triển trình điều khiển phần cứng cho hạt nhân nổi tiếng này - Lớp trừu tượng phần cứng (Hardware Abstraction Layer - HAL): cung cấp các giao diện chuẩn để phần cứng thiết bị có thể giao tiếp với các nền tảng Java API ở cấp cao hơn. Lớp trừu tượng phần cứng này bao gồm nhiều mô đun thư viện, mỗi mô đun này lại thực thi một giao diện cho một loại thành phần phần cứng cụ thể, chẳng hạn như là mô đun máy ảnh hoặc mô đun Bluetooth. Khi bộ khung API (API framework) thực hiện cuộc gọi để truy cập phần cứng thiết bị, hệ thống Android sẽ tải mô đun thư viện cho thành phần phần cứng đó.
- Thời gian chạy Android (Android Runtime – ART): đối với các thiết bị chạy Android phiên bản 5.0 (API 21) trở lên, mỗi ứng dụng chạy trong tiến trình của chính nó với thể hiện chính nó của thời gian chạy Android. Thời gian chạy Android được viết để chạy nhiều máy ảo trên các thiết bị có bộ nhớ thấp bằng cách thực thi các tập DEX, một định dạng byte-code được thiết kế đặc biệt cho Android, được tối ưu hóa cho bộ nhớ tối thiểu. Xây dựng các công cụ, chẳng hạn như Jack, biên soạn các nguồn Java vào mã DEX byte-code, có thể chạy trên nền tảng Android. Một số tính năng chính của thời gian chạy Android bao gồm: • Biên dịch trước thời hạn (Ahead-Of-Time - AOT) và trong thời hạn (Just-In- Time - JIT) • Tối ưu hóa thu gom rác (Garbage Collection - GC) 9 z • Hỗ trợ gỡ lỗi tốt hơn, bao gồm một hồ sơ mẫu riêng, các ngoại lệ chuẩn đoán chi tiết, báo cáo sự cố và khả năng thiết lập các điểm quan sát để giám sát các lĩnh vực cụ thể.
Trước phiên bản Android 5.0 (Cấp độ API 21), Dalvik chính là thời gian chạy Android. Nếu ứng dụng người dùng chạy tốt trên ART, thì cũng có thể làm việc trên Dalvik, nhưng ngược lại có thể không đúng. Android cũng bao gồm một tập hợp các thư viện chạy lõi cung cấp hầu hết các chức năng của ngôn ngữ lập trình Java, bao gồm một số tính năng ngôn ngữ Java 8, mà khuôn khổ Java API sử dụng - Tầng thư viện C/C++: nhiều thành phần và dịch vụ cốt lõi của hệ thống, như là HAL và ART, được xây dựng từ mã nguồn cục bộ yêu cầu các thư viện gốc được viết bằng C và C++. Nền tảng Android cung cấp các API của bộ khung Java để phô bày tính năng của một số thư viện gốc này cho các ứng dụng.
Ví dụ, có thể truy cập vào OpenGL ES thông qua các Java OpenGL API của bộ khung Android để thêm hỗ trợ vẽ và thao tác đồ họa 2D và 3D trong ứng dụng. Nếu ứng dụng phát triển yêu cầu mã nguồn C hoặc C ++, ta có thể sử dụng Android NDK để truy cập vào một số thư viện nền tảng gốc trực tiếp từ mã nguồn gốc. - Tầng khung Java API: toàn bộ tập hợp các tính năng của hệ điều hành Android đã có sẵn thông qua các API được viết bằng ngôn ngữ Java. Các API này tạo thành những khối xây dựng sẵn mà chúng ta hoàn toàn có thể lấy ra sử dụng khi muốn xây dựng các ứng dụng Android.
Các API này giúp đơn giản hóa việc tái sử dụng phần lõi Android cũng như là các thành phần và dịch vụ của hệ thống mô đun sau: • View System phong phú và có khả năng mở rô ̣ng, người dùng có thể sử du ̣ng để xây dựng UI của ứng du ̣ng, bao gồm các danh sách, lưới, hô ̣p văn bản, các nút bấ m, và thâ ̣m chí mô ̣t trıǹ h duyê ̣t web nhúng • Trıǹ h quản lý tài nguyên, cung cấp quyền truy cập vào các tài nguyên không mã nguồ n như là chuỗi cu ̣c bộ, đồ họa, các tê ̣p bố cu ̣c. • Trı̀nh quản lý thông báo: cho phép tấ t cả các ứng du ̣ng hiể n thi ̣ cảnh báo tùy ̉ h trong thanh trạng thái chın • Trıǹ h quản lý hoa ̣t đô ̣ng: quản lý vòng đời của ứng du ̣ng và cung cấ p ngăn xế p trở la ̣i chuyể n hướng thông du ̣ng.1: Cấ u trúc ngăn xếp phầ n mềm Android • Trình cung cấ p nô ̣i dung: cho phép ứng du ̣ng truy câ ̣p dữ liê ̣u từ các ứng dụng khác, chẳ ng ha ̣n như ứng du ̣ng danh ba ̣ hoă ̣c để chia sẻ dữ liê ̣u riêng của chúng. Nhà phát triể n có quyền truy câ ̣p đầy đủ vào cùng bộ khung API mà các ứng du ̣ng hê ̣ thống Android sử dụng. - Tầ ng ứng dụng hê ̣ thố ng: Android đi kèm với mô ̣t bô ̣ các ứng du ̣ng cố t lõi như ̣ trıǹ h duyê ̣t internet, danh ba ̣ và hơn thế nữa.
Ứng du ̣ng đi email, tin nhắ n SMS, lich, 1 https://developer.com/guide/platform/index.html 11 z kèm với nề n tảng này không có tra ̣ng thái đă ̣c biê ̣t so với các ứng du ̣ng mà người dùng tự cài đă ̣t. Vı̀ vâ ̣y, ứng du ̣ng của bên thứ ba vẫn có thể trở thành trıǹ h duyê ̣t web mă ̣c đinh, ̣ tin nhắ n SMS mă ̣c đinh, ́ mă ̣c đinh ̣ hoă ̣c thâ ̣m chı́ bàn phım ̣ của người dùng. Các ứng du ̣ng hê ̣ thố ng hoạt đô ̣ng như mô ̣t ứng du ̣ng cho người dùng và đồ ng thời cung cấp các khả cơ bản mà nhà phát triể n có thể truy câ ̣p từ ứng du ̣ng của riêng ho ̣. Ví du ̣, nếu một ứng dụng của người dùng muố n gửi tin nhắ n SMS, người dùng không cầ n phải tự xây dựng chức năng đó, thay vào đó có thể go ̣i ứng du ̣ng SMS nào đó đã đươ ̣c cài đă ̣t để gửi tin nhắ n tới người nhâ ̣n chı̉ đinh.
Bản kê khai ứng dụng AndroidManifest Mọi ứng dụng Android đều phải có một tệp AndroidManifest.xml trong thư mục gốc của mình. Tệp kê khai này trình bày những thông tin thiết yếu về ứng dụng với hệ thống, thông tin mà hệ thống phải có trước khi có thể chạy bất kỳ mã nào của ứng dụng. Các giá trị trong tập tin Manifest bị ràng buộc vào ứng dụng tại thời điểm biên dịch và không thể thay đổi sau đó, trừ khi thực hiện biên dịch lại ứng dụng. Một trong các loại thông tin chính mà tập tin Manifest này chứa là chúng khai báo các thành phần của ứng dụng.
Các thành phần này có thể là một hoặc nhiều trong các loại sau: - Hoạt động (Activity) - Dịch vụ (Service) - Bộ nhận quảng bá (Broadcast Receiver) - Trình cung cấp nội dung (Content Provider) 1. Hoạt động (activity) [3] Khái niệm Hoạt động là thành phần phụ trách giao diện người dùng của ứng dụng. Một hoạt động là một giao diện trực quan mà người dùng có thể thực hiện trên đó mỗi khi được kích hoạt. Một ứng dụng có thể có nhiều hoạt động và chúng có thể gọi đến nhau hoặc chuyển giữa các hoạt động với nhau.
Mỗi hoạt động là một dẫn xuất của lớp android. Mỗi hoạt động có một cửa sổ để vẽ lên. Thông thường cửa sổ này phủ đầy màn hình, ngoài ra nó cũng có thể có thêm các cửa sổ con khác như là hộp thoại. Nội dung 12 z cửa sổ của hoạt động được cung cấp bởi một hệ thống cấp bậc các Khung nhìn (là đối tượng của lớp Views).
Vòng đời của hoạt động Các hoạt động trong hệ thống được quản lý bởi một cấu trúc dữ liệu ngăn xếp. Khi có một hoạt động được khởi tạo, nó được đẩy vào trong ngăn xếp, chuyển sang trạng thái thực thi và hoạt trộng trước đó sẽ chuyển sang trạng thái chờ. Hoạt động này chỉ trở lại trạng thái kích hoạt khi mà hoạt động vừa khởi tạo kết thúc việc thực thi. Một hoạt động có bốn trạng thái chính là: - Hoạt động hoặc đang chạy: khi nó đang hiển thị ở trên màn hình và nhận tương tác người dùng - Tạm dừng: khi hoạt động không còn là trọng tâm trên màn hình nhưng vẫn hiển thị trước người dùng.
- Dừng: Khi một hoạt động hoàn toàn bị che khuất, nó sẽ rơi vào trạng thái Dừng. Tuy nhiên, nó vẫn còn lưu trữ toàn bộ thông tin trạng thái. Và nó thường bị hệ thống đóng lại khi có tình trạng thiếu bộ nhớ. Khi chuyển giữa các trạng thái, ứng dụng sẽ gọi các hàm gọi lại ứng với các bước chuyển: void onCreate(Bundle savedInstanceState) void onStart() void onRestart() void onResume() void onPause() void onStop() void onDestroy() Biểu đồ sau mô tả trạng thái trong vòng đời của một hoạt động.
Hình chữ nhật thể hiện các phương thức gọi lại mà chúng ta có thể khai báo để gọi thực thi một số thao tác khi hoạt động chuyển sang trạng thái khác (phương thức gọi lại là phương thức được gọi lại bởi một phương thức khác khi có một sự kiện xảy ra). Các trạng thái chính của một hoạt động được thể hiện bởi các hình viên thuốc: 13 z 2 Hình 1.2: Vòng đời của một hoạt động (activity) trong ứng dụng Android Vòng đời của một hoạt động được thể hiện trong những quá trình sau: Toàn bộ vòng đời của một hoạt động bắt đầu từ lời gọi đầu tiên tới phương thức onCreate (Bundle) cho tới khi có lời gọi phương thức onDestroy(). Trong quá trình này, một hoạt động sẽ khởi tạo lại tất cả các tài nguyên cần sử dụng trong phương thức onCreate() và giải phóng chúng khi phương thức onDestroy() được thực thi. Vòng đời có thể nhìn thấy của một hoạt động bắt đầu từ lời gọi tới phương thức onStart(), cho tới khi phương thức onStop() của nó được thực thi.
Toàn bộ các tài nguyên đang được sử dụng bởi hoạt động vẫn tiếp tục được lưu giữ, người dùng có thể thấy 2 https://developer.com/reference/android/app/Activity.html 14 z giao diện nhưng không tương tác được với hoạt động do trong quá trình này hoạt động không ở trạng thái chạy tiền cảnh.