Xây dựng các ứng dụng Android. Cấu trúc ứng dụng Android. Giới thiệu về phát triển ứng dụng Android

Các ứng dụng Android được viết bằng ngôn ngữ lập trình Java. Các công cụ SDK Android (Bộ phát triển phần mềm) biên dịch mã bạn viết—và tất cả các tệp tài nguyên và dữ liệu cần thiết—vào tệp APK – gói phần mềm Android, là một tệp lưu trữ có phần mở rộng .apk. TRONG Tệp APK chứa mọi thứ cần thiết để ứng dụng Android hoạt động và nó cho phép bạn cài đặt ứng dụng trên bất kỳ thiết bị nào chạy hệ thống Android.

Mỗi ứng dụng Android được cài đặt trên thiết bị đều chạy trong hộp cát riêng (môi trường phần mềm biệt lập):

  • Hệ điều hành Android là hệ thống Linux nhiều người dùng, trong đó mỗi ứng dụng là một người dùng riêng biệt;
  • Theo mặc định, hệ thống gán một mã định danh duy nhất cho mỗi ứng dụng Người dùng Linux(mã định danh này chỉ được hệ thống sử dụng và ứng dụng không xác định được); hệ thống đặt quyền cho tất cả các tệp trong một ứng dụng để chỉ người dùng có ID được gán cho ứng dụng đó mới có thể truy cập chúng;
  • Mỗi quy trình có máy ảo (VM) riêng, do đó mã ứng dụng chạy tách biệt với các ứng dụng khác;
  • theo mặc định, mỗi ứng dụng chạy trong tiến trình Linux riêng của nó. Android bắt đầu một quy trình khi một thành phần của ứng dụng cần chạy, sau đó kết thúc quy trình đó khi không còn cần thiết nữa hoặc khi hệ thống cần giải phóng bộ nhớ cho các ứng dụng khác.

Do đó hệ thống Android thực hiện nguyên tắc trao quyền tối thiểu. Nghĩa là, theo mặc định, mỗi ứng dụng chỉ có quyền truy cập vào những thành phần mà nó cần hoạt động và không có quyền truy cập nào khác. Điều này tạo ra một môi trường cực kỳ an toàn trong đó ứng dụng không có quyền truy cập vào các khu vực trái phép của hệ thống.

Tuy nhiên, một ứng dụng có các tùy chọn để chia sẻ dữ liệu của nó với các ứng dụng khác và truy cập các dịch vụ hệ thống:

  • hai ứng dụng có thể được gán cùng một ID người dùng Linux. Trong trường hợp này, mỗi người trong số họ sẽ có thể truy cập các tệp của ứng dụng kia. Để tiết kiệm tài nguyên hệ thống, bạn cũng có thể đảm bảo rằng các ứng dụng có cùng ID người dùng chạy trong cùng một quy trình Linux và sử dụng cùng một VM (các ứng dụng cũng phải được ký bằng cùng một chứng chỉ);
  • Ứng dụng có thể yêu cầu quyền truy cập dữ liệu thiết bị, chẳng hạn như danh bạ người dùng, tin nhắn SMS, thẻ nhớ plug-in (thẻ SD), máy ảnh, Bluetooth, v.v. Tất cả các quyền phải được cấp cho ứng dụng khi cài đặt.

Đây là thông tin cơ bản về cách một ứng dụng Android tồn tại trên hệ thống. Phần còn lại của tài liệu này bao gồm các chủ đề sau:

  • các thành phần cốt lõi xác định ứng dụng;
  • một tệp kê khai khai báo các thành phần và chức năng của thiết bị mà ứng dụng yêu cầu;
  • tài nguyên tồn tại tách biệt với mã ứng dụng và cho phép ứng dụng điều chỉnh hoạt động của nó với các thiết bị có cấu hình khác nhau.

Thành phần ứng dụng

Các thành phần ứng dụng là các khối xây dựng tạo nên một ứng dụng Android. Mỗi thành phần đại diện cho một điểm riêng biệt mà qua đó hệ thống có thể vào ứng dụng. Không phải tất cả các thành phần đều là điểm truy cập cho người dùng và một số thành phần phụ thuộc lẫn nhau. Hơn nữa, mỗi thành phần là một đơn vị cấu trúc độc lập và đóng một vai trò cụ thể - mỗi thành phần đại diện cho một thành phần cấu trúc duy nhất xác định hoạt động của toàn bộ ứng dụng.

Các thành phần ứng dụng có thể được phân thành một trong bốn loại. Mỗi loại thành phần được thiết kế cho một mục đích cụ thể và có mục đích riêng vòng đời, xác định cách thành phần được tạo và kết thúc.

Bốn loại thành phần:

Hoạt động Hoạt động là một màn hình có giao diện người dùng. Ví dụ: trong một ứng dụng email, một thao tác có thể được sử dụng để hiển thị danh sách các thư mới, một thao tác khác để soạn thư và thao tác thứ ba để đọc thư. Mặc dù các hoạt động cùng nhau tạo nên trải nghiệm người dùng gắn kết với ứng dụng email nhưng mỗi hoạt động đều độc lập với các hoạt động khác. Bất kỳ thao tác nào trong số này đều có thể được bắt đầu bởi một ứng dụng khác (nếu ứng dụng email cho phép điều đó). Ví dụ: ứng dụng máy ảnh có thể kích hoạt một hoạt động trong ứng dụng email soạn thư mới để người dùng có thể gửi ảnh.

Hoạt động này là một lớp con của lớp. Để biết thêm thông tin về điều này, vui lòng tham khảo hướng dẫn dành cho nhà phát triển trong bài viết này.

Dịch vụ Dịch vụ là một thành phần chạy ở chế độ nền và thực hiện các hoạt động tiêu tốn thời gian liên quan đến hoạt động của các tiến trình từ xa. Dịch vụ này không có giao diện người dùng. Ví dụ: nó có thể phát nhạc ở chế độ nền trong khi người dùng đang làm việc trên một ứng dụng khác hoặc có thể nhận dữ liệu qua mạng mà không chặn sự tương tác của người dùng với thao tác. Một dịch vụ có thể được khởi động bởi một thành phần khác, sau đó tương tác với nó, chẳng hạn như một thao tác.

Dịch vụ là một lớp con của lớp. Để biết thêm thông tin về điều này, vui lòng tham khảo hướng dẫn dành cho nhà phát triển trong bài viết này.

Các nhà cung cấp nội dung Các nhà cung cấp Nhà cung cấp nội dung quản lý tập dữ liệu tổng thể của ứng dụng. Dữ liệu có thể được lưu trữ trong hệ thống tập tin, cơ sở dữ liệu Dữ liệu SQLite, Internet hoặc bất kỳ vị trí lưu trữ liên tục nào khác mà ứng dụng của bạn có quyền truy cập. Thông qua nhà cung cấp nội dung, các ứng dụng khác có thể truy vấn hoặc thậm chí sửa đổi dữ liệu (nếu nhà cung cấp nội dung cho phép họ làm như vậy). Ví dụ: hệ thống Android có nhà cung cấp nội dung quản lý thông tin liên hệ của người dùng. Bất kỳ ứng dụng nào có quyền thích hợp đều có thể yêu cầu một phần của nhà cung cấp nội dung này (chẳng hạn như ) đọc và ghi thông tin về một người cụ thể.

Nhà cung cấp nội dung cũng được sử dụng để đọc và ghi dữ liệu mà ứng dụng không tiếp xúc với các thành phần bên ngoài. Ví dụ: ứng dụng mẫu sử dụng nhà cung cấp nội dung để lưu ghi chú.

Nhà cung cấp nội dung là một lớp con của . Nó phải triển khai một bộ API tiêu chuẩn mà các ứng dụng khác sẽ sử dụng để thực hiện các giao dịch. Để biết thêm chi tiết, hãy xem hướng dẫn dành cho nhà phát triển trong bài viết này.

Người nhận tin nhắn quảng bá Phát sóng thu là một thành phần đáp ứng các quảng cáo được phân phối trên toàn hệ thống. Nhiều thông báo trong số này được hệ thống gửi đi, chẳng hạn như thông báo rằng màn hình đã tắt, pin yếu hoặc ảnh đã được chụp. Thông báo cũng có thể được gửi bởi các ứng dụng, chẳng hạn như để cho các ứng dụng khác biết rằng một số dữ liệu đã được tải xuống thiết bị và hiện đã sẵn sàng để sử dụng. Mặc dù máy thu quảng bá không có giao diện người dùng nhưng chúng có thể cảnh báo người dùng về một sự kiện "thông báo". Tuy nhiên, hầu hết chúng chỉ đơn giản là một "cửa ngõ" cho các thành phần khác và được thiết kế để thực hiện một lượng công việc tối thiểu. Ví dụ: họ có thể kích hoạt một dịch vụ để thực hiện các hành động cụ thể khi một sự kiện xảy ra.

Bộ thu quảng bá là một lớp con của lớp và mỗi thông báo quảng bá được hiển thị dưới dạng một đối tượng. Xem hướng dẫn lớp học để biết chi tiết.

Tính năng độc đáo Hệ thống Android là bất kỳ ứng dụng nào cũng có thể khởi chạy một thành phần của ứng dụng khác. Ví dụ: nếu bạn muốn cung cấp cho người dùng khả năng chụp ảnh bằng camera của thiết bị thì có thể có một ứng dụng khác có thể thực hiện hành động này, thay vì thiết kế thao tác ảnh trong ứng dụng của bạn, bạn có thể gọi đó là ứng dụng. Bạn không cần nhúng mã từ ứng dụng máy ảnh hoặc thậm chí không cần liên kết đến nó. Thay vào đó, bạn chỉ cần khởi chạy thao tác chụp ảnh từ ứng dụng máy ảnh. Sau khi thao tác này hoàn tất, ảnh sẽ được đưa trở lại ứng dụng của bạn và sẵn sàng để sử dụng. Đối với người dùng nó sẽ giống như một ứng dụng.

Khi hệ thống khởi động một thành phần, nó sẽ khởi động một quy trình cho ứng dụng đó (nếu nó chưa chạy) và tạo các phiên bản của các lớp mà thành phần đó yêu cầu. Ví dụ: nếu ứng dụng của bạn bắt đầu thao tác ảnh trong ứng dụng máy ảnh thì thao tác đó sẽ chạy trong quy trình thuộc về ứng dụng bên thứ ba đó chứ không phải trong quy trình của ứng dụng của bạn. Do đó, không giống như các ứng dụng của hầu hết các hệ thống khác, ứng dụng Android không có một điểm vào duy nhất (ví dụ: chúng không có hàm main()).

Vì hệ thống chạy mỗi ứng dụng trong một quy trình riêng biệt với các quyền truy cập tệp hạn chế quyền truy cập vào các ứng dụng khác nên ứng dụng của bạn không thể gọi trực tiếp một thành phần từ ứng dụng khác. Điều này có thể được thực hiện bởi chính hệ thống Android. Do đó, để gọi một thành phần trong ứng dụng khác, bạn cần thông báo cho hệ thống về ý định của mình ( ý định) khởi chạy một thành phần cụ thể. Sau đó hệ thống sẽ kích hoạt thành phần này cho bạn.

Kích hoạt thành phần

Thành phần của ba trong số bốn các loại có thể- hoạt động, dịch vụ và người nhận tin nhắn quảng bá - được kích hoạt bởi một tin nhắn không đồng bộ được gọi là ý định(chủ đích). Các đối tượng có ý định giao tiếp với nhau các thành phần riêng lẻ trong thời gian chạy, cho dù chúng là thành phần của ứng dụng của bạn hay ứng dụng của bên thứ ba (các đối tượng Intent này có thể được coi là sứ giả gửi yêu cầu đến các thành phần khác để thực hiện hành động).

Một đối tượng Intent được tạo bằng cách sử dụng a , mô tả yêu cầu kích hoạt một thành phần cụ thể hoặc một thành phần của một thành phần cụ thể kiểu- theo đó, Ý định có thể rõ ràng hoặc ngầm định.

Đối với các hoạt động và dịch vụ, đối tượng Intent chỉ định hành động sẽ được thực hiện (ví dụ: xem hoặc gửi nội dung nào đó) và cũng có thể chỉ ra URI (Mã định danh tài nguyên đồng nhất) ​​của dữ liệu mà hành động này sẽ được thực hiện. (trong số những thông tin khác mà thành phần được khởi chạy cần biết). Ví dụ: một đối tượng Intent có thể truyền tải yêu cầu thực hiện thao tác "hiển thị hình ảnh" hoặc "mở trang web". Trong một số trường hợp, một thao tác có thể được thực hiện để tạo ra kết quả. Trong trường hợp này, thao tác cũng trả về kết quả dưới dạng một đối tượng (ví dụ: bạn có thể gửi một thông báo Ý định để cho phép người dùng chọn một liên hệ và trả lại cho bạn - thông báo Phản hồi ý định sẽ chứa một URI trỏ đến liên hệ đã chọn) .

Đối với người nhận tin nhắn quảng bá, Ý định chỉ cần chỉ định quảng cáo sẽ được truyền đi (ví dụ: tin nhắn quảng bá pin yếu chỉ chứa chuỗi "pin yếu").

Các thành phần thuộc loại thứ tư—nhà cung cấp nội dung—không được kích hoạt bởi các thông báo Intent. Chúng được kích hoạt theo yêu cầu từ . Trình phân giải nội dung xử lý tất cả các giao dịch trực tiếp với nhà cung cấp nội dung để thành phần thực hiện giao dịch với nhà cung cấp không phải làm như vậy. Thay vào đó, nó gọi các phương thức trên . Lớp này tạo thành một lớp trừu tượng hóa (vì mục đích bảo mật) nhà cung cấp nội dung khỏi thành phần yêu cầu thông tin.

Có các phương pháp riêng biệt để kích hoạt các thành phần của từng loại:

  • Bạn có thể bắt đầu một thao tác (hoặc xác định một số hành động mới cho nó) bằng cách chuyển một đối tượng tới phương thức hoặc (nếu bạn muốn thao tác trả về một kết quả).
  • Bạn có thể khởi động một dịch vụ (hoặc đưa ra hướng dẫn mới cho dịch vụ đang chạy) bằng cách chuyển một đối tượng tới . Ngoài ra, bạn có thể thiết lập liên kết với dịch vụ bằng cách chuyển đối tượng tới .
  • Bạn có thể bắt đầu gửi tin nhắn bằng cách chuyển một đối tượng tới các phương thức như , và .
  • Bạn có thể truy vấn nhà cung cấp nội dung bằng cách gọi một phương thức trên .

Để biết chi tiết về cách sử dụng Ý định, hãy xem tài liệu. Để biết thêm thông tin về cách kích hoạt một số thành phần nhất định, hãy xem các tài liệu sau: , và .

Tệp kê khai

Để chạy một thành phần ứng dụng, Android cần biết thành phần đó có tồn tại hay không. Để thực hiện việc này, nó đọc tệp AndroidManifest.xml (tệp kê khai) của ứng dụng. Tệp này phải nằm trong thư mục gốc của ứng dụng và phải khai báo tất cả các thành phần ứng dụng.

Ngoài việc khai báo các thành phần ứng dụng, tệp kê khai còn phục vụ các mục đích khác, bao gồm:

  • Chỉ định bất kỳ quyền nào của người dùng mà ứng dụng yêu cầu, chẳng hạn như quyền truy cập Internet hoặc đọc danh bạ của người dùng;
  • khai báo mức tối thiểu mà ứng dụng yêu cầu, dựa trên loại API mà nó sử dụng;
  • công bố phần cứng và chức năng phần mềm mà ứng dụng cần hoặc sử dụng, chẳng hạn như máy ảnh, dịch vụ Bluetooth hoặc màn hình cảm ứng;
  • chỉ định các thư viện API mà ứng dụng sẽ được liên kết (ngoài các API nền tảng Android), chẳng hạn như thư viện Google Maps;
  • và nhiều hơn nữa.

Khai báo thành phần

Nhiệm vụ chính của bảng kê khai là thông báo cho hệ thống về các thành phần của ứng dụng. Ví dụ: tệp kê khai có thể khai báo một thao tác như thế này:

...

Để biết chi tiết về cấu trúc tệp kê khai cho một ứng dụng, hãy xem tài liệu.

Khai báo khả năng của thành phần

Như đã thảo luận trong phần này, bạn có thể sử dụng đối tượng để bắt đầu các hoạt động, dịch vụ và bộ thu quảng bá. Để làm điều này, bạn phải xác định rõ ràng tên của thành phần đích trong đối tượng Intent (sử dụng tên lớp thành phần). Tuy nhiên, toàn bộ khả năng của đối tượng Intent được bộc lộ khi sử dụng khái niệm ý định ngầm. Thông báo Ý định ẩn chỉ mô tả loại hành động bạn muốn thực hiện (và, mặc dù không bắt buộc, dữ liệu mà bạn muốn thực hiện hành động đó). Hệ thống có cơ hội tìm thấy một thành phần trên thiết bị có thể thực hiện hành động này và khởi chạy nó. Nếu có nhiều thành phần có thể thực hiện hành động được mô tả trong thông báo Ý định, người dùng sẽ chọn thành phần nào sẽ được sử dụng.

Hệ thống xác định các thành phần có thể phản hồi tin nhắn Intent bằng cách so sánh tin nhắn Intent nhận được với Bộ lọc đối tượng ý định,được chỉ định trong tệp kê khai của các ứng dụng khác có sẵn trên thiết bị.

Khi khai báo một hoạt động trong bảng kê khai của ứng dụng, bạn có thể tùy ý chỉ định các bộ lọc đối tượng Intent để chỉ định các khả năng của hoạt động đó để hoạt động đó có thể phản hồi các thông báo Intent từ các ứng dụng khác. Để khai báo bộ lọc Ý định cho thành phần của mình, bạn phải thêm một phần tử làm phần tử con của phần tử khai báo thành phần.

Ví dụ: nếu bạn đã tạo một ứng dụng email có thao tác soạn thư mới, bạn có thể khai báo một bộ lọc để phản hồi các Ý định thuộc loại "gửi" (để gửi email mới) như sau:

...

Sau đó, nếu một ứng dụng khác tạo một đối tượng Intent với một hành động và chuyển nó tới , hệ thống có thể kích hoạt hoạt động của bạn, cung cấp cho người dùng khả năng viết và gửi email.

Để biết chi tiết về cách tạo bộ lọc đối tượng Intent, hãy xem tài liệu.

Khai báo yêu cầu ứng dụng

Có một số lượng lớn thiết bị chạy Android và không phải tất cả chúng đều có chức năng giống nhau. Để ngăn cài đặt ứng dụng của bạn trên các thiết bị thiếu các tính năng mà ứng dụng của bạn yêu cầu, điều quan trọng là phải xác định rõ cấu hình cho các loại thiết bị được ứng dụng của bạn hỗ trợ bằng cách chỉ định các yêu cầu về phần cứng và phần mềm trong tệp kê khai. Những quảng cáo này chủ yếu mang tính chất thông tin; hệ thống không đọc chúng. Tuy nhiên, chúng được các dịch vụ bên ngoài như Google Play đọc để cung cấp tính năng lọc cho người dùng đang tìm kiếm ứng dụng cho thiết bị của họ.

Ví dụ: nếu ứng dụng của bạn yêu cầu máy ảnh và sử dụng API từ Android 2.1 (7), thì các cài đặt này phải được khai báo là yêu cầu trong tệp kê khai như sau:

...

Bây giờ, ứng dụng của bạn sẽ không thể cài đặt được từ Google Play trên các thiết bị có KHÔNG máy ảnh cũng như trên các thiết bị chạy phiên bản Android dưới 2.1.

Tuy nhiên, bạn cũng có thể khai báo rằng ứng dụng sử dụng camera nhưng không cần thiết để nó hoạt động. hoàn toàn cần thiết. Trong trường hợp này, ứng dụng phải đặt thuộc tính thành "false" và trong thời gian chạy, ứng dụng phải kiểm tra xem thiết bị có camera hay không và nếu cần, hãy tắt các chức năng sử dụng camera của thiết bị.

Để biết thêm thông tin về cách quản lý khả năng tương thích giữa các thiết bị của ứng dụng, hãy xem tài liệu.

Tài nguyên ứng dụng

Một ứng dụng Android không chỉ được tạo thành từ mã; nó còn yêu cầu các tài nguyên tồn tại tách biệt với mã nguồn, chẳng hạn như hình ảnh, tệp âm thanh và bất kỳ thứ gì khác dùng để trình bày ứng dụng một cách trực quan. Ví dụ: bạn cần xác định hoạt ảnh, menu, kiểu, màu sắc và bố cục của giao diện người dùng hoạt động trong tệp XML. Bằng cách sử dụng tài nguyên ứng dụng, bạn có thể dễ dàng thay đổi các đặc điểm khác nhau của ứng dụng mà không cần thay đổi mã và bằng cách cung cấp các bộ tài nguyên thay thế, bạn có thể tối ưu hóa ứng dụng của mình để hoạt động với các cấu hình thiết bị khác nhau (ví dụ: các ngôn ngữ hoặc kích thước màn hình khác nhau) .

Đối với mỗi tài nguyên có trong dự án Android, các công cụ SDK chỉ định một mã định danh số nguyên duy nhất có thể được sử dụng để tham chiếu tài nguyên từ mã ứng dụng hoặc từ các tài nguyên khác được xác định trong XML. Ví dụ: nếu ứng dụng của bạn có tệp hình ảnh có tên logo.png (được lưu trong thư mục res/drawable/), các công cụ SDK sẽ tạo mã định danh tài nguyên có tên R.drawable.logo có thể được sử dụng để tham chiếu hình ảnh và chèn nó vào giao diện của người dùng.

Một trong những khía cạnh quan trọng nhất của việc cung cấp tài nguyên tách biệt với mã nguồn là khả năng sử dụng các tài nguyên thay thế cho các cấu hình thiết bị khác nhau. Ví dụ: bằng cách xác định các chuỗi UI trong XML, bạn có thể dịch chúng sang các ngôn ngữ khác và lưu trữ các bản dịch đó trong các tệp riêng biệt. Sau đó bởi vòng loại ngôn ngữ được thêm vào tên thư mục tài nguyên (giả sử res/values-fr/ đối với chuỗi tiếng Pháp) và ngôn ngữ do người dùng chọn, Android sẽ áp dụng chuỗi bằng ngôn ngữ thích hợp cho giao diện người dùng của bạn.

Android hỗ trợ khác nhau vòng loại cho các tài nguyên liên quan. Vòng loại là một chuỗi ngắn được bao gồm trong tên thư mục tài nguyên để xác định cấu hình thiết bị mà những tài nguyên đó sẽ được sử dụng. Một ví dụ khác, bạn nên tạo các bố cục khác nhau cho các thao tác của mình để phù hợp với kích thước và hướng màn hình của thiết bị. Ví dụ: khi màn hình thiết bị ở hướng dọc (đặt theo chiều dọc), các nút trong bố cục cũng có thể được đặt theo chiều dọc và khi màn hình ở hướng ngang (hướng ngang), các nút nên được đặt theo chiều ngang. Để đảm bảo bố cục thay đổi khi hướng màn hình thay đổi, bạn có thể xác định hai bố cục khác nhau và áp dụng bộ hạn định thích hợp cho tên thư mục của từng bố cục. Sau đó, hệ thống sẽ tự động áp dụng bố cục phù hợp dựa trên hướng của thiết bị.

Cung cấp tài nguyên Mô tả cấu trúc của ứng dụng Android, trong đó tài nguyên ứng dụng tồn tại tách biệt với mã của nó và cách cung cấp tài nguyên thay thế cho một số cấu hình thiết bị nhất định.

Bạn cũng có thể quan tâm đến:

Tìm hiểu cách Android hoạt động trên các loại thiết bị khác nhau và thông tin chung về cách tối ưu hóa ứng dụng của bạn cho từng thiết bị hoặc giới hạn các thiết bị có thể cài đặt ứng dụng của bạn. Tìm hiểu cách Android giới hạn quyền truy cập của ứng dụng vào một số API nhất định thông qua hệ thống quyền yêu cầu sự đồng ý của người dùng trước khi ứng dụng của bạn có thể sử dụng các API đó.

Bạn đã bao giờ tự hỏi fastboot hay ADB hoạt động như thế nào chưa? Hay tại sao gần như không thể biến một chiếc smartphone chạy Android thành cục gạch? Hoặc có thể từ lâu bạn đã muốn biết sự kỳ diệu của khung Xpose nằm ở đâu và tại sao cần có tập lệnh khởi động /system/etc/init.d? Còn bảng điều khiển phục hồi thì sao? Đây có phải là một phần của Android hay bản thân nó là một thứ gì đó và tại sao việc khôi phục thông thường không phù hợp để cài đặt chương trình cơ sở của bên thứ ba? Bạn sẽ tìm thấy câu trả lời cho tất cả những câu hỏi này và nhiều câu hỏi khác trong bài viết này.

Cách Android hoạt động

Bạn có thể tìm hiểu về những khả năng tiềm ẩn của hệ thống phần mềm bằng cách hiểu nguyên tắc hoạt động của chúng. Trong một số trường hợp, điều này khó thực hiện vì mã hệ thống có thể bị đóng, nhưng trong trường hợp của Android, chúng ta có thể nghiên cứu toàn bộ hệ thống từ trong ra ngoài. Trong bài viết này, tôi sẽ không nói về tất cả các sắc thái của Android và sẽ chỉ tập trung vào cách hệ điều hành khởi động và những sự kiện nào diễn ra trong khoảng thời gian từ khi nhấn nút nguồn đến khi màn hình xuất hiện.

Đồng thời, tôi sẽ giải thích những gì chúng ta có thể thay đổi trong chuỗi sự kiện này và cách các nhà phát triển chương trình cơ sở tùy chỉnh sử dụng những khả năng này để triển khai những việc như điều chỉnh các tham số hệ điều hành, mở rộng không gian lưu trữ ứng dụng, trao đổi kết nối, các tùy chỉnh khác nhau, v.v. Tất cả thông tin này có thể được sử dụng để tạo chương trình cơ sở của riêng bạn và thực hiện nhiều cách hack và sửa đổi khác nhau.

Bước một. ABOOT và bảng phân vùng

Tất cả bắt đầu với bộ nạp khởi động chính. Sau khi bật nguồn, hệ thống sẽ thực thi mã bootloader được lưu trong bộ nhớ vĩnh viễn của thiết bị. Sau đó, nó chuyển quyền điều khiển cho bộ tải khởi động aboot có hỗ trợ tích hợp cho giao thức fastboot, nhưng nhà sản xuất chip di động hoặc điện thoại thông minh/máy tính bảng có quyền chọn bất kỳ bộ tải khởi động nào khác mà mình lựa chọn. Ví dụ: Rockchip sử dụng bộ tải khởi động riêng không tương thích với fastboot và yêu cầu các công cụ độc quyền để flash và quản lý.

Ngược lại, giao thức fastboot là một hệ thống quản lý bộ nạp khởi động từ PC, cho phép bạn thực hiện các hành động như mở khóa bộ nạp khởi động, flash kernel mới và khôi phục, cài đặt chương trình cơ sở và nhiều thứ khác. Mục đích của fastboot là có thể khôi phục điện thoại thông minh về trạng thái ban đầu trong tình huống mà tất cả các phương tiện khác đều không thành công. Fastboot sẽ vẫn giữ nguyên ngay cả khi do thử nghiệm, bạn xóa tất cả các phân vùng bộ nhớ NAND chứa Android và khôi phục khỏi điện thoại thông minh của mình.

Sau khi nhận được quyền kiểm soát, aboot sẽ kiểm tra bảng phân vùng và chuyển quyền điều khiển sang kernel được flash vào phân vùng có tên boot, sau đó kernel trích xuất hình ảnh RAM từ cùng phân vùng vào bộ nhớ và bắt đầu tải Android hoặc bảng điều khiển khôi phục. Bộ nhớ NAND trong thiết bị Android được chia thành sáu phần bắt buộc có điều kiện:

  • boot - chứa kernel và đĩa RAM, thường có kích thước khoảng 16 MB;
  • recovery - bảng điều khiển khôi phục, bao gồm kernel, một bộ ứng dụng bảng điều khiển và tệp cài đặt, kích thước 16 MB;
  • hệ thống - chứa Android, trong các thiết bị hiện đại, kích thước tối thiểu là 1 GB;
  • bộ đệm - được thiết kế để lưu trữ dữ liệu được lưu trong bộ nhớ đệm, cũng được sử dụng để lưu chương trình cơ sở trong quá trình cập nhật OTA và do đó có kích thước tương tự như kích thước của phân vùng hệ thống;
  • dữ liệu người dùng - chứa các cài đặt, ứng dụng và dữ liệu người dùng, tất cả dung lượng bộ nhớ NAND còn lại được phân bổ cho nó;
  • misc - chứa cờ xác định hệ thống sẽ khởi động ở chế độ nào: Android hoặc recovery.

Ngoài chúng, có thể còn có các phần khác, nhưng đánh dấu chung được xác định ở giai đoạn thiết kế của điện thoại thông minh và, trong trường hợp aboot, được đưa vào mã bộ nạp khởi động. Điều này có nghĩa là: 1) bảng phân vùng không thể bị hủy vì nó luôn có thể được khôi phục bằng lệnh fastboot oem format; 2) để thay đổi bảng phân vùng, bạn sẽ phải mở khóa và khởi động lại bộ nạp khởi động với các tham số mới. Tuy nhiên, có những ngoại lệ cho quy tắc này. Ví dụ: bootloader của cùng một Rockchip lưu trữ thông tin về các phân vùng trong khối đầu tiên của bộ nhớ NAND, do đó không cần flash bootloader để thay đổi nó.

Phần linh tinh đặc biệt thú vị. Có giả định rằng ban đầu nó được tạo ra để lưu trữ các cài đặt khác nhau độc lập với hệ thống chính, nhưng hiện tại, nó chỉ được sử dụng cho một mục đích: cho bộ nạp khởi động biết hệ thống sẽ được tải từ phân vùng nào - khởi động hoặc khôi phục. Đặc biệt, tính năng này được ứng dụng Trình quản lý ROM sử dụng để tự động khởi động lại hệ thống vào chế độ khôi phục bằng cách tự động cài đặt chương trình cơ sở. Trên cơ sở đó, cơ chế khởi động kép Ubuntu Touch được xây dựng, giúp đưa bộ tải khởi động Ubuntu vào trạng thái khôi phục và cho phép bạn kiểm soát hệ thống nào sẽ khởi động vào lần tiếp theo. Đã xóa phân vùng linh tinh - Tải Android, chứa đầy dữ liệu - tải khôi phục... nghĩa là Ubuntu Touch.

Bước hai. Phần khởi động

Nếu phần linh tinh không có cờ khởi động khôi phục, aboot sẽ chuyển quyền điều khiển sang mã nằm trong phần khởi động. Đây không gì khác hơn là nhân Linux; nó nằm ở đầu phần và ngay sau đó là hình ảnh đĩa RAM được đóng gói bằng trình lưu trữ cpio và gzip, chứa các thư mục cần thiết để Android hoạt động, hệ thống khởi tạo init và các công cụ khác. Không có hệ thống tập tin trên phân vùng khởi động; hạt nhân và đĩa RAM chỉ nối tiếp nhau. Nội dung của đĩa RAM là:

  • dữ liệu - thư mục để gắn phân vùng cùng tên;
  • dev - tập tin thiết bị;
  • proc - procfs được gắn ở đây;
  • res - một bộ hình ảnh cho bộ sạc (xem bên dưới);
  • sbin - một tập hợp các tiện ích tiện ích và daemon (ví dụ adbd);
  • sys - sysfs được gắn ở đây;
  • hệ thống - thư mục để gắn phân vùng hệ thống;
  • bộ sạc - ứng dụng hiển thị quá trình sạc;
  • build.prop - cài đặt hệ thống;
  • init - hệ thống khởi tạo;
  • init.rc - cài đặt hệ thống khởi tạo;
  • ueventd.rc - cài đặt của daemon uventd có trong init.

Có thể nói, đây là bộ xương của hệ thống: một tập hợp các thư mục để kết nối các hệ thống tệp từ các phân vùng bộ nhớ NAND và một hệ thống khởi tạo sẽ xử lý phần còn lại của công việc khởi động hệ thống. Thành phần trung tâm ở đây là ứng dụng init và cấu hình init.rc của nó, mà tôi sẽ nói chi tiết sau. Trong thời gian chờ đợi, tôi muốn bạn chú ý đến các tệp bộ sạc và ueventd.rc, cũng như các thư mục sbin, proc và sys.

File sạc là một ứng dụng nhỏ có nhiệm vụ duy nhất là hiển thị biểu tượng pin. Nó không liên quan gì đến Android và được sử dụng khi thiết bị được kết nối với bộ sạc ở trạng thái tắt. Trong trường hợp này, Android không tải và hệ thống chỉ cần tải kernel, kết nối đĩa RAM và khởi động bộ sạc. Cái sau hiển thị biểu tượng pin, hình ảnh ở tất cả các trạng thái có thể được lưu trữ trong các tệp PNG thông thường bên trong thư mục res.

Tệp ueventd.rc là cấu hình xác định tệp thiết bị nào trong thư mục sys sẽ được tạo trong quá trình khởi động hệ thống. Trong các hệ thống dựa trên nhân Linux, việc truy cập vào phần cứng được thực hiện thông qua các tệp đặc biệt bên trong thư mục dev và daemon ueventd, một phần của init, chịu trách nhiệm tạo ra chúng trong Android. Trong tình huống bình thường, nó hoạt động ở chế độ tự động, chấp nhận các lệnh tạo tệp từ kernel, nhưng một số tệp cần được tạo độc lập. Chúng được liệt kê trong ueventd.rc.

Thư mục sbin trong kho Android thường không chứa bất cứ thứ gì ngoại trừ adbd, tức là daemon ADB, chịu trách nhiệm gỡ lỗi hệ thống khỏi PC. Nó chạy ở giai đoạn đầu khởi động hệ điều hành và cho phép bạn xác định các sự cố có thể xảy ra trong giai đoạn khởi tạo hệ điều hành. Trong phần sụn tùy chỉnh, bạn có thể tìm thấy một loạt tệp khác trong thư mục này, ví dụ như mke2fs, có thể được yêu cầu nếu phân vùng cần được định dạng lại thành ext3/4. Ngoài ra, các modder thường đặt BusyBox ở đó, nơi bạn có thể gọi hàng trăm lệnh Linux.

Thư mục proc là tiêu chuẩn cho Linux; trong các giai đoạn khởi động tiếp theo, init sẽ kết nối với nó procfs, một hệ thống tệp ảo cung cấp quyền truy cập vào thông tin về tất cả các quy trình trên hệ thống. Hệ thống sẽ kết nối sysfs với thư mục sys, thư mục này mở ra quyền truy cập vào thông tin về phần cứng và cài đặt của nó. Ví dụ: bằng cách sử dụng sysfs, bạn có thể đặt thiết bị ở chế độ ngủ hoặc thay đổi thuật toán tiết kiệm năng lượng được sử dụng.

Tệp build.prop được thiết kế để lưu trữ cài đặt Android cấp thấp. Sau đó, hệ thống sẽ đặt lại các cài đặt này và ghi đè chúng bằng các giá trị từ tệp system/build.prop hiện không thể truy cập được.


Bài học rút ra từ văn bản

  • Fastboot sẽ vẫn giữ nguyên ngay cả khi do thử nghiệm, bạn xóa nội dung của tất cả các phần bộ nhớ NAND khỏi điện thoại thông minh của mình
  • Phần khôi phục hoàn toàn tự cung cấp và chứa một hệ điều hành thu nhỏ không hề liên quan đến Android
  • Bằng cách sửa đổi một chút tệp fstab, chúng ta có thể buộc init khởi động hệ thống từ thẻ nhớ

Bước hai, thay thế. Phần phục hồi

Nếu cờ khởi động khôi phục trong phần linh tinh được đặt hoặc người dùng bật điện thoại thông minh với phím giảm âm lượng được giữ, aboot sẽ chuyển quyền điều khiển sang mã nằm ở đầu phần khôi phục. Giống như phân vùng khởi động, nó chứa kernel và một đĩa RAM, được giải nén vào bộ nhớ và trở thành gốc của hệ thống tập tin. Tuy nhiên, nội dung của đĩa RAM ở đây hơi khác một chút.

Không giống như phân vùng khởi động, hoạt động như một liên kết chuyển tiếp giữa các giai đoạn tải hệ điều hành khác nhau, phân vùng khôi phục hoàn toàn tự cung cấp và chứa một hệ điều hành thu nhỏ không được kết nối với Android. Recovery có lõi riêng, bộ ứng dụng (lệnh) riêng và giao diện riêng cho phép người dùng kích hoạt các chức năng dịch vụ.

Trong quá trình khôi phục tiêu chuẩn (stock) thường chỉ có ba chức năng như vậy: cài đặt chương trình cơ sở được ký bằng khóa của nhà sản xuất điện thoại thông minh, xóa và khởi động lại. Các bản khôi phục đã được sửa đổi của bên thứ ba, chẳng hạn như ClockworkMod và TWRP, có nhiều chức năng hơn. Họ có thể định dạng hệ thống tệp, cài đặt chương trình cơ sở được ký bằng bất kỳ khóa nào (đọc: tùy chỉnh), gắn hệ thống tệp trên các phân vùng khác (cho mục đích gỡ lỗi hệ điều hành) và bao gồm hỗ trợ tập lệnh, cho phép bạn tự động hóa quy trình chương trình cơ sở và nhiều chức năng khác.

Ví dụ: bằng cách sử dụng tập lệnh, bạn có thể đảm bảo rằng sau khi khởi động, recovery sẽ tự động tìm phần sụn cần thiết trên thẻ nhớ, cài đặt chúng và khởi động lại vào Android. Tính năng này được sử dụng bởi Trình quản lý ROM, các công cụ tự động flasher, cũng như cơ chế cập nhật tự động cho CyanogenMod và các chương trình cơ sở khác.

Khôi phục tùy chỉnh cũng hỗ trợ các tập lệnh sao lưu nằm trong thư mục /system/addon.d/. Trước khi flash, recovery sẽ kiểm tra các tập lệnh và thực thi chúng trước khi flash firmware. Nhờ những tập lệnh như vậy, GAP không biến mất sau khi cài đặt phiên bản phần sụn mới.

lệnh khởi động nhanh

Để truy cập fastboot, bạn cần cài đặt SDK Android, kết nối điện thoại thông minh với PC bằng cáp và bật nó bằng cách giữ cả hai nút âm lượng. Sau này, bạn nên đi tới thư mục con platform-tools bên trong SDK và chạy lệnh

Thiết bị Fastboot

Tên thiết bị sẽ được hiển thị trên màn hình. Các lệnh có sẵn khác:

  • mở khóa oem Fatboot- mở khóa bootloader trên Nexus;
  • cập nhật tập tin.zip- cài đặt phần sụn;
  • flash boot boot.img- nhấp nháy hình ảnh phân vùng khởi động;
  • phục hồi flash recovery.img- nhấp nháy hình ảnh phân vùng phục hồi;
  • hệ thống flash system.img- nhấp nháy hình ảnh hệ thống;
  • định dạng oem- khôi phục bảng phân vùng bị phá hủy;

Bước thứ ba. Khởi tạo

Vì vậy, sau khi nhận được quyền kiểm soát, hạt nhân sẽ kết nối đĩa RAM và sau khi khởi tạo tất cả các hệ thống con và trình điều khiển của nó, bắt đầu quá trình init, quá trình này bắt đầu quá trình khởi tạo Android. Như tôi đã nói, init có một tệp cấu hình init.rc, từ đó quy trình sẽ tìm hiểu chính xác những gì nó phải làm để đưa hệ thống lên. Trong điện thoại thông minh hiện đại, cấu hình này có độ dài ấn tượng vài trăm dòng và cũng được trang bị một đoạn giới thiệu gồm một số cấu hình con được kết nối với cấu hình chính bằng lệnh nhập. Tuy nhiên, định dạng của nó khá đơn giản và về cơ bản là một tập hợp các lệnh được chia thành các khối.

Mỗi khối xác định một giai đoạn tải hoặc theo cách nói của nhà phát triển Android, một hành động. Các khối được phân tách với nhau bằng lệnh on theo sau là tên của hành động, chẳng hạn như trên init sớm hoặc trên post-fs. Khối lệnh sẽ chỉ được thực thi nếu kích hoạt cùng tên kích hoạt. Khi khởi động, init sẽ lần lượt kích hoạt các trình kích hoạt Early-init, init, Early-fs, fs, post-fs, Early-boot và boot, do đó khởi chạy các khối lệnh tương ứng.


Nếu tệp cấu hình kéo theo một số cấu hình khác được liệt kê ở đầu (và điều này hầu như luôn luôn như vậy), thì các khối lệnh có cùng tên bên trong chúng sẽ được kết hợp với cấu hình chính, để khi kích hoạt kích hoạt, init sẽ thực thi các lệnh từ các khối tương ứng của tất cả các tệp. Điều này được thực hiện để thuận tiện cho việc tạo tệp cấu hình cho một số thiết bị, khi cấu hình chính chứa các lệnh chung cho tất cả các thiết bị và những lệnh dành riêng cho từng thiết bị được ghi trong các tệp riêng biệt.

Cấu hình bổ sung đáng chú ý nhất có tên initrc.device_name.rc, trong đó tên thiết bị được xác định tự động dựa trên nội dung của biến hệ thống ro.hardware. Đây là tệp cấu hình dành riêng cho nền tảng có chứa các khối lệnh dành riêng cho thiết bị. Ngoài các lệnh chịu trách nhiệm điều chỉnh kernel, nó còn chứa một số thứ như thế này:

Mount_all ./fstab.device_name

Điều đó có nghĩa là init bây giờ sẽ gắn kết tất cả các hệ thống tệp được liệt kê trong tệp ./fstab.device_name, có cấu trúc sau:

Tên_thiết bị (phân vùng) mount_point file_system fs_options các tùy chọn khác

Nó thường chứa các hướng dẫn để gắn hệ thống tệp từ các phân vùng NAND bên trong vào các thư mục /system (OS), /data (cài đặt ứng dụng) và /cache (dữ liệu được lưu trong bộ nhớ cache). Tuy nhiên, bằng cách sửa đổi một chút tệp này, chúng ta có thể buộc init khởi động hệ thống từ thẻ nhớ. Để làm điều này, chỉ cần chia thẻ nhớ thành ba phần 4: 1 GB/ext4, 2 GB/ext4, 1 GB/ext4 và dung lượng fat32 còn lại. Tiếp theo, bạn cần xác định tên của các phân vùng thẻ nhớ trong thư mục /dev (chúng khác nhau đối với các thiết bị khác nhau) và thay thế chúng bằng tên thiết bị gốc trong tệp fstab.


Ở cuối khối init khởi động, rất có thể nó sẽ gặp lệnh mặc định class_start, lệnh này sẽ thông báo cho bạn rằng sau đó bạn nên khởi động tất cả các dịch vụ được liệt kê trong cấu hình có liên quan đến lớp mặc định. Mô tả dịch vụ bắt đầu bằng chỉ thị dịch vụ, theo sau là tên của dịch vụ và lệnh phải được thực thi để khởi động dịch vụ đó. Không giống như các lệnh được liệt kê trong các khối, các dịch vụ phải chạy mọi lúc, vì vậy trong suốt vòng đời của điện thoại thông minh, init sẽ treo ở chế độ nền và giám sát việc này.

Android hiện đại bao gồm hàng tá dịch vụ, nhưng hai trong số đó có vị thế đặc biệt và quyết định toàn bộ vòng đời của hệ thống.

Lệnh init.rc

Quá trình init có một bộ lệnh cài sẵn, nhiều lệnh trong số đó tuân theo bộ lệnh Linux tiêu chuẩn. Đáng chú ý nhất trong số đó:

  • thực thi/đường dẫn/đến/lệnh- chạy lệnh bên ngoài;
  • giao diện ifup- nâng cao giao diện mạng;
  • lớp_bắt đầu tên_lớp- bắt đầu các dịch vụ thuộc lớp được chỉ định;
  • lớp_stop tên_lớp- dừng dịch vụ;
  • insmod /path/to/module- tải mô-đun hạt nhân;
  • gắn thư mục thiết bị FS- kết nối hệ thống tập tin;
  • giá trị tên setprop- đặt biến hệ thống;
  • bắt đầu dịch vụ_name- bắt đầu dịch vụ được chỉ định;
  • tên kích hoạt- kích hoạt trình kích hoạt (thực thi khối lệnh đã chỉ định);
  • ghi dòng /path/to/file- viết một dòng vào một tập tin.

Bước bốn. Hợp tử và app_process

Ở một giai đoạn tải nhất định, init sẽ gặp khối tương tự như khối này ở cuối cấu hình:

Hợp tử dịch vụ /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server lớp ổ cắm mặc định zygote luồng 660 hệ thống gốc khi khởi động lại ghi /sys/android_power/request_state đánh thức khi khởi động lại ghi /sys/power/state on onrestart khởi động lại phương tiện onrestart khởi động lại netd

Đây là mô tả về dịch vụ Zygote, một thành phần chính của bất kỳ hệ thống Android nào chịu trách nhiệm khởi tạo, khởi động dịch vụ hệ thống, khởi động và dừng ứng dụng người dùng cũng như nhiều tác vụ khác. Zygote được khởi chạy bằng một ứng dụng nhỏ /system/bin/app_process, có thể thấy rất rõ trong phần cấu hình trên. Nhiệm vụ app_proccess là khởi chạy máy ảo Dalvik, mã của máy nằm trong thư viện chia sẻ /system/lib/libandroid_runtime.so, sau đó chạy Zygote trên đó.

Khi tất cả điều này đã được thực hiện và Zygote nằm trong tầm kiểm soát, nó bắt đầu xây dựng thời gian chạy ứng dụng Java bằng cách tải tất cả các lớp Java của khung công tác (hiện có hơn 2000 lớp). Sau đó, nó khởi động system_server, bao gồm hầu hết các dịch vụ hệ thống cấp cao (viết bằng Java), bao gồm Trình quản lý cửa sổ, Thanh trạng thái, Trình quản lý gói và quan trọng nhất là Trình quản lý hoạt động, trong tương lai sẽ chịu trách nhiệm nhận ứng dụng tín hiệu bắt đầu và kết thúc.

Sau đó, Zygote mở socket /dev/socket/zygote và chuyển sang chế độ ngủ, chờ dữ liệu. Tại thời điểm này, Trình quản lý hoạt động đã khởi chạy trước đó sẽ gửi ý định phát sóng Intent.CATEGORY_HOME để tìm ứng dụng chịu trách nhiệm tạo màn hình nền và đặt tên của nó cho Zygote thông qua ổ cắm. Sau đó, lần lượt, phân nhánh và chạy ứng dụng trên máy ảo. Thì đấy, chúng ta có một màn hình trên màn hình, được tìm thấy bởi Trình quản lý hoạt động và được Zygote khởi chạy, đồng thời một thanh trạng thái được khởi chạy bởi system_server như một phần của dịch vụ Thanh trạng thái. Sau khi nhấn vào biểu tượng, màn hình sẽ gửi ý định có tên của ứng dụng này, Trình quản lý hoạt động sẽ nhận được nó và gửi lệnh khởi động ứng dụng tới daemon Zygote

THÔNG TIN

Trong thuật ngữ Linux, đĩa RAM là một loại đĩa cứng ảo chỉ tồn tại trong RAM. Đầu quá trình khởi động, kernel trích xuất nội dung đĩa từ hình ảnh và gắn nó làm hệ thống tệp gốc (rootfs).

Trong quá trình khởi động, Android hiển thị ba màn hình khởi động khác nhau: màn hình đầu tiên xuất hiện ngay sau khi nhấn nút nguồn và được flash vào nhân Linux, màn hình thứ hai hiển thị trong giai đoạn đầu khởi tạo và được ghi trong tệp /initlogo.rle (hầu như không có được sử dụng ngày nay), cái cuối cùng được khởi chạy bằng ứng dụng bootanimation và được chứa trong tệp /system/media/bootanimation.zip.

Ngoài các trình kích hoạt tiêu chuẩn, init cho phép bạn xác định trình kích hoạt của riêng mình, có thể được kích hoạt bởi nhiều sự kiện khác nhau: kết nối thiết bị với USB, thay đổi trạng thái của điện thoại thông minh hoặc thay đổi trạng thái của các biến hệ thống.

Ngoài ra, Trình quản lý hoạt động còn tắt các ứng dụng chạy nền khi không đủ bộ nhớ. Các giá trị ngưỡng bộ nhớ trống được chứa trong tệp /sys/module/lowmemorykiller/parameters/minfree.

Tất cả điều này có vẻ hơi khó hiểu, nhưng điều quan trọng nhất là hãy nhớ ba điều đơn giản:

Về nhiều mặt, Android rất khác so với các hệ điều hành khác và thật khó để nhận ra điều đó một cách nhanh chóng. Tuy nhiên, nếu bạn hiểu cách mọi thứ hoạt động thì khả năng là vô tận. Không giống như iOS và Windows Phone, hệ điều hành của Google có kiến ​​​​trúc rất linh hoạt cho phép bạn thay đổi nghiêm túc hành vi của nó mà không cần phải viết mã. Trong hầu hết các trường hợp, chỉ cần sửa các cấu hình và tập lệnh cần thiết là đủ.

Tôi bắt đầu phát triển cho Android tương đối gần đây (3 tháng trước) và điều đầu tiên tôi gặp phải là một lượng rất nhỏ tài liệu “tiếng Nga” về chủ đề này, đặc biệt là về các vấn đề như suy nghĩ qua giao diện hoặc sử dụng các tính năng tích hợp sẵn của môi trường Android. Hầu hết mọi thứ tôi tìm thấy đều đến từ bản dịch các bài viết từ http://developer.android.com hoặc các ví dụ giải quyết được một vấn đề cụ thể.

Tôi sẽ nói ngay rằng tôi không giả vờ là sự thật cuối cùng và tôi chỉ muốn truyền đạt tài liệu cho các nhà phát triển Android mới bắt đầu có thể giúp họ trong các hoạt động trong tương lai.

Tôi dự định xuất bản một số bài báo, mục đích của chúng là tiết lộ bản chất của việc thiết kế và phát triển ứng dụng cho nền tảng Android.

Cụ thể, bài viết này sẽ nói về phần mềm cần thiết để bắt đầu phát triển cho Android, tài liệu và một chút về cấu trúc của ứng dụng.

Bắt đầu nhanh

Để bắt đầu phát triển, bạn cần 2 thứ: Android SDK (có thể tải xuống từ http://developer.android.com/intl/zh-TW/sdk/index.html) và trên thực tế, môi trường phát triển.

SDK được cài đặt qua Internet (bản thân mô-đun cài đặt nặng một chút, lúc tôi khởi động nó nặng khoảng 10 MB). Bằng cách khởi chạy mô-đun cài đặt (SDK Setup.exe), kho lưu trữ sẽ ngay lập tức được kiểm tra các bản cập nhật API cũng như các kết quả khác, theo mặc định, SDK của bạn trống và trong mọi trường hợp, để bắt đầu, bạn sẽ cần tải xuống nội dung nào đó; từ việc lựa chọn các bản cập nhật được đề xuất. Chú ý! Có thể xảy ra sự cố khi kết nối với kho lưu trữ, để giải quyết, bạn cần vào Cài đặt và chọn hộp bên cạnh "Buộc https: \\ something else..." và thử kết nối lại với kho lưu trữ.

Kích thước của nội dung tải xuống sẽ tùy thuộc vào lựa chọn của bạn (hiện tại khoảng 1 GB). Để tăng tốc độ tải, bạn có thể giới hạn lựa chọn của mình ở 1 - 2 mô-đun (ví dụ: Nền tảng SDK Android API 1.5 và 2.0). Nói chung, tất cả phụ thuộc vào phiên bản Android mà bạn dự định phát triển. Phổ biến nhất trên khoảnh khắc này Phiên bản API: 1.5, 1.6, 2.0. Cá nhân tôi đã tải xuống mọi thứ ...

Chú ý! Hãy xem xét thực tế rằng đây không phải là iPhone của bạn! Nền tảng này không ngừng tăng trưởng và phát triển, và những gì được biên dịch tốt trên Android API 1.5, dưới 2.0, bạn sẽ nhận được cảnh báo rằng bạn đang sử dụng các thư viện hoặc phương thức lỗi thời (eh, Java ;-)). Ngoài ra, trong các phiên bản API mới, các phương thức khả dụng không có sẵn trong các phiên bản trước đó; để biết rõ API này hỗ trợ những thư viện nào, bạn có thể truy cập http://developer.android.com/intl/zh-TW/ tham khảo/android/app/Activity.html ở bên phải góc trên cùng chọn hộp bên cạnh "Lọc theo cấp độ API" và cho biết phiên bản API bạn quan tâm (kể từ tháng 3 năm 2010 - tối đa là 7).

Bạn có thể xem các mô-đun đã tải bằng cách nhấp vào tab "Gói đã cài đặt". Bạn có thể cập nhật và xóa chúng ở đó.

Vậy là bạn đã tải xuống SDK... bây giờ bạn cần tạo trình mô phỏng để gỡ lỗi ứng dụng của mình. Để tạo trình giả lập, bạn cần chuyển đến tab Thiết bị ảo trong cùng mô-đun tải. Trong cửa sổ mở ra, bạn sẽ thấy một bảng (lúc đầu trống) với danh sách các trình giả lập đã tạo. Chức năng cửa sổ cho phép bạn tạo, xóa, “sửa chữa” (tôi chưa bao giờ sử dụng chức năng này), xem thông tin và chạy trình giả lập. Bằng cách nhấp vào nút "Mới", bạn sẽ được đưa đến trình hướng dẫn tạo trình mô phỏng.

Trong trình hướng dẫn, bạn cần chỉ định tên của trình giả lập, nền tảng đích (danh sách thả xuống Target), kích thước của thẻ nhớ SD (lưu ý, theo mặc định, kích thước là MB), skin (loại màn hình thiết bị và độ phân giải), cũng như phần cứng được hỗ trợ: hỗ trợ máy ảnh, thời lượng pin, GPS, v.v. (bằng cách nhấp vào nút "Mới", bạn sẽ được đưa đến cửa sổ để chọn thuộc tính trình mô phỏng và giá trị của nó).

Để hoàn tất việc tạo trình giả lập, bạn cần nhấp vào "Tạo AVD". Chú ý! Khi trình mô phỏng được tạo, bạn không thể thay đổi thuộc tính của nó. Nếu bạn cần một trình mô phỏng có các thuộc tính khác, bạn sẽ phải tạo một trình giả lập mới. Sau khi tạo trình mô phỏng, hãy coi như đã hoàn thành một nửa chặng đường để bắt đầu “nhanh”...

Bây giờ hãy chuyển sang môi trường phát triển. Chúng tôi có rất ít sự lựa chọn ở đây: cài đặt plugin cho Eclipse/NetBeans (http://developer.android.com/intl/zh-TW/sdk/eclipse-adt.html và http://kenai.com/projects/nbandroid / , tương ứng) hoặc tải xuống IDE đã được lắp ráp sẵn (ví dụ: MOTODEV Studio dành cho Android 1.1 từ trang web http://developer.motorola.com/docstools/motodevstudio/). Về nguyên tắc, bằng cách cài đặt plugin cho Eclipse, cuối cùng bạn sẽ gần như có được MOTODEV Studio cho Android 1.1, nhưng bạn có cần tất cả những thứ phức tạp này không ??? Đối với plugin dành cho NetBeans, tôi không biết trạng thái của nó hiện tại là gì, nhưng phiên bản tôi phải làm việc không có trình chỉnh sửa giao diện người dùng trực quan, nói một cách nhẹ nhàng, điều này đã làm chậm công việc.

Cá nhân, sự lựa chọn của tôi rơi vào tùy chọn thứ hai (quy tắc của MOTODEV Studio ;-))... Bạn có thể dễ dàng tìm thấy tất cả thông tin cần thiết về cài đặt và định cấu hình môi trường phát triển bằng cách tìm kiếm trên Google trong nửa giờ.

Đọc

Cá nhân tôi vẫn chưa quan sát thấy sự hiện diện của tài liệu tiếng Nga về việc phát triển Android. Vì vậy, chúng ta hãy chuyển ngay sang nội dung tiếng Anh... Vì vậy, đối với tôi, Android đã trở thành Kinh thánh: Apress Bắt đầu từ Android và Apress Android chuyên nghiệp.

Những cuốn sách này mô tả khá phổ biến và rõ ràng cái gì, tại sao và tại sao, đồng thời cũng cung cấp đầy đủ ví dụ rõ ràng... Điều đáng chú ý là cả hai cuốn sách đều sử dụng nền tảng Android 1.5 làm cơ sở; phiên bản của sách dưới 2.0 (Apress Beginning Android 2 và Apress Pro Android 2, tương ứng), mặc dù chúng có mặt trên trang web của nhà xuất bản, nhưng tôi có vẫn chưa tìm thấy để tải xuống.

rất nhiều tài liệu tham khảo(mặc dù với các ví dụ không hoạt động một phần ;-)) có trên trang web chính của dự án (http://developer.android.com), sẽ rất hữu ích không chỉ khi đọc tóm tắt và DevGuide mà còn xem các video hướng dẫn.

Kết cấu

Họ sẽ cho bạn biết cách tạo ứng dụng HelloWorld mà không cần tôi, vì vậy hãy chuyển sang cấu trúc. Về nguyên tắc, bạn có thể đọc mọi thứ mà tôi sắp kể cho bạn từ tài liệu đọc được cung cấp cho bạn ở trên, nhưng tôi sẽ cố gắng giúp bạn tiết kiệm một chút thời gian.

Vì vậy, có điều kiện, một ứng dụng dành cho Android bao gồm 3 khối:

  1. Manifest (AndroidManifest.xml) là một bộ mô tả tệp ứng dụng, một thành phần bắt buộc, dùng để xác định những thứ đáng sợ như: hoạt động, nhà cung cấp nội dung, dịch vụ, người nhận ý định (chúng sẽ được thảo luận trong các bài viết sau). Và cũng trong bảng kê khai, bạn có thể mô tả các “quyền” cần thiết cho hoạt động của ứng dụng của mình. Tôi dự định mô tả bản tuyên ngôn chi tiết hơn trong các bài viết sau.
  2. Thư mục "src" - một thư mục chứa tất cả nguồn chương trình là bắt buộc.
  3. Thư mục "res" là thư mục ngon nhất, nó chứa tất cả "tài nguyên" của ứng dụng;-) Bạn chưa biết về nó, nhưng nó sẽ giúp cuộc sống của bạn dễ dàng hơn nhiều, hơn nữa, tôi xin nói rằng đó là MỌI THỨ nhất đối với một nhà phát triển Android. Thư mục này là cần thiết cho dự án.

Bên cạnh đó, Thư mục gốcỨng dụng cũng có thể chứa thư mục “tài sản”; thư mục này là tùy chọn và có thể chứa nhiều tài nguyên phụ trợ khác nhau (các thư mục và tệp khác).

Và một điều tinh tế nữa... Bạn có thể thả thư mục “libs” vào thư mục gốc của ứng dụng, sau này bạn có thể thêm các thư viện C/C++ gốc vào đó (chúng ta cũng sẽ nói về chúng vào một ngày nào đó, nhưng sau).

Trong quá trình xây dựng ứng dụng, một thư mục "gen" sẽ xuất hiện cùng với gói đính kèm và tệp R.xml - điều này cũng rất tập tin hữu ích, chứa các bộ mô tả tài nguyên, được tạo ra bởi môi trường phát triển và bạn không nên truy cập nó một cách thủ công.

Các tài nguyên (ngoại trừ đồ họa), cũng như tệp kê khai, được trình bày dưới dạng tệp XML. Và những ai hiểu đôi điều về Java EE sẽ ngay lập tức tìm thấy rất nhiều điểm tương đồng ở mình, và họ sẽ đúng… Cấu trúc XMLnhiều loại khác nhau Tôi cũng dự định mô tả các tài nguyên trong các bài viết sau, nhưng bây giờ tôi sẽ chỉ mô tả ngắn gọn nội dung của thư mục “res”:

  1. drawable - một thư mục chứa các tệp có nội dung đồ họa cũng như hướng dẫn xml để làm việc với chúng, là tùy chọn.
  2. hoạt hình - một thư mục chứa các tệp xml có mô tả về hoạt ảnh.
  3. bố cục - thư mục, chứa mô tả xml lớp để triển khai giao diện người dùng.
  4. giá trị - thư mục - vùng chứa cho các tệp xml như: chuỗi, kiểu, màu sắc, kích thước, mảng (nội dung của các tệp được chỉ định tương ứng với tên của chúng).
  5. xml - một thư mục chứa các tệp xml phụ trợ khác nhau.
  6. raw - thư mục lưu trữ dữ liệu không phải XML được sử dụng trong ứng dụng.

Có vẻ như, xét theo cấu trúc thì mọi thứ đã rõ ràng rồi... Nhưng tôi đảm bảo với bạn - đây chỉ là phần nổi của tảng băng chìm. Bằng các thao tác đơn giản với các thư mục này và nội dung của chúng, bạn có thể dễ dàng triển khai những việc như quốc tế hóa và bản địa hóa ứng dụng của mình, cũng như triển khai khoảng 80% công việc với giao diện người dùng của mình.

Tổng hợp

Khi viết bài, tôi nhận ra rằng mình đã “cuồng”... và tôi vẫn phải viết cả đống bài để trút hết những gì đã “sôi sục” về việc phát triển cho Android.

Tôi hy vọng ai đó thấy nó hữu ích và đến lượt tôi, tôi sẽ cố gắng xuất bản phần tiếp theo nhanh nhất có thể...

x86.

Ban đầu được phát triển bởi Android Inc., sau đó được Google mua lại (tháng 7 năm 2005). Sau đó (tháng 11 năm 2007), Google đã khởi xướng việc thành lập liên minh kinh doanh Open Handset Alliance (bao gồm Google, HTC, Intel, Motorola, Nvidia và các công ty khác), hiện đang hỗ trợ và phát triển hơn nữa nền tảng này.

Kể từ khi phát hành phiên bản đầu tiên (tháng 9 năm 2008), một số bản cập nhật hệ thống đã được thực hiện. Các bản cập nhật này thường liên quan đến việc sửa các lỗi được phát hiện và thêm chức năng mới vào hệ thống. Mỗi phiên bản của hệ thống đều có tên mã theo chủ đề món tráng miệng riêng.

1.2. Bộ công cụ dành cho nhà phát triển

Trước khi bắt đầu tạo ứng dụng Android, bạn cần chọn các công cụ phát triển phù hợp.

Theo quy định, việc phát triển ứng dụng Android được thực hiện bằng Java. Vì vậy, trước hết bạn cần cài đặt Phát triển Java Bộ công cụ (JDK). Nhưng trước tiên bạn cần hiểu Java là gì.

Java là hướng đối tượng ngôn ngữ lập trình. Các chương trình Java được dịch sang mã byte, được thực thi bởi Máy ảo Java, xử lý mã byte và chuyển hướng dẫn đến phần cứng dưới dạng trình thông dịch. Ưu điểm của phương pháp thực thi chương trình này là mã byte hoàn toàn độc lập với hệ điều hành và phần cứng, cho phép bạn chạy các ứng dụng Java trên bất kỳ thiết bị nào có mã byte tương ứng. máy ảo. Khác tính năng quan trọng Java là một hệ thống bảo mật linh hoạt do việc thực thi chương trình được kiểm soát hoàn toàn bởi máy ảo. Bất kỳ hoạt động nào vượt quá quyền được thiết lập của chương trình (ví dụ: cố gắng truy cập dữ liệu trái phép hoặc kết nối với máy tính khác) sẽ gây gián đoạn ngay lập tức. Cần lưu ý rằng trên thực tế, hầu hết giải pháp kiến ​​trúcđược áp dụng khi tạo Java được quyết định bởi mong muốn cung cấp cú pháp tương tự như C/C++. Java sử dụng các quy ước gần như giống hệt nhau để khai báo biến, truyền tham số và truyền toán tử. Do đó, những người đã có kinh nghiệm lập trình C/C++ sẽ có thể nhanh chóng nắm bắt được nó và bắt đầu viết các ứng dụng Java.

JDK là bộ công cụ phát triển ứng dụng Java miễn phí bao gồm trình biên dịch Java, thư viện chuẩn Các lớp Java, ví dụ, tài liệu, các tiện ích khác nhau và Môi trường chạy thi hành Java (JRE). JDK không bao gồm một phần mềm tích hợp môi trương phat triển(Môi trường phát triển tích hợp). Do đó, sau khi cài đặt JDK, IDE sẽ được cài đặt.

Có một số môi trường phát triển phổ biến, nhưng khóa học này chúng tôi sẽ chọn IDE Eclipse và plugin tương ứng cho nó Công cụ phát triển Android(ADT).

Bộ công cụ phát triển phần mềm Android(SDK) chứa nhiều công cụ và tiện ích để tạo và thử nghiệm ứng dụng. Ví dụ: bằng cách sử dụng Trình quản lý SDK, bạn có thể cài đặt API Android của bất kỳ phiên bản nào (Hình 1.1) đồng thời kiểm tra kho lưu trữ để tìm những phiên bản có sẵn, nhưng chưa gói đã cài đặt và tài liệu lưu trữ.


Cơm. 1.1.

Bộ công cụ phát triển bản địa Android(NDK) cho phép bạn phát triển các ứng dụng Android bằng C/C++. Tại sao điều này có thể cần thiết? Có một số lý do. Ví dụ: nhu cầu sử dụng mã đã được viết cho nền tảng gốc hoặc tăng tốc độ thực thi các đoạn mã quan trọng.

1.3. Kiến trúc Android

Chúng ta hãy xem các thành phần chính của hệ điều hành Android (Hình 1.2).

Các ứng dụng. Android đi kèm với một bộ ứng dụng cốt lõi, bao gồm lịch, bản đồ, trình duyệt, trình quản lý liên hệ và các ứng dụng khác. Tất cả các ứng dụng được liệt kê đều được viết bằng Java.

Khung ứng dụng. Bằng cách cung cấp nền tảng mở phát triển, Android cung cấp cho các nhà phát triển khả năng tạo ra các ứng dụng linh hoạt và sáng tạo. Các nhà phát triển có thể tận dụng khả năng phần cứng của thiết bị, lấy thông tin vị trí, chạy các tác vụ ở chế độ nền, đặt cảnh báo, v.v. Các nhà phát triển có toàn quyền truy cập tới cùng các API được sử dụng trong các ứng dụng chính.

Kiến trúc ứng dụng được thiết kế để đơn giản hóa tái sử dụng các thành phần; bất kỳ ứng dụng nào cũng có thể "xuất bản" các khả năng của nó và sau đó bất kỳ ứng dụng nào khác cũng có thể sử dụng các khả năng đó (tuân theo các hạn chế về bảo mật). Cơ chế tương tự cho phép bạn thay thế các thành phần tiêu chuẩn bằng các thành phần tùy chỉnh.


Cơm. 1.2.

Thư viện. Android bao gồm một bộ thư viện C/C++ được sử dụng bởi nhiều thành phần hệ thống khác nhau. Các tính năng này có sẵn cho các nhà phát triển trong bối cảnh Ứng dụng Android Khung ứng dụng. Một số thư viện chính được liệt kê dưới đây:

  • Thư viện phương tiện – những thư viện này cung cấp hỗ trợ phát lại và ghi nhiều định dạng âm thanh, video và hình ảnh phổ biến, bao gồm MPEG4, MP3, AAC, AMR, JPG, PNG và các định dạng khác;
  • Surface Manager – kiểm soát quyền truy cập vào hệ thống con hiển thị của các lớp đồ họa 2D và 3D;
  • LibWebCore là một công cụ web hiện đại được xây dựng trên trình duyệt Android;
  • SGL – công cụ đồ họa 2D chính;
  • Thư viện 3D – được triển khai dựa trên OpenGL; thư viện sử dụng khả năng tăng tốc 3D phần cứng (nếu có) hoặc được kích hoạt trong phần mềm;
  • FreeType – hỗ trợ phông chữ raster và vector
  • SQLite là một công cụ cơ sở dữ liệu có sẵn cho tất cả các ứng dụng.

Thời gian chạy Android. Android bao gồm một tập hợp các thư viện cốt lõi cung cấp hầu hết các chức năng có sẵn trong thư viện Java. Mỗi ứng dụng Android chạy theo quy trình riêng, với phiên bản máy ảo Dalvik riêng. Dalvik được viết để thiết bị có thể hoạt động hiệu quả với một số máy ảođồng thời.

Dalvik được thiết kế dành riêng cho nền tảng Android. Máy ảođược tối ưu hóa để tiêu thụ bộ nhớ thấp và chạy trên phần cứng di động. Dalvik sử dụng mã byte riêng của mình. Các ứng dụng Android được trình biên dịch dịch thành mã cấp thấp đặc biệt độc lập với máy. Và chính Dalvik là người diễn giải và thực thi một chương trình như vậy khi được thực thi trên nền tảng. Ngoài ra, sử dụng tiện ích đặc biệtđược bao gồm trong SDK Android, Dalvik có khả năng dịch mã byte Java thành mã định dạng riêng và cũng có thể thực hiện chúng trong môi trường ảo của bạn.

Nền tảng Linux. Android dựa trên Phiên bản Linux 2.6 với cơ bản Dịch vụ hệ thống- sự an toàn , quản lý bộ nhớ, quản lý quy trình và mô hình trình điều khiển. Các nhà phát triển Android đã sửa đổi nhân Linux để thêm hỗ trợ cho phần cứng, Được dùng trong thiêt bị di động và thường xuyên nhất là không thể truy cập được trên máy tính.

1.4. Tổng quan về giao diện Java

lập trình viên ứng dụng Android là một tập hợp các giao diện bằng ngôn ngữ Java. Hãy xem nó được tổ chức như thế nào. Bộ này dựa trên các gói có trong

Có bốn khối tiêu chuẩnỨng dụng Android:

- Hoạt động.

- Người nhận ý định.

- Dịch vụ.

- Nhà cung cấp nội dung.

Không phải mọi ứng dụng đều cần có tất cả bốn khối, nhưng ứng dụng của bạn sẽ được viết với sự kết hợp nào đó của chúng.

Khi bạn đã quyết định những thành phần nào bạn cần cho ứng dụng của mình, bạn nên liệt kê chúng trong một tệp có tên AndroidManifest.xml. Cái này - tập tin XML, nơi bạn khai báo các thành phần của ứng dụng cũng như khả năng và yêu cầu của chúng. Chúng ta sẽ sớm thảo luận về trách nhiệm của AndroidManifest.xml.

(Điều này có thể đã được viết RẤT quanh co. Có rất nhiều văn bản và không có hình ảnh ví dụ. Tôi khuyên bạn nên kiên nhẫn và đọc lý thuyết này, nhưng sau đó nó sẽ rõ ràng hơn với bạn. Khi đó mọi thứ được viết mượt mà hơn nhiều, đừng lo lắng )

Hoạt động

Hoạt động là thành phần phổ biến nhất trong bốn khối xây dựng của Android. Hoạt động thường là màn hình duy nhất trong ứng dụng của bạn. Mỗi Hoạt động được triển khai dưới dạng một lớp duy nhất mở rộng lớp Hoạt động cơ sở. Lớp của bạn sẽ hiển thị giao diện người dùng bao gồm Chế độ xem và phản hồi các sự kiện. Hầu hết các ứng dụng bao gồm nhiều màn hình. Ví dụ: ứng dụng nhắn tin có thể có một màn hình hiển thị danh sách liên hệ, màn hình thứ hai để viết tin nhắn cho một liên hệ đã chọn và các màn hình khác để xem lại tin nhắn cũ hoặc thay đổi cài đặt. Mỗi màn hình này sẽ được triển khai dưới dạng Hoạt động. Việc chuyển sang màn hình khác được thực hiện bằng cách bắt đầu một Hoạt động mới. Trong một số trường hợp, Hoạt động có thể trả về giá trị của Hoạt động trước đó - ví dụ: Hoạt động cho phép người dùng chọn ảnh sẽ trả lại ảnh đã chọn cho chương trình gọi điện. Khi màn hình mới mở ra, màn hình trước đó sẽ bị tạm dừng và được đặt vào ngăn xếp lịch sử. Người dùng có thể di chuyển trở lại trước đó mở màn hình theo niên đại. Các màn hình cũng có thể muốn được xóa khỏi ngăn xếp lịch sử khi việc giữ lại chúng là không phù hợp. Android lưu ngăn xếp lịch sử cho mỗi ứng dụng được khởi động từ đầu màn hình.

Bộ lọc Ý định và Ý định

Android sử dụng một lớp đặc biệt gọi là Intent để di chuyển từ màn hình này sang màn hình khác. Ý định mô tả những gì ứng dụng dự định làm. Hai phần quan trọng nhất của cấu trúc Ý định là hành động và dữ liệu đằng sau hành động. Các giá trị tiêu biểu cho hành động là MAIN (màn hình chính ứng dụng), VIEW, PICK, EDIT, v.v. Dữ liệu được thể hiện dưới dạng Chỉ báo tài nguyên thống nhất (URI). Ví dụ: để xem một trang web trong trình duyệt, bạn sẽ tạo một Intent với hành động VIEW và một tập dữ liệu - địa chỉ của trang web.

mớiÝ định(android.content.Intent. VIEW_ACTION,URI nội dung. tạo nên("http://anddev.org"));

Có một lớp liên quan tên là IntentFilter. Trong khi Ý định là một yêu cầu thực hiện điều gì đó thì IntentFilter là mô tả về những gì Hoạt động ý định (hoặc người nhận ý định, xem bên dưới) có khả năng xử lý. Một Hoạt động có thể hiển thị thông tin cho một người sẽ xuất bản IntentFilter cho biết hoạt động đó biết cách xử lý chế độ XEM của hoạt động. Hoạt động xuất bản IntentFilters của nó trong tệp AndroidManifest.xml.

Việc điều hướng từ màn hình này sang màn hình khác được thực hiện bằng cách sử dụng Intent. Để tiếp tục, Hoạt động gọi startActivity(myIntent). Sau đó, hệ thống sẽ xem xét IntentFilter của tất cả các ứng dụng đã cài đặt và chọn Hoạt động có Intent myIntent đang lọc. Hoạt động mới được thông báo về một Ý định, khiến hoạt động đó bắt đầu. Quá trình phân giải Ý định xảy ra khi startActivity được gọi. Quá trình này mang lại hai lợi ích chính:

Các hoạt động có thể sử dụng lại chức năng từ các thành phần khác chỉ bằng cách đưa ra yêu cầu ở biểu mẫu Ý định.

Các hoạt động có thể được thay thế bất kỳ lúc nào bằng một Hoạt động mới có IntentFilter tương đương.

Người nhận ý định

Bạn có thể sử dụng IntentReceiver khi bạn muốn mã trong ứng dụng của mình thực thi để phản hồi một sự kiện bên ngoài, chẳng hạn như khi điện thoại đổ chuông hoặc khi mạng dữ liệu khả dụng hoặc khi lúc đó là nửa đêm. Người nhận ý định không hiển thị giao diện người dùng, mặc dù họ có thể hiển thị Thông báo để cảnh báo người dùng nếu có điều gì thú vị xảy ra. Bộ thu đã sử dụng cũng được đăng ký trong AndroidManifest.xml, nhưng bạn cũng có thể đăng ký chúng bằng mã bằng cách sử dụng Context.registerReceiver(). Ứng dụng của bạn không nên chạy Trình nhận ý định; hệ thống sẽ khởi chạy ứng dụng của bạn, nếu cần, khi Người nhận Ý định được gọi. Các ứng dụng cũng có thể gửi Người nhận ý định của riêng mình cho người khác bằng Context.broadcastIntent().

Dịch vụ

Dịch vụ là mã bền và chạy mà không cần giao diện người dùng. Ví dụ tốtĐây là một trình phát đa năng phát các bài hát từ danh sách phát. Ứng dụng trình phát phổ quát có thể có một hoặc nhiều Hoạt động cho phép người dùng chọn bài hát và phát chúng. Tuy nhiên, Hoạt động không nên xử lý bản thân việc phát nhạc vì người dùng sẽ mong muốn nhạc tiếp tục phát ngay cả sau khi trình phát được thu nhỏ. Trong trường hợp này, hoạt động của trình phát đa phương tiện có thể khởi động Dịch vụ bằng cách sử dụng Context.startService() để chạy ở chế độ nền và tiếp tục phát nhạc. Sau đó hệ thống sẽ tiếp tục phát nhạc cho đến khi tự đóng lại. (Bạn có thể tìm hiểu thêm về mức độ ưu tiên dành cho các dịch vụ trên hệ thống bằng cách đọc Loop Ứng dụng cuộc sống Android). Lưu ý rằng bạn có thể liên kết với Dịch vụ (và khởi động nó nếu nó chưa chạy) bằng phương thức Context.bindService(). Khi có kết nối với Dịch vụ, bạn có thể liên lạc với Dịch vụ đó thông qua giao diện mà Dịch vụ hiển thị. Đối với Dịch vụ nhạc, điều này có thể cho phép bạn tạm dừng, tua lại, v.v.

Nhà cung cấp nội dung

Các ứng dụng có thể lưu trữ dữ liệu của chúng trong các tệp, cơ sở dữ liệu SQLite, cài đặt cá nhân hóa hoặc bất kỳ cơ chế nào khác có ý nghĩa. Tuy nhiên, Nhà cung cấp Nội dung sẽ hữu ích nếu bạn muốn dữ liệu ứng dụng của bạn được chia sẻ với các ứng dụng khác. Nhà cung cấp nội dung là lớp triển khai một bộ phương thức tiêu chuẩn để cho phép các ứng dụng khác lưu và khôi phục loại dữ liệu được xử lý bởi Nhà cung cấp nội dung khác.

Giao diện người dùng Android

Giao diện người dùng (UI) trong Android có thể được tạo theo hai cách, thông qua mã XML hoặc bằng mã java. Tạo cấu trúc GUI người dùng trong XML rất thích hợp vì theo nguyên tắc của Kiểm soát Trình xem Mô hình, giao diện người dùng phải luôn được tách biệt khỏi logic chương trình. Ngoài ra, việc điều chỉnh chương trình từ độ phân giải màn hình này sang độ phân giải màn hình khác đơn giản hơn nhiều. Việc xác định một giao diện người dùng trong XML rất giống với việc tạo một giao diện người dùng chung tài liệu HTML, nơi bạn có đó là một tệp đơn giản:

Tiêu đề trang

Nội dung của phần tử cơ thể.

Nó giống như trong Bố cục XML của Android. Mọi thứ đều có cấu trúc tốt và có thể được thể hiện dưới dạng cấu trúc cây:

android:orientation="dọc"

android:layout_width="fill_parent"

android:layout_height="fill_parent">

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="Xin chào thế giới"/>

Hệ thống cấp bậcYếu tốMàn hình

Nền tảng mô-đun chức năngỨng dụng Android - Hoạt động - một đối tượng của lớp android.app.activity. Một Hoạt động có thể thực hiện nhiều việc nhưng bản thân nó không có bất kỳ sự hiện diện nào trên màn hình. Để hiển thị màn hình Hoạt động và thiết kế giao diện người dùng của nó, bạn làm việc với Chế độ xem và Nhóm xem - đơn vị biểu đạt giao diện người dùng cơ bản trên nền tảng Android.

Lượt xem

View là một đối tượng mở rộng lớp cơ sở android.view.view. Đây là cấu trúc dữ liệu có thuộc tính lưu trữ Bố cục và nội dung cho một vùng hình chữ nhật cụ thể của màn hình. Đối tượng View xử lý kích thước, bố cục, bản vẽ, thay đổi tâm, cuộn và các phím/biểu tượng cho vùng màn hình mà nó đại diện. Lớp View phục vụ lớp cơ sở cho tất cả các mảnh đồ họa - toàn bộ hàng các lớp con được triển khai để vẽ các phần tử màn hình tương tác. Các mảnh đồ họa xử lý kích thước và bản vẽ của riêng chúng, vì vậy bạn có thể sử dụng chúng để tạo giao diện người dùng của mình nhanh hơn. Danh sách các đoạn đồ họa có sẵn bao gồm TextView, EditText, Button, RadioButton, Checkbox, ScrollView, v.v.

Nhóm xem

Viewgroup là một đối tượng của lớp android.view.viewgroup. Nhóm xem - loại đặc biệt một đối tượng Chế độ xem có chức năng chứa và quản lý một tập hợp Chế độ xem và Nhóm xem. Nhóm xem cho phép bạn thêm cấu trúc vào giao diện người dùng của mình và tạo các thành phần màn hình phức tạp có thể được truy cập dưới dạng đến một đối tượng duy nhất. Lớp Viewgroup đóng vai trò là lớp cơ sở cho Bố cục, một loạt các lớp con được triển khai đầy đủ cung cấp loại phổ biến Bố cục màn hình. Bố cục cung cấp cho bạn cách xây dựng cấu trúc cho chuỗi Chế độ xem.

Giao diện người dùng có cấu trúc cây

Trên nền tảng Android, bạn xác định Hoạt động giao diện người dùng bằng cách sử dụng cây Xem và nút Nhóm xem, như được hiển thị trong sơ đồ bên dưới. Cây có thể đơn giản hoặc phức tạp tùy theo ý bạn tạo và bạn có thể xây dựng cây bằng cách sử dụng các tập hợp ô đồ họa và Bố cục Android được xác định trước hoặc các loại Chế độ xem tùy chỉnh mà bạn tự tạo.

Giao diện người dùng Android là một cấu trúc cây.

Để gắn cây vào màn hình và hiển thị nó, Hoạt động của bạn gọi phương thức setContentView() của nó và chuyển thông tin đến đối tượng gốc của nút. Khi hệ thống Android nhận được thông tin về đối tượng gốc của một nút, nó sẽ bắt đầu làm việc trực tiếp với nút đó để đo và vẽ cây. Khi Hoạt động của bạn bắt đầu hoạt động và được ưu tiên, hệ thống sẽ đăng ký Hoạt động của bạn và yêu cầu nút gốc đo và vẽ cây. Nút gốc sau đó yêu cầu các nút con của nó tự vẽ - lần lượt, mỗi nút Viewgroup trong cây chịu trách nhiệm vẽ nó các nút con trực tiếp. Như đã đề cập trước đó, mỗi nhóm Chế độ xem có trách nhiệm đo không gian có sẵn, vị trí của các nút con và gọi draw() trên mỗi nút con để cho phép tất cả chúng tự hiển thị. Các nút con có thể yêu cầu kích thước và vị trí trong nút cha, nhưng nút cha có quyền quyết định cuối cùng về vị trí và mức độ lớn của mỗi nút con.

So sánh các thành phần giao diện người dùng Android với các thành phần giao diện người dùng xoay

Vì một số nhà phát triển đang đọc bài viết này có thể nhận thấy giao diện người dùng tương tự như Swing nên giờ đây sẽ có ít điểm tương đồng giữa Android và Swing.

Hoạt động trong Android gần như là một Khung (J) trong Swing.

Xem trong Android - Thành phần (J) trong Swing.

TextView trong Android - (J) TextField trong Swing.

EditTexts trong Android - (J) TextField trong Swing.

Nút trong Android - Nút (J) trong Swing.

Việc đặt trình nghe thành Chế độ xem trong Android gần giống như trong Swing.

myView.setOnClickListener( mới OnClickListener())( ...

myButton.addActionListener( mới ActionListener()(...