Phát triển Android khi sử dụng Eclipse và các widget
của Android (kỳ 1)
Tóm tắt: Hướng dẫn này dành cho
bất cứ ai quan tâm đến việc bắt đầu
phát triển Android trên Eclipse bằng
cách sử dụng trình cắm thêm (plug-in) các công cụ
phát triển Android (ADT). Hướng dẫn này mang đến
cái nhìn thấu đáo về các tính năng nổi bật của một
ứng dụng Android, cùng với lời giải thích ngắn gọn
về các thành phần cơ bản của nó. Quá trình Android
được giới thiệu để phát triển các Giao diện người
dùng (UI) phong phú cho các ứng dụng, như các
widget (tiện ích). Cuối cùng, nó giới thiệu một cách
dễ dàng để kiểm thử các ứng dụng đã phát triển bằng
cách triển khai ứng dụng đó trên một trình mô phỏng
thiết bị Android có kèm trong bộ công cụ phát triển
phần mềm (SDK).
Mở đầu
Android là một hệ điều hành di động, tương tự như
Symbian, iOS, Windows® Mobile, và những hệ điều
hành khác. Ban đầu Android do công ty Android Inc.
phát triển, về sau Google đã mua lại công ty này.
Android bây giờ thuộc quyền sở hữu của Open
Handset Alliance (Liên minh mở về thiết bị cầm tay)
và hoàn toàn là nguồn mở, đó là lý do làm nó ngày
càng phổ biến. Google đã phát hành hầu hết các mã
Android theo Giấy phép của Apache. Với giấy phép
này, các nhà cung cấp có thể thêm phần mở rộng độc
quyền mà không cần đệ trình chúng lại cho cộng
đồng nguồn mở. Nhiều phiên bản Android đã ra thị
trường kể từ lúc khởi đầu (gần đây nhất là quý 3 năm
2010), bao gồm power-packed Froyo (Froyo được
đóng gói mạnh) (phiên bản V2.2). Android đã vượt ra
ngoài, không còn chỉ là một nền tảng cho các thiết bị
di động; hệ thống truyền hình mới của Google cũng
chạy trên Android.
Android sử dụng một nhân (kernel) Linux® đã cải
biên và cho phép ứng dụng được phát triển bằng công
nghệ Java™, sử dụng các thư viện Java (một số trong
các thư viện đó được Google phát triển cho Android).
Mặc dù các ứng dụng Android được viết bằng ngôn
ngữ Java, không có Máy ảo Java (Java Virtual
Machine) nào chạy trong nền tảng này và mã byte
Java không được thi hành ở đây. Các lớp Java được
biên dịch lại thành mã Dalvik thi hành được và chạy
trên một máy ảo Dalvik. Dalvik là một máy ảo
Android đã cải biên và tối ưu hóa cho các thiết bị
chạy bằng nguồn pin và có CPU thấp.
Đối với các nhà phát triển, Android SDK (Bộ công
cụ phát triển phần mềm của Android) cung cấp một
tập hợp các công cụ phong phú, bao gồm trình gỡ rối,
các thư viện, trình mô phỏng thiết bị cầm tay, tài liệu,
mã mẫu và các hướng dẫn. Các ứng dụng Android có
thể dễ dàng được phát triển khi sử dụng Eclipse (nền
tảng phát triển chính thức của Android) với sự trợ
giúp của một trình cắm thêm được gọi là ADT
(Android Development Tools – Các công cụ phát
triển Android). Điều này giúp tận dụng các tính năng
phong phú của Eclipse, như là hỗ trợ nội dung, tìm
kiếm Java, các tài nguyên mở, tích hợp JUnit và các
khung nhìn và các ảnh phối cảnh khác nhau để phát
triển một ứng dụng Android. Một mảng rộng rãi các
widget (tiện ích), tương tự như các widget swing của
Java, tạo điều kiện thuận lợi trong việc tạo một giao
diện người dùng phong phú cho các ứng dụng. Một
công cụ Javadoc chi tiết giúp cho quá trình phát triển
này khá dễ dàng.
Ở đây, chúng ta bắt đầu với một hướng dẫn để chuẩn
bị hệ thống cho việc phát triển Android. Sau đó
chúng ta đề cập ngắn đến các tính năng quan trọng
nhất của một ứng dụng Android bằng cách sử dụng
một ứng dụng Hello World (Chào thế giới) cơ bản
của Android. Chúng ta cũng bàn về các tệp tạo nên
một ứng dụng Android và cách thức giao diện người
dùng được tách khỏi việc triển khai thực hiện như thế
nào. Sau khi trình bày xong quá trình tạo, phát triển
và khởi chạy một ứng dụng Android từ Eclipse,
chúng ta chuyển sang thảo luận về một vài widget
của Android giúp cho việc xây dựng một giao diện
người dùng phong phú (một phần rất quan trọng của
các ứng dụng di động). Chúng ta trình bày một số
widget cơ bản với sự trợ giúp của một ứng dụng mẫu.
Chúng ta cũng bàn về cách sử dụng widget listView
trong một ứng dụng giống như danh bạ điện thoại và
những cách triển khai thực hiện nó. Trong lúc đó,
chúng ta cũng bàn về các quyền hạn cần phải được
thiết lập để có thể cho phép một ứng dụng truy cập
một số dữ liệu từ hệ điều hành. Nhìn chung, vài giờ
học theo bài viết này sẽ giúp bạn tạo một ứng dụng
triển khai thực hiện những chức năng cơ bản và có
một giao diện người dùng hấp dẫn.
1. Các yêu cầu hệ thống
Trước khi bắt đầu phát triển Android, hãy chắc chắn
rằng bạn đã cài đặt các phần mềm sau:
Eclipse SDK (Bộ công cụ phát triển phần mềm
Eclipe) — phiên bản V3.5 được đề xuất sử dụng
với Android SDK mới nhất. Có thể tải phần mềm
này từ trang tải Galileo.
Android SDK (Bộ công cụ phát triển phần mềm
Android).
Android Development Tools (ADT - Các công
cụ phát triển Android) — Đây là một trình cắm
thêm Eclipse. Nó tương đương với JDT (Các
công cụ phát triển Java) để phát triển Android.
Hãy làm theo các hướng dẫn chi tiết để cài đặt
trình cắm thêm ADT cũng như thiết lập vị trí của
Android SDK trong Eclipse.
2. Thuật ngữ Android
Một ứng dụng Android điển hình có các thành phần
sau. Dưới đây cũng trình bày các định nghĩa do trang
Web của nhà phát triển Android cung cấp:
Activity (Hoạt động) — Một hoạt động biểu thị
một giao diện người dùng trực quan của một nỗ
lực tập trung có chủ hướng mà người dùng có thể
thực hiện. Ví dụ, một hoạt động có thể biểu thị
một danh sách các mục trình đơn mà người dùng
có thể lựa chọn từ đó hoặc nó có thể hiển thị các
hình ảnh cùng với lời chú thích của chúng. Một
ứng dụng tin nhắn văn bản có thể có một hoạt
động để hiển thị một danh sách các địa chỉ liên
lạc để gửi tin nhắn đến, có một hoạt động thứ hai
để viết tin nhắn cho địa chỉ liên lạc đã chọn và
các hoạt động khác để xem lại tin nhắn cũ hoặc
thay đổi các giá trị cài đặt. Mặc dù các hoạt động
này làm việc cùng nhau để tạo thành một giao
diện người dùng gắn kết, nhưng mỗi hoạt động
độc lập với các hoạt động khác.
Content providers (Những nhà cung cấp nội
dung) — Một nhà cung cấp nội dung tạo ra một
tập hợp cụ thể các dữ liệu của ứng dụng, sẵn có
cho các ứng dụng khác. Các dữ liệu có thể được
lưu trữ trong hệ thống tệp, trong một cơ sở dữ
liệu SQLite hoặc theo cách hợp lý bất kỳ khác.
Service (Dịch vụ) — Một dịch vụ không có một
giao diện người dùng trực quan mà chạy ở nền
sau, trong một khoảng thời gian không xác định.
Ví dụ, một dịch vụ có thể chơi nhạc nền khi
người dùng tham dự vào các vấn đề khác hoặc
nó có thể tìm nạp dữ liệu qua mạng hoặc tính
toán một cái gì đó và cung cấp kết quả cho các
hoạt động cần nó.
Broadcast receivers (Các bộ thu quảng bá) —
Một bộ thu quảng bá là một thành phần không
làm gì khác ngoài thu nhận và phản ứng lại với
các thông báo quảng bá. Nhiều thông báo quảng
bá bắt nguồn từ mã hệ thống — các thông báo
thay đổi-múi giờ, các thông báo pin sắp hết pin,
thay đổi ngôn ngữ-ưa thích, v.v.
3. Một số thuật ngữ khác cần biết:
Intent (Ý định) — Các hoạt động, các dịch vụ và
các bộ thu quảng bá được kích hoạt bằng các
thông báo không đồng bộ được gọi là các ý định.
Một ý định là một đối tượng Intent để lưu giữ
các nội dung của thông báo. Ví dụ, nó có thể
truyền đạt yêu cầu một hoạt động để hiển thị một
hình ảnh cho người sử dụng hoặc cho phép
người dùng chỉnh sửa một số văn bản.
Intent filter (Bộ lọc ý định) — Một đối tượng
Intent có thể gọi tên rõ ràng một thành phần
đích. Nếu nó làm như vậy thì Android sẽ tìm
thấy thành phần đó (dựa vào các khai báo trong
tệp bản kê) và kích hoạt thành phần này. Tuy
nhiên, nếu đích không được gọi tên rõ ràng, thì
Android phải định vị thành phần tốt nhất để đáp
ứng ý định đó. Nó làm như vậy bằng cách so
sánh đối tượng Intent với các bộ lọc ý định của
các đích có tiềm năng. Bộ lọc ý định của một
thành phần thông báo cho Android về các loại ý
định mà thành phần đó có khả năng xử lý.
4. Tạo một Thiết bị ảo Android
Bước này cần thiết để tạo một trình mô phỏng điện
thoại Android/AVD (Android Virtual Device - Thiết
bị ảo của Android ) trên đó các ứng dụng có thể chạy
và được thử nghiệm. Lưu ý rằng để khởi động cho
một AVD phải mất một chút thời gian. Tin vui là
không cần các AVD riêng biệt cho mỗi ứng dụng
được triển khai và thử nghiệm. Một khi AVD được
khởi chạy, có thể triển khai một số lượng ứng dụng
bất kỳ trong khi nó vẫn còn đang chạy và thậm chí có
thể sử dụng nó để gỡ rối ứng dụng. Để tạo một AVD:
1. Trong Eclipse, chọn Window > Android SDK
và AVD Manager (Trình quản lý AVD).
2. Chọn Virtual Devices (Các thiết bị ảo) ở khung
bên trái.
3. Nhấn New. Hộp thoại Create New AVD (Tạo
AVD mới) xuất hiện.
4. Gõ tên của AVD vào, ví dụ như "myPhone."
5. Chọn một đích. Đích là một nền tảng (đó là một
phiên bản Android SDK, ví dụ như 2.1) để chạy
trên trình mô phỏng . Bạn cũng sẽ nhận được
một tùy chọn để chọn các API của Google,
nhưng việc đó là không cần thiết trừ khi chúng ta
đặc biệt muốn có một số API của Google trong
ứng dụng. Các trường còn lại tạm thời có thể bỏ
qua vào lúc này.
6. Nhấn Create AVD (Tạo AVD).
Một khi AVD này được khởi chạy, bạn có thể thấy nó
mang lại dáng vẻ và cảm nhận đầy đủ của một điện
thoại di động dựa trên Android thực, có đủ bàn phím
và hỗ trợ đa chạm. Nó cũng có thể được sử dụng
trong một loạt các cấu hình để thử nghiệm ứng dụng
của bạn, như là chế độ hướng trang nằm ngang/thẳng
đứng, cường độ mạng và mạng chuyển vùng , v.v.
Tất cả những tùy chọn này có thể được cấu hình khi
sử dụng trình quản lý AVD. AVD hoàn toàn độc lập
để mô phỏng các thiết bị khác nhau sẵn có. Bạn có
thể tạo các AVD khác nhau theo các cấu hình khác
nhau và thử nghiệm ứng dụng của bạn trên từng
AVD để chắc chắn rằng nó tương thích với mọi loại
thiết bị.
5. Tạo một dự án Android
Đây là cách tạo một dự án Android mới trong Eclipse
(xem Hình 1):
1. Từ Eclipse, chọn File > New > Project. Một thư
mục có tên là Android sẽ có mặt trong hộp thoại
nếu trình cắm thêm ADT cho Eclipse đã được
cài đặt thành công. Mở rộng thư mục đó sẽ cung
cấp tùy chọn cho một dự án Android mới. Chọn
nó và nhấn Next.
2. Bạn sẽ được nhắc điền các chi tiết sau đây vào
trong một biểu mẫu:
Project name (Tên dự án) — Đây là tên của dự
án của bạn và có thể là cái tên nào đó như
"HelloWorld" chẳng hạn.
Application name (Tên ứng dụng) — Đây là tên
sẽ xuất hiện ở khắp mọi nơi trong thiết bị
Android của bạn, cùng với các biểu tượng trong
trình đơn, trong các phím tắt và trên thanh tiêu
đề khi bạn chạy ứng dụng của mình. Đây cũng
có thể là cái tên nào đó như là "Hello Android."
Package name (Tên gói) —
com.example.helloandroid hoặc vùng tên riêng
của bạn. Tên gói theo cùng các quy tắc như các
tên gói trong ngôn ngữ Java.
Create activity (Tạo hoạt động) — Ở đây, với
mục đích minh họa, ta có thể gọi nó là
SaySomething (Nói gì đó). Đây là tên cho lớp sẽ
được ADT (Các công cụ phát triển Android) tạo
ra. Đây sẽ là một lớp con của lớp Activity của
Android. Một hoạt động đơn giản là một lớp có
thể chạy và thực hiện một số công việc. Nó có
thể có một giao diện người dùng. Một ứng dụng
có thể chứa một hoặc nhiều hoạt động. Thông
thường chúng có mối quan hệ 1:1 với các màn
hình có trong một ứng dụng. Một ứng dụng di
chuyển từ một hoạt động này sang một hoạt động
khác bằng cách gọi một phương thức có tên là
startActivity() hay startSubActivity().
Min SDK version (Phiên bản SDK tối thiểu) —
Điều này quy định mức API tối thiểu theo yêu
cầu của ứng dụng của bạn. Phiên bản mới nhất là
7.
Hình 1. Tạo một dự án Android mới
6. Các chi tiết của dự án Hello Android (Chào
Android)
Hello Android là một dự án Android cơ bản, chỉ đơn
giản in Hello World trên màn hình. Nó có vai trò sau
trong bài viết này:
Để trình diễn quá trình tạo một dự án Android
mới.
Để đưa ra một tổng quan về các tệp trong một dự
án Android và mục đích của chúng.
Để trình diễn cách triển khai một ứng dụng trên
AVD và thử nghiệm nó.
Để xem các tệp và phần tài nguyên khác của dự án
Android hãy sử dụng khung nhìn Package Explorer
(Trình thám hiểm gói) trong Eclipse (Window >
Show View > Package Explorer). Dự án Android
vừa được tạo ra sẽ bao gồm các thứ sau (xem Hình
2):
Có hai thư mục chứa mã nguồn:
1. src chứa tất cả các lớp do người dùng xác định,
bao gồm lớp hoạt động mặc định.
2. gen chứa các tệp do ADT tạo tự động. Tệp
R.java bên trong thư mục này chứa các tham
chiếu tĩnh tới tất cả tài nguyên hiện có trong thư
mục res để cho chúng có thể được tham khảo dễ
dàng và động từ mã Java. Không nên sửa đổi thủ
công các nội dung của R.java.
Hình 2. Các nội dung của dự án Hello Android
Một thư mục res chứa tất cả các tài nguyên cho
dự án: các biểu tượng, các hình ảnh, các chuỗi ký
tự và các bố trí. Việc có một thư mục tài nguyên
tách riêng giữ cho các tài nguyên không phải mã
nguồn ở ngoài mã nguồn và các tài nguyên có
thể được lựa chọn động dựa trên phần cứng,
ngôn ngữ, hướng trang và vị trí.
Nó bao gồm:
a. (Các) thư mục drawable — dành cho tất cả
các tệp hình ảnh.
b. Thư mục layout (bố trí) — dành cho các bố
trí quy định các màn hình giao diện người
dùng cho các hoạt động, dưới dạng mã
XML. Tệp Main.xml được tự động tạo ra.
Thư mục này gắn liền với cách bố trí thẳng
đứng mặc định. Để biểu diễn một số giao
diện người dùng theo bố trí nằm ngang (khi
một thiết bị Android xoay 90 độ), tạo một
thư mục layout-land (vùng bố trí) và đặt tệp
XML bố trí của bạn ở đó. Tệp main.xml có
một biểu diễn giao diện người dùng hấp dẫn,
như trong Hình 3. Bạn có thể kéo và thả các
bố trí khác nhau và các khung nhìn trên một
màn hình trống để xây dựng các thành phần
giao diện người dùng cho hoạt động này.
c. Thư mục values (các giá trị) — dành cho tất
cả các cặp tên-giá trị (các chuỗi ký tự mà
ứng dụng của bạn sẽ xác định).
Tệp AndroidManifest.xml cũng là một phần
quan trọng của dự án. Nó tương đương với tệp
plugin.xml cho các trình cắm thêm. Về cơ bản nó
định nghĩa các hoạt động trong các ứng dụng và
quy định các hành động đã được chỉ rõ cho mỗi
hoạt động. Nó cũng liệt kê ra các quyền hạn mà
ứng dụng yêu cầu để thực hiện các hành động
khác nhau. Một lần nữa, tệp này có một giao
diện người dùng đẹp.
Hình 3. Giao diện người dùng cho tệp main.xml
Hãy xem xét các nội dung thực tế của thư mục
project (dự án) trên đĩa. Mở Navigator View (Khung
nhìn của dẫn hướng) trong Eclipse (Window > Show
View > Navigator). Bạn sẽ nhận được cấu trúc cho
dự án HelloWorld như trong Hình 4. Ngoài các tệp
class được biên dịch, bạn nhận được ba tệp sau đây
trong thư mục bin:
1. Tệp classes.dex — Tệp có thể thực thi được tạo
ra từ các lớp biên dịch.
2. Tệp HelloWorld.apk — Tệp lưu trữ nén sẽ được
chuyển đến thiết bị Android. Ứng dụng này có
thể được cài đặt trên thiết bị Android bất kỳ
thông qua tệp lưu trữ này.
3. Tệp resources.ap_ — Tệp các tài nguyên ứng
dụng nén.
Cấu trúc thư mục của dự án Android
'Hoạt động' chính của ứng dụng
Chúng ta hãy xem xét MainActivity.java.
Liệt kê 1. Tệp MainActivity.java
package com.example.helloandroid;
import android.app.Activity;
import android.os.Bundle;
public class MainActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
}
Những điều cần lưu ý về tệp này là:
Tệp MainActivity mở rộng một lớp Android cơ
bản có tên là Activity, nằm trong gói
android.app.
Phương thức onCreate() là điểm nhập mặc định
cho hoạt động này và phải được triển khai thực
hiện cho từng hoạt động mới. Nó nhận một đối
số kiểu Bundle (bó). Các tùy chọn và các tham
số cần thiết cho việc tạo hoạt động này được
chuyển vào tham số này.
Phương thức setContentView() có trách nhiệm
tạo giao diện người dùng chính sử dụng đối số
R.layout.main. Đây là một hằng số được định
nghĩa trong R.java và biểu diễn cách bố trí chủ
yếu có trong các tài nguyên của ứng dụng đó.
Tệp Main.xml
Tệp XML này mô tả giao diện người dùng (UI) của
ứng dụng. Một hoạt động có thể tham chiếu đến UI
này. Tuy nhiên, UI này không tự ràng buộc nó vào
bất kỳ hoạt động nào. Một UI được xây dựng bằng
cách sử dụng các bố trí và các widget. Tệp main.xml
mà Eclipse xây dựng theo mặc định gồm có một
LinearLayout duy nhất, có nghĩa là tất cả các phần tử
được sắp xếp trong một cột duy nhất. Rồi nó định
nghĩa một textView, được dùng để hiển thị văn bản
tĩnh không chỉnh sửa được. Trong trường hợp này,
chuỗi "hello" được định nghĩa trong tệp strings.xml
(ký hiệu '@' dùng để chỉ một tệp được định nghĩa
trong thư mục res). Mỗi phần tử khung nhìn bổ sung
có các thuộc tính, như là layout_height (độ cao_ bố
trí) và layout_width (độ rộng_bố trí), v.v.
Hình 5. Tệp Main.xml và khung nhìn properties
(các đặc tính)
Một cách dễ dàng để làm việc với tệp main.xml là
thông qua khung nhìn các đặc tính (Window > Show
View > Other > General > Properties). Khi chọn
một khung nhìn cụ thể trong khung nhìn phác thảo,
tab các đặc tính được điền đủ tất cả các thuộc tính có
khả năng của khung nhìn đó, như trong Hình 5. Hầu
hết các thuộc tính này chỉ có thể chọn một số giá trị
cố định, và các giá trị cố định này lại có thể được
chọn từ một trình đơn thả xuống bên cạnh mỗi thuộc
tính trong tab các đặc tính. Ví dụ, để thiết lập thuộc
tính layout_height, bạn có thể nhìn thấy hộp thả
xuống và nhận ra rằng nó chỉ có hai giá trị được
phép: wrap_content và fill_parent. (wrap_content sẽ
chỉ dựng lên khung nhìn theo kích thước ban đầu của
nó, trong khi fill_parent sẽ co giãn nó để bao trùm
toàn bộ chiều cao hoặc chiều rộng hoặc cả hai).
Lưu ý: Với các thuộc tính layout_height và
layout_width, bạn cũng có thể xác định kích thước
theo hai đơn vị sau: (a) Các điểm ảnh độc lập với mật
độ (dp) — Kích thước này cho phép bố trí giống nhau
khi được xem trên các thiết bị có các kích thước màn