Ý nghĩa của tệp tin AndroidManifest xml trong ứng dụng android

Mọi ứng dụng đều cần có một file AndroidManifest.xml (file có cấu trúc XML) ở thư mục gốc của dự án. File mô tả này để cung cấp các thông tin cần thiết về ứng dụng cho hệ thống Android. Tóm tắt lại thì các thứ trong file mô tả Manifest này cần theo cấu trúc sau:

  • Chứa tên package dùng cho ứng dụng (tên package là duy nhất nhằm xác định đến package).
  • Mô tả các thành phần của ứng dụng: các Activity, Service, Broadcast Receiver, Content Provider.
  • Xác định các tiến trình chạy trong ứng dụng.
  • Khai báo các quyền truy cập hệ thống.

Cấu trúc cơ bản của file AndroidManifest.xml

File này có định dạng có thể gồm các thành phần chứa trong thẻ như sau:

<?xml version="1.0" encoding="utf-8"?> <manifest>     <uses-permission />     <permission />     <permission-tree />     <permission-group />     <instrumentation />     <uses-sdk />     <uses-configuration />       <uses-feature />       <supports-screens />       <compatible-screens />       <supports-gl-texture />       <application>         <activity>             <intent-filter>                 <action />                 <category />                 <data />             </intent-filter>             <meta-data />         </activity>         <activity-alias>             <intent-filter> . . . </intent-filter>             <meta-data />         </activity-alias>         <service>             <intent-filter> . . . </intent-filter>             <meta-data/>         </service>         <receiver>             <intent-filter> . . . </intent-filter>             <meta-data />         </receiver>         <provider>             <grant-uri-permission />             <meta-data />             <path-permission />         </provider>         <uses-library />     </application> </manifest>

Như vậy nó thường có các thẻ sau bên trong:

<action>, <activity>, <activity-alias>, <application>, <category>, <data>, <grant-uri-permission>, <instrumentation>, <intent-filter>, <manifest>, <meta-data>, <permission>, <permission-group>, <permission-tree>, <provider>, <receiver>, <service>, <supports-screens>, <uses-configuration>, <uses-feature>, <uses-library>, <uses-permission>, <uses-sdk> 

Dưới đây cập nhật về các thẻ hay dùng khi lập trình Android

Mô tả receiver

<receiver android:directBootAware=["true" | "false"] <!--Có nhận được Broadcast khi khóa máy hay không-->           android:enabled=["true" | "false"] <!--Có kích hoạt hay không-->           android:exported=["true" | "false"] <!--Có nhận được Broadcast từ thành phần bên ngoài ứng dụng hay không-->           android:icon="drawable resource"           android:label="string resource"           android:name="string"           android:permission="string"           android:process="string" >     . . . </receiver>

Thẻ receiver khai báo một BroadcastReceiver như là một thành phần của ứng dụng, cho phép ứng dụng nhận các chỉ thị phát đi bởi hệ thống, ứng dụng nhận được các chỉ thị này thậm chí khi các thành phần của ứng dụng đang không chạy.  Ngoài cách mô tả bằng Manifest như trên ứng dụng có thể khai báo nhận Broadcast trong code bằng cách gọi Context.registerReceiver(). Hết sức lưu ý về số lượng Broadcast cho ứng dụng vì có thế là nguyên nhân tới hao tổn pin của thiết bị.

android:name

Tên của lớp triển khai mã broadcast receiver, là một lớp kế thừa từ BroadcastReceiver được code trong ứng dụng của bạn. Ví dụ bạn xây dựng một lớp kế thừa từ BroadcastReceiver có tên Myreceiver trong package: com.example.myproject thì tên này sẽ là: com.example.myproject.Myreceiver. Trường này không có giá trị mặc định bắt buộc cần khai báo.

Receiver có thể chứa bên trong intent-filter, meta-data.

Mô tả intent-filter

<intent-filter android:icon="drawable resource"                android:label="string resource"                android:priority="integer" >     . . . </intent-filter>

Thể này mô tả kiểu intent (chỉ thị) mà một Activity, Service hay Broadcast Receiver nhận được.  Nội dung của intent-filter được diễn tả bởi các thẻ bên trong nó gồm thẻ: action, category, meta-data. Trong đó thẻ action bắt buộc phải có.

Mô tả action

<action android:name="string" />

Chỉ ra tên của Action của intent-filter. Các action tiểu chuẩn của hệ thống thường là một chuỗi với tên theo dạng: ACTION_string constants.  Tên này là của hệ thống hoặc do bạn tự định nghĩa khi gửi đi Broadcast trong ứng dụng. Nếu bạn tự định nghĩa tên này thì nên theo chuẩn com.example.project.YOURNAMEACTION.

Mô tả meta-data 

<meta-data android:name="string"            android:resource="resource specification"            android:value="string" />

Mô tả cặp dữ liệu TÊN-GIÁ TRỊ được cung cấp cho thẻ cha của meta-data.

  • android:name : tên của dữ liệu.
  • android:value: giá trị
  • android:resource : Chỉ ra tài nguyên (Resource) là giá trị gán cho dữ liệu.

Ở các bài CÁC THÀNH PHẦN GIAO DIỆN CƠ BẢN, chúng ta đã cùng nhau tìm hiểu về:

  • View.
  • ViewGroup.
  • Drawables.
  • Cách đổ View vào Activity.

Và ở bài học hôm nay, chúng ta sẽ cùng tìm hiểu về Intent và Manifest. Do tính chất của 2 khái niệm này dày đặc lý thuyết, ít hình vẽ (ít chứ không phải không có), mình sẽ cố gắng đưa ra nhiều hình minh họa nhất có thể. Bù lại, nội dung của bài khá ngắn, dễ đọc.

Nội dung

Để đọc hiểu bài này tốt nhất các bạn nên có kiến thức cơ bản về các phần:

  • Cấu trúc của một project Android.
  • Cách mở / import một project Android bằng Android Studio.

Trong bài học này, chúng ta sẽ cùng tìm hiểu các vấn đề:

  • Intent là gì? Chúng được sử dụng ra sao?
  • Manifest là gì? Những thành phần trong file Manifest?

Truyền thuyết về Intent

Ngày xửa ngày xưa, khi chế tạo ra Android, các nhà khoa học đã nghĩ về một hình thức truyền dữ liệu giữa các màn hình (Activity), tiến trình ngầm (Service) hay các Broadcast Receiver.

Nếu như trong lập trình iOS hay Windows Phone, chúng ta muốn nhập một ký tự bất kỳ ở màn hình thứ nhất, nhấn nút, sang màn hình thứ 2 hiển thị đúng ký tự đó thì:

  • Truyền dữ liệu thẳng vào URL dạng bbb://v=1&c=2
  • Rồi sau đó ở màn hình thứ 2, lấy dữ liệu ra với key bằng vc tương ứng.

Thì trong Android, mọi thứ hoàn toàn khác: Những dữ liệu được đưa vào một đối tượng thuộc lớp Bundle. Và đối tượng bundle này được chứa trong Intent.

Ví dụ: Ở một màn hình A, bạn kích hoạt chức năng chụp ảnh (tức là màn hình B), chụp xong bạn lấy ảnh về màn hình A. Lúc này Intent chính là:

  • Hành động kích hoạt chức năng chụp ảnh.
  • Hoạt động quay trở về màn hình A sau khi chụp.

Ý nghĩa của tệp tin AndroidManifest xml trong ứng dụng android

Như vậy, không chỉ là chuyển qua chuyển lại giữa các màn hình, Intent còn mang theo dữ liệu giữa các màn hình đó, khiến việc chuyển đổi trở nên đa nhiệm, linh hoạt hơn.

Sau đây là các trường hợp chúng ta có thể sử dụng Intent. Các trường hợp này trong quá trình làm việc bây giờ lẫn về sau, các bạn sẽ sử dụng rất thường xuyên:

Đơn giản là để khởi chạy một activity khác

Để chuyển sang một Activity B từ Activity A, các bạn gọi phương thức startActivity(intent) của Activity đó.

Quay trở lại với Project HelloWorld mà chúng ta đã làm từ bài 1 đến bài 4 trước đó. Lần này ta sẽ tạo một Activity mới và thực hành:

  • Tạo một Activity mới, rỗng, bằng cách chuột phải vào module “app” ở cột Project bên trái, chọn New > Activity > Empty Activity:

Ý nghĩa của tệp tin AndroidManifest xml trong ứng dụng android

  • Ta đặt tên cho nó là SecondActivity, và Android Studio sẽ tự động sinh ra file layout xml cho nó, sau khi hoàn thành bước này chúng ta sẽ có 2 file là activity_second.xmlSecondActivity.java:

Ý nghĩa của tệp tin AndroidManifest xml trong ứng dụng android

  • Để tiện phân biệt với MainActivity, chúng ta sẽ đặt màu cho SecondActivity là màu đen bằng cách thêm thuộc tính android:background trong file activity_second.xml như sau (phần tô vàng là phần thêm vào):

Trong file activity_main.xml, xóa hết các thành phần bên trong FrameLayout, chỉ để lại một Button với code như sau:

activity_main.xml