Bài 9. Cấu trúc và các quy tắc của một dự án Android

Như vậy tới đây các bạn đã thực sự rành cách sử dụng cộng cụ Android Studio rồi, ở bài này Tui sẽ nói chi tiết hơn về cấu trúc của một dự án Android. Từ cấu hình AndroidManifest cấp quyền đọc trộm tin nhắn, đọc dữ liệu trong SDCard, tới các quy tắc đặt tên file, cấu hình màn hình chạy đâu tiên, cách thức thêm thư viện biên dịch….

Các bạn mở lại dự án thần thánh “HelloWorld” nhé.

  • AndroidManifest: Tập tin rất quan trọng, dùng để thiết lập các quyền, Activity, Service, BroadCast Receiver… cho ứng dụng
  • Các file mã nguồn: Tất cả các lớp, Activity, Service, …. xử lý nghiệp vụ người dùng đều nằm trong này
  • Các XML Giao diện: Tất cả các giao diện đều nằm trong mục layout này. Android Studio tách riêng một màn hình tương tác thành Mã lệnh và giao diện riêng.
  • Các Hình ảnh, Xml Resource: Ta có thể đưa hình ảnh vào ứng dụng thông qua hai thư mục drawable và mipmap
  • Các Values: Nơi để ta tạo các tài nguyên như chuỗi, màu, độ phân giải…
  • Cấu hình biên dịch: Build.gradle giúp ta hiệu chỉnh các thông số khi biên dịch phần mềm, cho phép nhúng các thư viện bên ngoài vào ứng dụng…

Ta xem file AndroidManifest.xml:

[code language=”xml”]
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="tranduythanh.com.helloworld">

<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>

</manifest>
[/code]

Ta lưu ý mọi màn hình (Activity) khi được tạo mới thì nó phải được khai báo ở đây, và Activity nào có cấu trúc như trên (MainActivity) thì nó sẽ được kích hoạt chạy lên khi phần mềm được cài vào thiết bị.

Android cho phép nhiều Activity cùng cấu hình là Main Launcher, khi cái vào nó sẽ tạo ra nhiều short cut trong thiết bị tương ứng với từng màn hình.

Khi chúng ta thêm 1 Activity trong phần mềm, thì Activity này sẽ tự động được đưa vào file AndroidManifest.

Để cấp quyền sử dụng cũng như khai thác các tài nguyên phần cứng, ta cũng phải khai báo trong này. Ví dụ muốn cho phần mềm được phép nghe nghe và đọc trộm tin nhắn, muốn cho phần mềm lấy dữ liệu trong SD Card thì cấu hình như sau:

[code language=”xml”]
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="tranduythanh.com.helloworld">
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
<uses-permission android:name="android.permission.READ_SMS"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>

</manifest>
[/code]

Ở trên ta thấy lệnh uses-permission dùng để cấp quyền sử dụng. Ta lưu ý là từ version Android 6.0, Google đã tăng mức bảo mật. Cho dù cấp quyền chỗ này thì cũng phải thêm 1 bước bảo mật nữa, đó là người dùng phải cấp quyền sử dụng trong thiết bị (vá lỗ hổng bảo mật). Do đó thường khi coding mà chạy lên thì nó báo lỗi hoặc làm thinh, khi nào cấp quyền thì sẽ thực hiện được (Tui sẽ nói chi tiết hơn ở chỗ cấp quyền trong các bài lấy dữ liệu từ thiết bị). Còn khi người dùng tải app từ Google Play thì Google cũng có bước hỏi là Phần mềm này có sử dụng các quyền sau, có thể gây mất tiền, bạn có chắn chắn muốn sử dụng không…. và người dùng thường không đọc cho OK hết. Cấp càng nhiều quyền thì càng nhanh hết Pin thôi. Các phần mềm như Zalo, Facebook Messenger, Facetime, Tango… đều là các phần mềm thu thập dữ liệu người dùng cả, chúng đều có chức năng đọc và lấy toàn bộ danh bạ trong thiết bị của bạn, đọc tin nhắn, đọc hình ảnh, truy suất tài nguyên trong thiết bị…. được lưu lên server của họ. Các phần mềm chính thống có cam kết riêng tư thì không sao, nhưng nhiều phần mềm trôi nổi sẽ tấn công bạn. Ngay cả Facebook đó thôi, 1 hãng lớn cam kết là không xâm phạm riêng tư, thì cuối cùng cũng xác nhận là có đọc trộm thông tin bí mật của khách hàng.

Dưới đây là minh họa khi có thêm một màn hình mới, thì Activity này sẽ tự động được khai báo trong AndroidManifest (Bạn không được phép xóa, xóa là lỗi ngay):

Bấm chuột phải vào Package/ chọn New/ chọn Activity/ chọn Empty Activity

Đặt tên là WelcomeActivity (lưu ý các màn hình thì phải luôn có Activity đằng sau nha), nhấn Finish để tạo:

Ta thấy nó tự đưa vào trong AndroidManifest.

Giả sử bây giờ ta muốn WelcomeActivity sẽ được kích hoạt chạy đầu tiên khi phần mềm được cài vào được thoại. Ta cấu hình như sau:

[code language=”xml”]
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="tranduythanh.com.helloworld">

<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".WelcomeActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".MainActivity">

</activity>
</application>

</manifest>
[/code]

Ta thấy đó, chỉ việc CUT intent-filte trong MainActivity chuyển lên cho Welcome là được:

[code language=”xml”]
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
[/code]

Nếu mà cả Welcome và MainActivity cùng có cùng cấu trúc intent-filter như trên thì làm sao? Thì khi cài vào, điện thoại sẽ mở luôn 2 màn hình này, và  2 màn hình này cũng có Icon trên HomScreen của điện thoại.

Nói thêm về thư mục drawable:

Thư mục này sẽ chưa hình ảnh, tài nguyên xml để làm các việc như làm background, làm animation cho phần mềm.

Khi đưa hình ảnh hay file xml vào drawable thì phải đặt theo quy tắc của tên biến: Không được In Hoa ký tự đầu, không có khoảng trắng, không dùng dấu Tiếng Việt, không chứ số đằng trước…

Và nó tương tự cho thư mục mipmap nhé.

Tiếp theo vào thư mục values/colors.xml:

Trước mặt chúng ta là bảng màu. Ta có thể định nghĩa màu như sau:

[code language=”xml”]
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="colorPrimary">#6200EE</color>
<color name="colorPrimaryDark">#3700B3</color>
<color name="colorAccent">#03DAC5</color>
<color name="maudo">#b90702</color>
</resources>
[/code]

Ở trên Tui có dùng biến tên là “maudo

Các bạn là dân Amater đồ họa thì dùng https://www.color-hex.com/ cho lẹ để lấy màu.

ở trên ta tham chiếu tới sài.

Tương tự cho strings.xml:

[code language=”xml”]
<resources>
<string name="app_name">HelloWorld</string>
<string name="hello">Xin chào Thầy Trần Duy Thanh</string>
</resources>
[/code]

dùng biến “hello”:

Kết quả:

Tiếp tục vào phần build.gradle (Module):

Ở đây có:

compileSdkVersion -> API để biên dịch

minSdkVersion-> API tối thiểu mà điện thoại khách hàng phải có

targetSdkVersion->API mà ta mong muốn khách hàng có version y chang như ta cấu hình trong dự án.

Cụ thể:

minSdkVersion là 26. Thì điện thoại khách hàng phải tối thiểu là 26. Còn 25 trở xuống là không có cài đặt được phần mềm, ngay bản thân Google Play nó cũng tự filter không cho khách hàng nhìn thấy phần mềm của ta.

targetSdkVersion là 29 (thường nó bằng compileSdkVersion ): Ta mong muốn rằng phần mềm này chỉ có thể chạy tốt nhất khi điện thoại khách hàng có version là 29. Điều có có nghĩa là gì? nếu điện thoại khách hàng là 30 đi, thì vẫn chạy được (do 30 lớn hơn min 26). Nhưng cái ta cần target tới là 29.

Nếu có sự thay đổi cấu hình gì trong này thì nhớ bấm Sync Now.

Ngoài ra nó còn có nhiều cấu hình khác, khi nào gặp thì Tui nói thêm

Như vậy tới đây bạn đã rành hơn về cấu trúc của một dự án Android rồi nhé

Bài sau ta bắt đầu vào học các Control cơ bản!

Các bạn chú ý theo dõi nhé

Chúc các bạn thành công!

Leave a Reply