Page 1
NHẬN XÉT CỦA GIẢNG VIÊN HƯỚNG DẪN
............................................................................................................................................................................................
............................................................................................................................................................................................
............................................................................................................................................................................................
............................................................................................................................................................................................
............................................................................................................................................................................................
............................................................................................................................................................................................
............................................................................................................................................................................................
............................................................................................................................................................................................
............................................................................................................................................................................................
............................................................................................................................................................................................
............................................................................................................................................................................................
............................................................................................................................................................................................
............................................................................................................................................................................................
............................................................................................................................................................................................
............................................................................................................................................................................................
............................................................................................................................................................................................
............................................................................................................................................................................................
............................................................................................................................................................................................
............................................................................................................................................................................................
............................................................................................................................................................................................
............................................................................................................................................................................................
............................................................................................................................................................................................
............................................................................................................................................................................................
............................................................................................................................................................................................
............................................................................................................................................................................................
............................................................................................................................................................................................
............................................................................................................................................................................................
............................................................................................................................................................................................
............................................................................................................................................................................................
............................................................................................................................................................................................
............................................................................................................................................................................................
............................................................................................................................................................................................
............................................
Ngày ...... Tháng ....... Năm .......
Giảng Viên Hướng Dẫn
(Ký và ghi rõ họ tên)
1
Page 2
LỜI CẢM ƠN
Em xin chân thành cảm ơn các thầy cô trong bô môn Mang và truyên thông cùng
toàn thể các thầy cô trường Đai Học Công Nghê Thông Tin và Truyên Thông –
Đai học Thái Nguyên đã truyên đat cho chúng em những kiến thức quý giá trong
thời gian qua.
Em xin chân thành cảm ơn Thầy Nguyễn Anh Chuyên đã tận tình hướng dẫn, chỉ
bảo em trong suốt quá trình thực hiên đê tài.
Cuối cùng tôi xin cảm ơn các ban trong khoa Công Nghê Thông Tin, những
người đã giúp đỡ, chia sẽ kiến thức, tài liêu ... trong suốt quá trình thực hiên
nghiên cứu đê tài.
Trong pham vi khả năng cho phép, em đã rất cố gắng để hoàn thành đê tài môt
cách tốt nhất. Song, chắc chắn sẽ không tránh khỏi những thiếu sót. Em kính
mong nhận được sự cảm thông và những ý kiến đóng góp của quý thầy cô và các
ban.
Nhóm sinh viên thực hiên
Pham Xuân Quân.
Thái nguyên, tháng 6 năm 2012
2
Page 3
MỤC LỤC
LỜI CẢM ƠN 2
MỞ ĐẦU 4
CHƯƠNG 1 : TỔNG QUAN VỀ ĐIỆN TOÁN DI ĐỘNG VÀ NỀN TẢNG LẬP
TRÌNH ANDROID 5
1.1 Tông quan vê điên toán di đông 5
1.1.1 Điên toán di đông 5
1.1.2 Tiêm năng phát triển của lập trình di đông 6
1.2 Nên tảng Android 7
1.2.1 Lược sử vê Android 7
1.2.2 Kiến trúc nên tảng Android 9
1.2.3 Các công cụ để tao môt ứng dụng Android 13
1.2.4 Xây dựng các thành phần ứng dụng Android 14
1.2.5 Xây dựng các thành phần giao diên ứng dụng Android 29
1.2.6 Xử lý bất đồng bô37
CHƯƠNG 2: XÂY DỰNG CHƯƠNG TRÌNH QUẢN LÝ CONTACTS 43
2.1 Phân tích thiết kế hê thống quản lý Contact43
2.1.1 Đặc tả bài toán 43
2.1.2 Đặc tả chức năng 43
2.1.3 Phân tích hê thống với UML 45
2.2 Xây dựng giao diên chương trình 48
2.2.1 Giao diên chính – hiển thi danh sách thông tin liên lac48
2.2.2 Giao diên tìm kiếm thông tin liên lac 49
2.2.3 Giao diên thêm mới thông tin liên lac và sửa thông tin liên lac
51
2.2.4 Các giao diên Menu sử dụng trong chương trình 51
KẾT LUẬN 53
Kết quả đat được 53
Hướng phát triển 53
TÀI LIỆU THAM KHẢO 54
3
Page 5
MỞ ĐẦU
Hiên nay ngành công nghiêp phần mêm đang rất phát triển và ngành công nghiêp
phần mêm trên điên thoai di đông cũng không nằm ngoài xu thế đó. Tuy còn
nhiêu han chế trong phần cứng của điên thoai di đông nhưng nó đã thể hiên được
sức manh của mình trong rất nhiêu các lĩnh vực khác nhau như giải trí, các tiên
ích, thanh toán điên tử .v.v..
Các hê điêu hành như Window Mobile, Symbian… phần nào cũng gây ít nhiêu
khó khăn cho những ai có ý đinh xây dựng các ứng dụng trên nó. Đối với
Window Mobile là môt công nghê của Microsoft và hoàn toàn đóng đối với
người dùng, nhà phát triển ứng dụng chỉ dựa hoàn toàn vào công nghê mà
Microsoft cung cấp, còn Symbian thì viêc cấu hình để có thể lập trình trên nó
cũng vô vàn khó khăn, đặc biêt là nó sử dụng ngôn ngữ C/C++ để làm nên tảng
lập trình rõ ràng là không thuận tiên trong viêc phát triển ứng dụng.
Xuất phát từ nhu cầu thực tế đó, Google đã manh dan nghiên cứu và đưa ra môt
nên tảng hê điêu hành mới, đó chính là Android. Môt nên tảng hê điêu hành mã
nguồn mở hoàn toàn và dựa vào môt ngôn ngữ lập trình rất manh là Java để phát
triển ứng dụng. Chính vì Android hỗ trợ Java ngay từ trong nên tảng của nó, nên
viêc viết ứng dụng, ngay cả sử dụng các chức năng của phần cứng là hoàn toàn
dễ dàng thông qua viêc sử dụng bô công cụ hỗ trợ lập trình được cung cấp hoàn
toàn miễn phí, là Android SDK.
Nhận thấy nhu cầu của con người trong lĩnh vực giải trí trên di đông ngày càng
cao và Android chính là nên tảng ứng dụng có thể phát triển trong tương lai.
Chính vì vậy em chọn đê tài “Tìm hiểu lập trình Android và xây dựng ứng dụng
quản lý Contacts Demo” nhằm hiểu rõ vê các kĩ thuật lập trình trên thiết bi đông
Android.
5
Page 6
CHƯƠNG 1 : TỔNG QUAN VỀ ĐIỆN TOÁN DI ĐỘNG VÀ NỀN
TẢNG LẬP TRÌNH ANDROID
Tông quan vê điên toán di đông
Theo môt báo cáo của hãng Morgan Stanley, đến năm 2015 viêc sử dụng và truy
cập Internet di đông sẽ lớn hơn rất nhiêu so với sử dụng Internet trên máy tính
PC.( Morgan Stanley là môt ngân hàng đầu tư, công ty chứng khoán có trụ sở
chính tai Hoa Kỳ. Đây là môt trong những thể chế tài chính lớn nhất của thể
giới.)
Theo báo cáo của Công ty IDC, tai Viêt Nam, tông doanh thu bán hàng của máy
tính để bàn quý III-2011 tăng 5%, máy tính xách tay nhỏ gọn tăng 83% so với
cùng kỳ năm trước. Xu thế hiên nay là sử dụng nhiêu thiết bi di đông như các
dòng điên thoai thông minh, máy tính bảng tablet dựa trên nên tảng web, hê
thống GPS, game video và thiết bi ứng dụng không dây trong gia đình…
Với sự phát triển và cải tiến liên tục thiết bi di đông, chúng ta có căn cứ để tin
rằng, trong tương lai gần, máy tính truyên thống PC sẽ bi mất ưu thế so với thiết
bi cá nhân di đông nhỏ gọn, tiên ích và tích hợp đầy đủ chức năng của môt chiếc
máy tính. Chúng ta hoàn toàn có thể nhận đinh: “Điên toán di đông đang là xu
thế của thời đai”.
Điên toán di đông
Điên toán di đông là gì ?
Nói môt cách tông quan thì điên toán di đông là viêc sử dụng những thiết bi cầm
tay nhỏ gọn để phục vụ những mục đích của con người như làm viêc, vui
chơi,giải trí,học tập ..v.v. Đó là viêc sử dụng ngày càng nhiêu thiết bi di đông
như các dòng điên thoai thông minh, máy tính bảng tablet dựa trên nên tảng web,
hê thống GPS, game video và thiết bi ứng dụng không dây trong mọi sinh hoat
của con người.
Điên toán di đông đang phát triển như thế nào ?
6
Page 7
Sự phát triển bùng nô các giải pháp công nghê dành cho thiết bi di đông cũng là
môt trong những nhân tố góp phần tao ra các thiết bi cầm tay nhỏ gọn, đáp ứng
mọi nhu cầu tiêu dùng thông tin và ứng dụng của người sử dụng.
Những người kinh doanh, những người quản lý, những người tiêu dùng bình
thường hay cả những người lớn tuôi. Chúng ta đêu trở lên di đông và khao khát
được di đông nhiêu hơn. Di chuyển khắp thế giới để kinh doanh, hôi họp với các
đối tác hoặc môt môi trường làm viêc “di đông” đã gần như trở thành môt điêu
rất bình thường trong cuôc sống. Chúng ta có thể làm viêc mà không cần rời khỏi
nhà, hoặc làm viêc trong khi vẫn còn đang ngồi nhâm nhi tách cà phê trong môt
quán cà phê. Những kỳ nghỉ đơn thuần chỉ là di chuyển từ nước này sang nước
khác.
Điên toán di đông phát triển môt cách manh mẽ môt phần lớn dựa trên nên tảng
công nghê của internet, công nghê mang di đông 2G, 3G và 4G và đặc biêt là
công nghê điên toán đám mây. Người sử dụng, sử dụng những thiết bi cầm tay
(máy tính sách tay, tablet, smartphone…) để kết nối vào internet chia sẻ và cập
nhật thông tin. Sự phát triển manh mẽ của điên toán di đông được thể hiên rõ ở
những con số sau: Tính đến hết quý 1/2012 doanh số bán dòng điên thoai thông
minh (smartphone) tăng lên đáng kể, đat 144,4 triêu chiếc, tăng 44,7% so với quý
1/2011 và máy tính xách tay nhỏ gọn tăng 83% so với cùng kỳ năm trước. Trong
năm 2012, theo IDC dự đoán doanh số bán máy tính bảng đat khoảng 53,5 triêu
máy.
Tiêm năng phát triển của lập trình di đông
Với sự phát triển như vũ báo của điên toán di đông trong thời kì hiên nay, đã kéo
theo sự phát triển manh mẽ của ngành công nghiêp phần mêm ứng dụng cho thiết
bi di đông. Trước thực tế đó, rất nhiêu công ty, tô chức đã xây dựng và phát triển
các kho ứng dụng của họ cho thiết bi di đông.
Tháng 7/2008, Apple ra mắt kho ứng dụng di đông trực tuyến đầu tiên
với 500 ứng dụng cho các sản phẩm iPhone, iPod. Khi đó, thi trường ứng dụng
mobile hầu như chưa hê tồn tai. Đến nay, App Store đã có hơn 400,000 ứng dụng
với 10 tỷ lượt tải vê, dẫn đầu ngành vê dich vụ ứng dụng cho di đông. Sau thành
7
Page 8
công của Apple, các hãng di đông nhận thấy tiêm năng của thi trường Mobile
Apps đã liên tiếp cho ra mắt kho ứng dụng của mình. Tiêu biểu là Ovi Store của
Nokia (55,000 ứng dụng, 760 triêu download), Android Market của Google
(200,000 ứng dụng,4,5 tỉ download), App World của Blackberry (30,000 ứng
dụng, 3 triêu download/ngày), và mới đây là Huawei Technology - dành cho các
nhà mang di đông trên toàn cầu với hơn 80.000 ứng dụng di đông/nhac, phim, e-
book cho HĐH Android, Symbian và Windows Mobile... Góp vào tông doanh
thu hàng năm ngành lên tới 7 tỷ USD, dự báo sẽ đat 30 tỷ USD trong 3 năm tới.
Tai Viêt Nam, môt số doanh nghiêp đã xây dựng kho ứng dụng di đông riêng như
F-Store của FPT, mStore của Tông công ty Viễn thông Quân đôi Viettel, LG
Application Mobile của LG hay Nokia Ovi với phiên bản dành cho thi trường
Viêt Nam. VTC Mobile, môt trong các đơn vi dẫn đầu thi phần dich vụ giá tri gia
tăng trên di đông giai đoan 2006-2010 tai Viêt nam cũng đã hợp tác với Q-
mobile để xây dựng Q-Store, cung cấp các ứng dụng do Viêt Nam xây dựng tới
hàng triêu người sử dụng Q Mobile. Viêt Nam hiên có tới 50 triêu thuê bao di
đông hoat đông thường xuyên và nên tảng 3G đã được các nhà mang triển khai
rông khắp với 69% người sử dụng ở đô tuôi trung bình 15 – 24 tao nên môt thi
trường có tốc đô phát triển nhanh chóng và manh mẽ.
Như vậy, lập trình di đông hiên đang có tiêm năng rất lớn, đây ngành, lĩnh vực
cực kì sôi đông và phát triên trong thời đai hiên nay.
Nên tảng Android
1.2.1 Lược sử vê Android
Android được phát hành phiên bản đầu tiên 11/11/2007, là môt môi trường hê
điêu hành hoàn chỉnh dựa trên hê điêu hành nhân Linux V2.6. Lúc đầu, đích triển
khai đối với Android là lĩnh vực điên thoai di đông, gồm các loai điên thoai
thông minh và các loai thiết bi điên thoai kiểu gập chi phí thấp. Tuy nhiên, pham
vi đầy đủ các dich vụ điên toán của Android và sự hỗ trợ chức năng phong phú
của nó có tiêm năng mở rông ra ngoài thi trường điên thoai di đông. Android còn
có thể hữu ích đối với các nên tảng và ứng dụng khác.
8
Page 9
Nên Android là sản phẩm của Open Handset Alliance (Liên minh thiết bi cầm tay
mở), môt tập đoàn các tô chức cùng hợp tác với nhau để xây dựng nên môt loai
điên thoai di đông tốt hơn. Tập đoàn do Google đứng đầu này gồm các nhà vận
hành (điên thoai) di đông, các nhà sản xuất thiết bi cầm tay, sản xuất linh kiên,
các nhà cung cấp nên và giải pháp phần mêm và các công ty tiếp thi. Từ môt
quan điểm phát triển phần mêm, Android trở thành trung tâm của thế giới mã
nguồn mở và rất có tiêm năng phát triển.
Thiết bi cầm tay có khả năng Android đầu tiên trên thi trường là thiết bi G1 do
HTC sản xuất và được bán trên T-Mobile. Nó trở nên sẵn có sau gần môt năm
đồn đai, khi mà các công cụ phát triển phần mêm sẵn có duy nhất chỉ là môt số
bản phát hành Bô công cụ phát triển phần mêm (SDK) được cải tiến dần từng
bước. Khi ngày phát hành G1 gần đến, nhóm Android đã phát hành SDK V1.0 và
các ứng dụng bắt đầu vượt lên nhằm hướng tới nên tảng mới này.
Để kích thích đôi mới và phát triển các ứng dụng của Android, Google đã tài trợ
hai vòng cuôc thi “Các thách thức nhà phát triển Android”, và hàng triêu đô la đã
được đô vào các ứng dụng dự thi hàng đầu. Vài tháng sau G1, Android Market
được phát hành, cho phép người sử dụng duyêt và tải vê các ứng dụng trực tiếp
vào điên thoai của họ. Trong vòng 18 tháng, môt nên di đông mới đã chính thức
có mặt trên thi trường và sẽ là đối thủ canh tranh nặng ký của các nên di đông
phô biến trước đó như Symbian hay Window Mobile.
Android cung cấp khá đầy đủ các công cụ cơ bản và được thiết kế sao cho các
nhà phát triển có thể tận dụng tối đa lợi thế của thiết bi cầm tay để xây dựng nên
các ứng dụng thực sự thuyết phục. Họ có thể tao môt ứng dụng có thể gọi thực
hiên các chức năng lõi trong điên thoai như thực hiên cuôc gọi, gửi tin nhắn
SMS, dùng camera … Hay chia sẻ thông tin cá nhân lên trang web chẳn han như
thông tin liên lac, vi trí đia lí, lich biểu… Các nhà phát triển còn có thể làm bất
cứ viêc gì trên thiết bi Android bởi vì hê thống Android giao tiếp thông qua các
Intents – nó đơn giản là môt chuỗi mô tả môt hành đông nào đó – ví dụ:
“android.provider.Telephony.SMS_RECEIVED”. Android còn cung cấp sẵn các
dich vụ đinh vi (và đây là môt thế manh của Google) cùng với môt tập các ứng
9
Page 10
dụng vê “Map” với các tính năng rất ấn tượng như dò đường, tính khoảng cách
đia điểm, tìm ban… Ngoài ra còn có môt số tính năng nôi bật khác như
Animation và đồng thời cũng hỗ trợ media-playback.
Sự phát triển của hê điêu hành Android nôi bật qua các phiên bản chính dành cho
điên thoai di đông (Android 2.3), dành cho tablet (Android 3.0) … Phiên bản mới
nhất hiên nay là Android 4.0.x (Ice Cream Sandwich) là phiên bản dành cho cả
smatphone và tablet.
1.2.2 Kiến trúc nên tảng Android
Với khả năng rông rãi của Android, sẽ rất dễ dàng nhầm lẫn nó với môt hê điêu
hành máy tính để bàn. Android là môt môi trường phân tầng, xây dựng trên nên
của hê điêu hành nhân Linux, và nó bao hàm nhiêu chức năng phong phú. Hê
thống giao diên người sử dụng gồm có:
Cửa sô
Khung hình
Các tiểu trình để hiển thi các phần tử phô biến như các hôp biên soan, danh sách,
danh sách thả xuống.
Android gồm môt trình duyêt có thể nhúng vào được, được xây dựng dựa trên
WebKit, chính là máy (engine) trình duyêt mã nguồn mở cũng đang là đông cơ
của trình duyêt Safari của iPhone.
Android khoe ra môt mảng dồi dào nhiêu tùy chọn kết nối, gồm WiFi, Bluetooth
và dữ liêu không dây qua môt kết nối di đông (như GPRS, EDGE và 3G).Môt kỹ
thuật phô biến trong các ứng dụng Android là liên kết tới Google Maps để hiển
thi môt đia chỉ trực tiếp trong môt ứng dụng. Viêc hỗ trợ cho các dich vụ dựa trên
đia điểm (chẳng han như GPS) và các dụng cụ đo gia tốc cũng có sẵn trong gói
phần mêm Android, mặc dù không phải tất cả các thiết bi Android được trang bi
với các phần cứng cần thiết. Ngoài ra còn có cả hỗ trợ máy ảnh nữa (camera).
Vê mặt lich sử, có hai lĩnh vực mà các ứng dụng di đông đã gắng sức theo kip
các đối tác máy tính để bàn là đồ họa/đa phương tiên và phương thức lưu trữ dữ
liêu. Android giải quyết thách thức vê đồ họa bằng sự hỗ trợ dựng sẵn cho đồ họa
10
Page 11
2D và 3D, gồm cả thư viên OpenGL. Gánh nặng lưu trữ dữ liêu được giảm nhẹ vì
nên Android có gồm cả cơ sở dữ liêu SQLite mã nguồn mở phô biến. Hình 1 cho
thấy môt khung hình đơn giản hóa vê các tầng phần mêm Android.
Hình 1 – Cấu trúc Android
Tầng kernel Linux
Nhân của Android được phát triển dựa vào Kernel Linux 2.6. Theo đó, nó cung
cấp các trình điêu khiển các thiết bi phần cứng (driver), quản lý tiến trình, quản
lý tài nguyên, bảo mật … như sau:
Security system
Memory management
Process mamagement
Network stack
Driver model
Tầng Libraries và Android runtime
Libraries (thư viên).
Android bao gồm môt bô thư viên C/C++, được sử dụng bởi các thành phần
khác nhau của hê thống Android. Những khả năng tiếp xúc với các nhà phát triển
11
Page 12
thông qua các khuôn khô ứng dụng Android. Dưới đây là môt số các thư viên lõi
của Android:
System C library - môt BSD-có nguồn gốc thực hiên các hê thống thư viên chuẩn
C (LIBC), điêu chỉnh cho nhúng dựa trên Linux các thiết bi.
Media Libraries - dựa trên OpenCORE PacketVideo's; sự hỗ trợ các thư viên
phát lai và ghi âm của âm thanh và phô biến nhiêu đinh dang video, cũng như các
tập tin hình ảnh tĩnh, bao gồm MPEG4, H.264, MP3, AAC, AMR, JPG, và PNG.
Surface Manager - quản lý quyên truy cập vào hê thống con hiển thi và hoàn toàn
phù hợp chất 2D và 3D lớp từ nhiêu ứng dụng đồ họa.
LibWebCore - môt trình duyêt web hiên đai, đông cơ có quyên han cả hai trình
duyêt web của Android và môt xem nhúng.
SGL - các công cụ đồ họa 2D.
OpenGLJES – Thư viên đồ họa 2D và 3D
3D libraries - môt viêc thực hiên dựa trên OpenGL ES 1,0 API; các thư viên,
hoặc sử dụng phần cứng tăng tốc 3D (nếu có) hoặc bao gồm, cao tối ưu rasterizer
phần mêm 3D.
SQLite - môt manh mẽ và nhẹ quan hê cơ sở dữ liêu có sẵn cho tất cả các ứng
dụng.
Android Runtime (Thời gian chay Android).
Android bao gồm môt tập các thư viên lõi mà cung cấp hầu hết các chức năng
sẵn có trong thư viên cốt lõi của ngôn ngữ lập trình Java.
Mỗi ứng dụng Android chay trong tiến trình riêng của mình, với trường hợp
riêng của các máy ảo Dalvik. Dalvik đã được viết nên môt thiết bi có thể chay
nhiêu máy ảo hiêu quả. VM Dalvik thực hiên tác phẩm trong các Executable
Dalvik (dex). Đinh dang được tối ưu hóa cho bô nhớ tối thiểu. VM là đăng ký
trên, và chay các lớp học biên soan bởi môt trình biên dich ngôn ngữ Java đã
được chuyển thành các đinh dang dex. Do dx "bao gồm" công cụ. VM Dalvik
dựa vào hat nhân Linux cho các chức năng tiêm ẩn như luồng và cấp quản lý bô
nhớ thấp.
Tầng Application Framework
12
Page 13
Bằng cách cung cấp môt nên tảng phát triển mở, Android cung cấp cho các nhà
phát triển khả năng để xây dựng các ứng dụng vô cùng phong phú và sáng tao.
Các nhà phát triển được miễn phí để tận dụng lợi thế của các thiết bi phần cứng,
thông tin đia điểm truy cập, dich vụ chay nên, thiết lập hê thống báo đông, thêm
các thông báo đến các thanh trang thái, và nhiêu, nhiêu hơn nữa.
Các nhà phát triển có thể truy cập vào các API cùng môt khuôn khô được sử
dụng bởi các ứng dụng lõi. Kiến trúc ứng dụng được thiết kế để đơn giản hóa
viêc tái sử dụng các thành phần. Cơ chế này cũng cho phép các thành phần được
thay thế bởi người sử dụng.
Nằm bên dưới tất cả các ứng dụng là môt tập hợp các dich vụ và hê thống, bao
gồm:
Môt tập phong phú và mở rông của xem có thể được sử dụng để xây dựng môt
ứng dụng, bao gồm các danh sách, lưới, hôp văn bản, các nút, và thậm chí môt
trình duyêt web nhúng.
Nhà cung cấp nôi dung cho phép các ứng dụng để truy cập dữ liêu từ các ứng
dụng khác (như Contacts), hoặc chia sẻ dữ liêu của riêng mình.
Môt quản lý tài nguyên, cung cấp quyên truy cập vào tài nguyên phi mã như dây
bản đia hoá, đồ họa, và bố trí tập tin.
Môt Notification Manager cho phép tất cả các ứng dụng tùy chỉnh để hiển thi
cảnh báo trong thanh trang thái.
Môt Activity Manager quản lý vòng đời của các ứng dụng và cung cấp môt
backstack phô biến chuyển hướng.
Tầng ứng dụng.
Android sẽ ship với môt bô các ứng dụng lõi bao gồm môt ứng dụng email, lich
chương trình tin nhắn SMS,, bản đồ, trình duyêt, liên lac, và những người khác.
Tất cả các ứng dụng được viết bằng cách sử dụng ngôn ngữ lập trình Java.
1.2.3 Các công cụ để tao môt ứng dụng Android
Để bắt đầu phát triển các ứng dụng Android, chúng ta cần có Bô công cụ phát
triển phần mêm Android (SDK) và môi trường phát triên tích hợp Eclipse
(Eclipse IDE). Viêc phát triển Android có thể diễn ra trên Microsoft Window,
13
Page 14
Mac OS X hoặc Linux. Trong tiểu luận này, em thực hiên sẽ phát triển ứng dụng
Android bằng Microsoft Window.
Eclipse IDE:
Các ứng dụng Android được viết bằng ngôn ngữ Java, nhưng biên dich và thi
hành bằng máy ảo Dalvik.Viết mã bằng ngôn ngữ Java trong Eclipse là rất trực
quan. Eclipse cung cấp môt môi trường Java phong phú, gồm cả viêc trợ giúp
theo ngữ cảnh và các mách nước gợi ý vê mã. Khi bô mã Java được biên dich
thành công, Android Developer Tools sẽ đảm bảo rằng ứng dụng đó được đóng
gói môt cách đúng đắn, gồm cả tập tin AndroidManifest.xml.
Android SDK:
Bô công cụ phát triển ứng dụng Android SDK là công cụ giả lập thiết bi ảo trên
máy tính để phát triển ứng dụng với các hàm API hỗ trợ cho những lập trình viên
lập trình trên các thiết bi di đông sử dụng nên tảng Android thông qua ngôn ngữ
lập trình Java. SDK gồm có:
android.jar : tập tin lưu trữ Java chứa toàn bô các lớp SDK Android cần thiết để
xây dựng ứng dụng.
documention.html và thư mục docs: tài liêu SDK được cung cấp tai chỗ và trên
web, chủ yếu nó ở dang JavaDocs, tao điêu kiên dễ dàng cho viêc hướng dẫn
trong nhiêu gói SDK. Tài liêu cũng gồm cả hướng dẫn phát triển mức cao và các
liên kết đến công đồng Android rông rãi.
Thư mục sample (các ví dụ mẫu): thư mục con samples chứa bô mã nguồn đầy
đủ dùng cho môt loat các ứng dụng, gồm cả ApiDemo, nó sử dụng nhiêuAPI.
Ứng dụng mẫu là môt nơi khám phá tuyêt vời khi bắt đầu phát triển ứng dụng
Android.
Thư mục tools (các công cụ): chứa toàn bô các công cụ dòng lênh để xây dựng
nên các ứng dụng Android. Công cụ được dùng phô biến và hữu ích nhất là tiên
ích adb (Android Debug Bridge).
Usb_driver: thư mục chứa các trình điêu khiển cần thiết để kết nối môi trường
phát triển với môt thiết bi có khả năng chay Android, chẳng han như G1 hay điên
14
Page 15
thoai đã được phát triển Android Dev 1. Các tập tin này là đòi hỏi duy nhất đối
với các nhà phát triển đang sử dụng nên Windows.
1.2.4 Xây dựng các thành phần ứng dụng Android
1.2.4.1 Hoat đông(Activity)
Mỗi môt Activity đai diên cho môt màn hình. Các ứng dụng phức tap có thể có
nhiêu hơn môt Activity. Cần tao môt Activity cho mỗi màn hình cần hiển thi. Cụ
thể là ít nhất môt màn hình chính điêu khiển các chức năng của ứng dụng, các
activity khác nhằm mục đích nhập thông tin, cung cấp các khung nhìn khác nhau
trên dữ liêu hoặc hỗ trợ các chức năng khác.
Hầu hết các Activity được thiết kế để chiếm giữ toàn bô màn hình, tuy nhiên có
thể tao các Activity có môt nữa đô trong suốt, các Activity nôi, hoặc các dialog.
Tao môt Activity:
Để tao môt Activity mới, cần thừa kế từ lớp Activity, sử dụng các View để cung
cấp các tương tác với người dùng, khai báo các thành phần giao diên và thực thi
các chức năng của ứng dụng.
package com.paad.myapplication;
import android.app.Activity;
import android.os.Bundle;
public class MyActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
}
}
Môt lớp Activity cơ bản đưa ra môt màn hình rỗng chứa cửa sô hiển thi. Vì vậy
viêc cần thực hiên đầu tiên là khai báo bố cục cho nó bằng cách sử dụng các
View và layout.Activity UI được tao thành bởi các View. View là các điêu khiển
giao diên người dùng, hiển thi dữ liêu và cung cấp tương tác đến người dùng.
15
Page 16
Để gắn môt giao diên cho môt Activity, sử dụng phương thức setContentView
trong lớp Activity được kế thừa.
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
MyView myView = new MyView(this);
setContentView(myView);
}
Có 2 cách để thiết lập giao diên cho Activity: bằng code hoặc thông qua file đinh
nghĩa layout . Ở trên là cách tao giao diên bằng code, sau đây là cách tao giao
diên người thông qua layout, truyên tham số vào cho phương thức
setContentView là môt resource ID
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);
}
Để dùng môt Activity cần khai báo bên trong file manifest. Thêm vào môt thẻ
activity mới bên trong nút application. Thẻ activity này bao gồm các thuôc tính
cho siêu dữ liêu (label, icon,…).
Vòng đời của Activity:
16
Page 17
Hình 2 – Vòng đời của Activity
Khởi đông môt Activity
Để khởi đông môt Activity, chúng ta dùng Intent:
Khai báo tường minh: cung cấp chính xác thông tin của activity cần gọi (nếu
cùng ứng dụng chỉ cần cung cấp tên class, nếu ứng dụng khác nhau thì cung cấp
tên package, tên class).
Intent intent = new Intent(getApplicationContext(),TargetActivity.class);
startActivity(intent);
Khai báo không tường minh: cung cấp thao tác cần làm gì, với loai dữ liêu nào,
thao tác thuôc nhóm nào… hê thống sẽ tìm activity tương ứng để khởi đông.
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivity(intent);
17
Page 18
Với cách khởi đông activity không tường minh, chúng ta cần phải biết môt chút
vê Intent-filter. Intent-filter sẽ giúp môt activity đăng ký với hê thống mình có
thể làm được thao tác gì, trong nhóm nào, với loai dữ liêu nào. Như vậy khi
intent và intent-filter khớp nhau, activity sẽ được hê thống khởi đông.
Liên lac giữa 2 activity:
Có thể khởi đông môt activity với môt yêu cầu nào đó và activity kia khi làm
xong công viêc sẽ trả lai kết quả cho activity trước. Ví dụ activity A yêu cầu môt
activity làm giúp viêc chụp ảnh, activity B đáp ứng được viêc này, sau khi user
chụp ảnh xong sẽ trả lai file ảnh cho activity A. Để liên lac 2 activity chúng ta
làm nhu sau:
Khi khởi đông môt activity, ta có thể gửi kèm dữ liêu trong intent như ví dụ sau:
intent.putExtra("value1", new String("Hello"));
intent.putExtra(“value2", new Long(100));
Bên phía activity được khởi đông, có thể lấy dữ liêu được gửi như sau:
getIntent().getExtras().getString("value1");
getIntent().getExtras().getLong("value2");
Trình thu phát (BroadcastReceiver)
BroadcastReceiver là môt trong bốn loai thành phần trong ứng dụng
Android.Chức năng của nó là dùng để nhận các sự kiên mà các ứng dụng hoặc hê
thống phát đi.
Có 2 cách phát-nhận đó là:
Không có thứ tự: receiver nào đủ điêu kiên thì nhận hết, không phân biêt và
chúng tách rời nhau.
Có thứ tự: receiver nào đăng ký ưu tiên hơn thì nhận trước, và có thể truyên thêm
thông tin xử lý cho các receiver sau.
Chu kỳ sống
BroadcastReceiver chỉ có duy nhất môt phương thức onReceive().
Khi có sự kiên mà BroadcastReceiver đã đăng ký nhận được phát đi, thì phương
thức onReceive() của BroadcastReceiver đó sẽ được gọi.
18
Page 19
Sau khi thực thi xong phương thức này, vòng đời của BroadcastReceiver kết
thúc.
Môt số broadcast thông dụng
Báo hê thống khởi đông xong.
Báo pin có sự thay đôi.
Báo có package mới cài vào hoặc xóa đi.
Báo tắt máy.
Báo cắm sac, rút sac.
Thông báo tin nhắn tới.
Thông báo cắm, rút thẻ nhớ.
Thông báo có cuôc gọi đi.
Broadcast do người phát triển ứng dụng tự đinh nghĩa (giúp liên lac hoặc thông
báo môt sự kiên giữa các ứng dụng).
Hàm onReceive()
Phương thức này được gọi khi có sự kiên tương ứng được phát đi.Ở trong
phương thức này, ta truyên vào context (ngữ cảnh) và intent (nơi nhận).
context: vì lớp Receiver không kế thừa từ lớp Context nên cần truyên context mà
receiver này đang chay vào. Thứ nhất là để có thể xử lý các phương thức yêu cầu
truyên thêm Context, thứ hai là để sử dụng các phương thức của lớp Context.
intent: intent được truyên vào sẽ có đầy đủ thông tin như sự kiên nào mà receiver
này đăng ký đã xảy ra dẫn đến onReceive() được gọi,có gửi kèm thông tin gì
hoặc dữ liêu gì hay không. Xem các api:
Intent.getAction();
Intent.get…Extra(String dataName);
Dich vụ (Service)
Service là môt trong 4 loai thành phần của môt ứng dụng Android. Service chay
nên và không tương tác trực tiếp với người dùng. Sử dụng Service để:
Dùng trong các ứng dụng nghe nhac.
19
Page 20
Dùng để xử lý các thao tác mất thời gian và không nhất thiết phải hiển thi lên
activity (download, upload…).
Đôi khi cần môt ứng dụng vận hành liên tục để xử lý những viêc mong muốn mà
không làm phiên người dùng.
Làm những thao tác tính toán, xử lý đêu đặn nào đó và kết quả khi nào người
dùng cần thì mới xem.
Tao ra môt Service
Để tao ra môt Service, ta tao ra môt class mới kế thừa lớp Service và override các
phương thức onStart(),onCreate() và onBind().
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
public class MyService extends Service {
@Override
public void onStart(Intent intent, int startId) {
// TODO: Actions to perform when service is started.
}
@Override
public void onCreate() {
// TODO: Actions to perform when service is created.
}
@Override
public IBinder onBind(Intent intent) {
// TODO: Replace with service binding implementation.
return null;
}
}
20
Page 21
Để bắt đầu môt Service, sử dụng phương thức startService.Nếu Service
yêu cầu quyên truy cập không tồn tai trong ứng dụng thì môt ngoai lê
SecurityException sẽ được đưa ra. Có 2 cách để bắt đầu môt Service mới.
Cách 1: khởi đông ngầm. Ví dụ:
startService(new Intent(MyService.MY_ACTION));
Cách 2: khởi đông tường minh. Ví dụ:
startService(new Intent(this, MyService.class));
Để dừng môt Serivce, sử dùng phương thức stopService, truyên vào Intent
xác đinh Service cần ngưng hoat đông. Ví dụ:
ComponentName service = startService(new Intent(this, BaseballWatch.class));
// ngừng dich vụ bằng cách xác đinh tên dich vụ
stopService(new Intent(this, service.getClass()));
// ngừng dich vụ bằng cách tường minh
try {
Class serviceClass = Class.forName(service.getClassName());
stopService(new Intent(this, serviceClass));
} catch (ClassNotFoundException e) {}
Vòng đời của Services
21
Page 22
Hình 3 – Vòng đời của service
Khi có môt context nào đó gọi startService() để khởi đông môt dich vụ mong
muốn. Nếu dich vụ đó chưa được tao thì sẽ gọi onCreate() rồi gọi tiếp onStart()
và khi đó dich vụ chay nên bên dưới.
Nếu sau đó lai có môt context muốn khởi đôngdich vụ này mà dich vụ đã đang
chay thì chỉ có phương thức onStart() của dich vụ được gọi.
Dù dich vụ có được gọi khởi đông bao nhiêu lần thì cũng chỉ có thể hiên của dich
vụ và chỉ cần gọi stopService() môt lần để kết thúc dich vụ.
Kết nối dich vụ
Khi môt Activity được kết nối tới môt Service, nó duy trì môt tham chiếu
đến môt thực thể Service. Để kết nối đến thực thể này, thực thi phương thức
onBind như sau:
private final IBinder binder = new MyBinder();
@Override
public IBinder onBind(Intent intent) {
return binder;
}
public class MyBinder extends Binder {
22
onCreate()
onStart()
onDestroy()
Service đang chay
Service được start lần đầu
Service laiđượcyêucầu
start trongkhiđãchayr
ồi
Bên ngoài gọi stopService() hoặc service
tự stop
Page 23
MyService getService() {
return MyService.this;
}
}
Sự kết nối giữa Service và Acitvity được thể hiên qua môt ServiceConnection.
Điêu cần làm là thực thi môt ServiceConnection mới, override phương thức
onServiceConnected và onServiceDisconnected.
// tham chiếu đến dich vụ
private MyService serviceBinder;
// xử lý kết nồi giữa service và activity
private ServiceConnection mConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName className, IBinder
service) {
// được gọi khi liên kết được thực hiên
serviceBinder = ((MyService.MyBinder)service).getService();
}
public void onServiceDisconnected(ComponentName className) {
// nhận khi dich vụ ngắt kết nối môt cách bất ngờ
serviceBinder = null;
}
Để thực hiên viêc kết nối, gọi phương thức bindService:
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
// kết nối dich vụ
Intent bindIntent = new Intent(MyActivity.this, MyService.class);
bindService(bindIntent, mConnection, Context.BIND_AUTO_CREATE);
23
Page 24
}
Hoat đông của bindService(): kết nối dich vụ
Hình 4 – Hoạt động kết nối dịch vụ
Thông thường, vòng đời của dich vụ khi có client kết nối từ đầu như sau:
Cũng bắt đầu bằng onCreate() rồi đến onBind() và dich vụ chay dưới nên.
Khi không còn client kết nối tới thì dich vụ gọi onUnbind() rồi onDestroy().
Có môt số trường hợp không thông thường, ví dụ như:
Có môt context khởi đông môt dich vụ, sau đó có môt số client kết nối (bind) tới
service.
Có nhiêu client cùng lúc kết nối tới dich vụ.
Môt activity vừa gọi startService() vừa gọi bindService().
Trình cung cấp nôi dung (Content Providers)
24
onCreate()
onBind()
Service đangcha
y
Activity gọibindServi
ce() đểkếtnốitới
service
Bên ngoài gọi unbindService() hoặc kết nối
bi ngắt
onUnbind()
Service không còn kết nối với client nào nữa và cũng ko có context nào start service
nàyonDestroy()
Service còn chay, client
muốn kết nối với service
onRebind()
Lần trước
unBind() với client
này trả vê true
Page 25
Có thể coi trình cung cấp nôi dung như là môt máy chủ cơ sở dữ liêu. Công viêc
của nó là quản lý truy cập và chia sẻ dữ liêu đang tồn tai, chẳng han như môt cơ
sở dữ liêu SQLite.Nó có thể được cấu hình để cho phép các ứng dụng khác truy
xuất và ngược lai.Nếu ứng dụng rất đơn giản thì không nhất thiết phải tao ra môt
trình cung cấp nôi dung.
Content Provider giúp tách biêt tầng ứng dụng ra khỏi tầng dữ liêu. Nó có đầy đủ
các quyên điêu khiển và được truy xuất thông qua mô hình URI đơn giảnnhư là
có thể thêm, xóa, cập nhật dữ liêu của các ứng dụng.
Tao môt Content Provider mới
Tao Content Provider:
Để tao môt Content Provider cần thừa kế lai từ lớp trừu tượng ContentProvide,
override lai phương thức onCreate.
import android.content.*;
import android.database.Cursor;
import android.net.Uri;
import android.database.SQLException;
public class MyProvider extends ContentProvider {
@Override
public boolean onCreate() {
// TODO: Construct the underlying database.
return true;
}
}
Nên cung cấp môt biến static CONTENT_URI trả vê môt URI của provider này.
Content URI phải là duy nhất giữa các provider, vì thế nên dựa vào tên package
để xác đinh URI, hình thức chung cho viêc đinh nghĩa môt Content Provider URI
là:
content://com.<CompanyName>.provider.<ApplicationName>/<DataPath>
25
Page 26
Các đơn giản nhất để làm viêc này là sử dụng URIMatcher. Cấu hình
UriMatcher để phân tích hình thức của nó khi provider đang được truy xuất đến
thông qua môt Content Resolver.
Đưa ra truy xuất Data Source:
Có thể cung cấp các truy vấn và thực thi với Content Provdier bằng cách thực
hiên các phương thức delete, insert, update và query.Các phương thức này hoat
đông như các giao tiếp chung đến nguồn dữ liêu bên dưới, chúng cho phép các
ứng Android chia sẽ dữ liêu với nhau mà không phải tao môt giao tiếp riêng cho
mỗi ứng dụng.
Bước cuối cùng trong quá trình tao môt Content Provider là đinh nghĩa kiểu
MIME làkiểu dữ liêu mà Provider trả vê, override phương thức getType để trả vê
môt kiểu String mô tả cho kiểu dữ liêu. Kiểu trả vê bao gồm cả 2 hình thức:
trường đơn và tất cả dữ liêu.
Trường đơn
vnd.<companyname>.cursor.item/s<contenttype>
Tất cả
vnd.<companyName>.cursor.dir/<contenttype>
Đăng ký Provider:
Thêm Content Provider vừa tao vào trong manifest.xml. Sử dụng thẻ authorities
để chỉ đinh đia chỉ của nó:
<provider android:name=”MyProvider”
android:authorities=”com.paad.provider.myapp”/>
Truy vấn, thêm, cập nhật và xóa nôi dung trong Content Provide
26
Page 27
Content Provider được truy xuất thông qua lớp Content Resolver.Mỗi môt
Context của ứng dụng có môt đối tượng ContentResolver, có thể được truy xuất
thông qua phương thức getContentResolver.
ContentResolver cr = getContentResolver();
Content Resolver bao gồm môt vài phương thức để thực thi và truy vấn đến
Content Providers. Môt URI dùng để chỉ đinh Content Provider nào được cung
cấp bởi các quyên được đinh nghĩa trong manifest của ứng dụng. URI là môt
chuỗi tùy ý, vì thế hầu hết các provider đêu đưa ra thuôc tính
CONTENT_URI.Content Provider thường đưa ra 2 hình thức URI, môt là đựa tất
cả các dữ liêu được yêu cầu trên cùng môt dòng đơn lẻ, hoặc là thêm vào
/<rowID> vào phía sau CONTENT_URI.
Truy vấn:
Viêc truy vấn trên Content Provider có hình thức tương tự như khi truy vấn trong
database, dùng phương thức query của đối tượng ContentResolver với các tham
số truyên vào gồm:
Môt URI của Content Provider muốn truy vấn.
Môt ánh xa đai diên cho các côt muốn chứa trong tập kết quả.
Môt mênh đê where chỉ đinh các dòng nào được trả vê. Có thể đưa vào ký tự đai
diên và sẽ được thay thế bởi các giá tri được lưu bên trong các tham số được
chọn.
Môt mảng các đối số kiểu String thay thế cho các ký tự đai diên ? trong mênh đê
where
Môt chuỗi mô tả thứ tự các dòng trả vê.
Thêm:
Content Resolver cung cấp 2 phương thức để chèn môt record mới vào trong
Content Provider, đó là insert và bulkInsert. Phương thức insert trả vê môt URI
27
Page 28
đến record mới được thêm vào, trong khi bulkInsert trả vê số thành phần thêm
vào thành công.
Xóa:
Để xóa môt record khi sử dụng Content Resolver, sử dụng phương thức delete,
truyên vào URI cho dòng muốn xóa. Đồng thời, cũng có thể dùng mênh đê điêu
kiên where để xóa nhiêu dòng.
Cập nhật:
Viêc cập nhật cho môt Content Provider được điêu khiển bởi phương thức update
cùa Content Resolver. Phương thức update nhận URI của Content Provider đích,
môt đối tượng ContentValues chứa tập giá tri được ánh xa đến các côt cần cập
nhật, và môt mênh đê where để chỉ đinh dòng nào được cập nhật.
Khi thực thi, mỗi dòng phù hợp với điêu kiên trong mênh đê where sẽ được cập
nhật và trả vê số dòng được cập nhật giá tri thành công.
Native Android Content Provider
Android đưa ra nhiêu Content Provider hỗ trợ truy xuất đến các ứng dụng
native.Có thể dùng môt trong các Content Provider native này để sử dụng các kỹ
thuật được mô tả ở trên. Như môt sự thay thế, gói android.provider chứa các lớp
thuận tiên để truy xuất môt cách đơn giản đến nhiểu provider bao gồm:
Browser: Dùng browser Content Provider để đọc và điêu chỉnh bookmarks,
browser history, hoặc web searches.
CallLog: Hiển thi hoặc cập nhật các cuôc gọi (cuôc gọi đến, cuôc gọi đi, các cuôc
gọi nhỡ, và chi tiết cuôc gọi.
Contacts: dùng để rút trích, chình sữa, hoặc lưu trữ chi tiết danh ba.
MediaStore: cung cấp sự kiểm soát, quản lý truy xuất đa phương tiên trên thiết
bi (audio, video, và hình ảnh).
Settings: Truy xuất đến các thiết lập cài đặc của thiết bi, Settings cho phép hiển
thi và điêu chỉnh các thiết lập Bluetooth, ring tone và nhiêu cài đặt khác.
28
Page 29
Nên sử dụng các Content Providers native này bất cứ khi nào có thể, bởi vì khi sử
dụng chúng sẽ bảo đảm cho ứng dụng được kết hợp với các ứng dụng native hoặc
third-party khác môt cách liên tục.
Xây dựng các thành phần giao diên ứng dụng Android
1.2.5.1 Môt số lớp hỗ trợ thiết kế giao diên cho ứng dụng Android
Android cung cấp môt số công cụ thiết kế giao diên:
Views: là lớp UI cơ bản cho các control giao diên. Tất cả các control giao diên
người dùng, các lớp layout đêu được dẫn xuất từ lớp Views.
ViewGroups: được mở rông từ lớp View và có thể chứa nhiêu Views.
ViewGroups cũng được kế thừa để cung cấp các lớp quản lý bố cục như
LinearLayout. ViewGroup được dùng để xây dựng nên các component có thể
dùng lai (widget) hoặc để quản lý bố cục cho các control.
Activity: dùng để hiển thi giao diên người dùng. Lớp này do người phát triển ứng
dụng viết.
Hình 5 - Quan hệ giữa các thành phần trên
1.2.5.2 Android Widget Toolbox
Android cung cấp môt bô công cụ các View chuẩn để tao các giao diên người
dùng đơn giản,giúp đơn giản hóa viêc phát triển và tao sự đồng nhất giữa các ứng
dụng.
29
Page 30
Các control thông dụng:
TextView: là môt label chỉ có tác dụng hiển thi văn bản, nó hỗ trợ hiển thi nhiêu
dòng, đinh dang chuỗi.
EditText: là môt vùng nhập văn bản có thể chỉnh sửa, hỗ trợ nhập nhiêu dòng.
ListView: tao và quản lý môt nhóm các View để hiển thi môt danh sách các phần
tử. Môt ListView chuẩn dùng để hiển thi chuỗi giá tri của môt mảng các
TextView.
Spinner: là môt control kết hợp, hiển thi môt TextView và môt ListView kết hợp
dùng để chọn môt item từ danh sách. Nó được tao thành từ môt TextView chứa
giá tri hiên tai đang được chọn kết hợp với môt nút mà khi nhấn vào sẽ đưa ra
môt danh sách lựa chọn.
Button
CheckBox
RadioButton
Andoid cũng hỗ trợ nhiêu View cao cấp hơn như: date-time picker, auto-
complete input box, map, gallery, và tab sheet.
1.2.5.3 Các kiểu Layout
LayoutManager (thường gọi là layout) là mở rông của lớp ViewGroup, được
thiết kế để điêu chỉnh vi trí của các control trên màn hình ứng dụng. Layout có
thể lồng nhau để tao nên các giao diên phức tap.Android có môt số các layout
đơn giản giúp xây dựng UI. Để tao nên môt bố cục hợp lý thì nên kết hợp các
layout với nhau.
Các lớp layout cơ bản:
FrameLayout: là layout đơn giản nhất trong Layout Manager, FrameLayout đặt
mỗi View con vào góc trái trên của màn hình. Viêc thêm nhiêu control sẽ chồng
môt cái mới lên trên cái trước đó.
LinearLayout: thêm mỗi View theo môt đường thẳng, theo chiêu dọc hoặc ngang.
Môt layout theo chiêu dọc sẽ có môt control trên môt dòng, layout theo chiêu
ngang chỉ có môt dòng cho nhiêu View. Nó cho phép chỉ đinh giá tri “weight”
cho mỗi View con để điêu chỉnh kích thước bên trong không gian cho phép.
30
Page 31
RelativeLayout: dùng để đinh vi trí cho các View cân xứng với các control khác
cũng như với đường biên của màn hình.
TableLayout: giúp bố trí các View theo môt lưới có các dòng và các côt. Các côt
có thể được thiết lập để co lai hoặc giản ra
AbsoluteLayout: trong layout này, vi trí mỗi View sẽ là tọa đô tuyêt đối, đảm bảo
bố cục chính xác cho các thành phần. Do đó, không thể có được sự linh hoat đối
với các màn hình có kích thước khác nhau.
Để sử dụng layout người ta thường dùng phương pháp là sử dụng resource bên
ngoài từ file XML. Môt layout XML phải chứa môt nút gốc.Nút gốc này có thể
chứa các layout và các View lồng nhau để xây dựng nên các giao diên phức tap.
Hình 6 - Hệ thống các view với các thông số layout được kết nối với mỗi View
1.2.5.4 Tao các View
Chỉnh sửa các View có sẵn
Chỉnh sửa hoặc kế thừa môt control sẳn có nếu nó cung cấp các chức năng cần
thiết, bằng cách ghi đè các handler và onDraw của nó. Để đinh nghĩa lai giao
diên cũng như các ứng xử của control mới tao, cần phải ghi đè và thừa kế các
điêu khiển sự kiên (event handler) kết hợp với các hành vi muốn thay đôi.
31
Page 32
Tao các điêu khiển ghép (compound control)
Compound control là các widget có thể tái sử dụng, nó chứa nhiêu control được
bố trí và có liên hê với nhau, nó được tao từ nhiêu control cơ bản.Ví dụ như tao
nên môt dropdown combo box bằng cách kết hợp môt TextView và môt Button
mà khi được nhấn sẽ hiển thi môt ListView.
Khi tao môt compound control cần đinh nghĩa layout, hình thức và cách thức tác
đông lẫn nhau giữa các View mà nó chứa. Compound control được tao thành từ
viêc dẫn xuất từ lớp ViewGroup.
Để tao môt compound control mới, chọn môt lớp layout phù hợp nhất để xác
đinh vi trí cho các control, và dẫn xuất từ nó:
public class MyCompoundView extends LinearLayout {
public MyCompoundView(Context context) {
super(context);
}
public MyCompoundView(Context context, AttributeSet attrs) {
super(context, attrs);
}
}
Cách được ưa chuông hơn để thiết kế giao diên cho môt compound control là sử
dụng layout resource.
Để dùng được layout này cho widget mới cần phải đinh nghĩa lai contructor của
nó sử dụng phương thức inflate từ dich vụ LayoutInflate. Phương thức inflate
nhận tham số là layout resource và trả vê môt View.
Môt khi đã xây dựng được giao diên cho control, điêu tiếp theo là đinh nghĩa
điêu khiển sự kiên cho mỗi control con trong nó.
Tao các Control tùy chỉnh
32
Page 33
Người phát triển có thể tao ra các control theo ý của mình để tao được môt giao
diên mang tính duy nhất phù hợp với yêu cầu của người dùng. Các control mới
cần phải được thừa kế từ lớp View hoặc SurfaceView.
Lớp View cung cấp môt đối tượng Canvas và môt số phương thức vẽ cũng như
các lớp Paint, để tao môt giao diên trực quan.Người thiết kế có thể đinh nghĩa lai
các sự kiên người dùng như cảm ứng trên màn hình, nhấn phím để tao nên sự
tương tác.Trong những trường hợp mà không đòi hỏi viêc vẽ lai cũng như đồ họa
3D thì lớp cơ sở View có giải pháp hiêu quả.
Trong khi đó, lớp SurfaceView cung cấp môt đối tượng canvas hỗ trợ viêc vẽ từ
môt luồng xử lý nên và sử dụng openGL cho đồ họa 3D. Đây là môt lựa chọn
tuyêt với cho các điêu khiển đòi hỏi đồ họa cao, cần phải cập nhật liên tục hoặc
hiển thi các đồ họa phức tap, như game 3D.
1.2.5.5 Tao giao diên Activity với các View
Môt Activity khi chưa thiết kế sẽ khởi đông với môt màn hình rỗng.Để thiết lập
giao diên cho màn hình rỗng này cần gọi phường thức setContentView khi
everride lai phương thức onCreate.Phương thức setContentView có thể nhận môt
tham số là resource ID hoặc môt thể hiên của View.Do đó, có thể đinh nghĩa giao
diên ứng dụng bằng code hoặc tham chiếu đến resource (layout).
Nếu dùng layout resource thì sẽ tách riêng viêc thiết kế giao diên và phần code
xử lý, cung cấp môt khả năng thay đôi linh hoat giao diên mà không thay đôi
code bên trong.
1.2.5.6 Xây dựng menu
Menu trong Android
Menu đưa ra môt giải pháp để tăng tính tiên dụng của ứng dụng mà không chiếm
dụng không gian trên màn hình. Mỗi môt Activity có riêng cho nó môt menu,
được hiển thi khi người dùng nhấn nút Menu.
Android cũng hỗ trợ menu ngữ cảnh, nó được gán vào bất kỳ View nào bên trong
môt Activity.Môt menu ngữ cảnh được hiển thi khi người dùng nhấn nút D-pad,
33
Page 34
trackball, hoặc nhấn vào màn hình cảm ứng khoảng 3 giây.menu ngữ cảnh hỗ trợ
submenu, checkbox, radio button, shortcut key, và icon.
Các loai menu trong android:
Icon Menu: được kết với menu, xuất hiên ở phần dưới của màn hình thiết bi khi
nút Menu được nhấn. Nó hiển thi icon và text cho các menu item hoặc các
submenu. Icon menu hỗ trợ tao tối đa 6 menu item, và các menu item này không
thể hiển thi checkbox, radio button, hay shortcut key.
Hình 7 – Icon menu
Expanded Menu: hiển thi khi người dùng chọn More trong menu icon. Expand
Menu hiển thi môt danh sách có thể cuôn được các menu item, và các menu item
này không thể chứa các icon mà chỉ có thể chứa text, shortcut key và checkbox/
radio button.
Hình 8 – Expanded menu
Submenu: mỗi submenu hiển thi bằng môt cửa sô, tên của submenu được hiển thi
ở thanh header và mỗi Menu item được hiển thi với đầy đủ text, checkbox,
34
Page 35
shortcut key và không thể hiển thi icon cho các item. Android không hỗ trợ các
submenu lồng nhau, vì không thể thêm môt submenu vào môt submenu.
Hình 9 - Submenu
Các kiểu Menu Item
Android hỗ trợ hầu hết các kiểu menu item truyên thống, bao gồm icon, shortcut,
checkbox, radio button:
Checkbox và Radio button group: Để thiết lập môt menu item là checkbox sử
dụng phương thức setCheckable, để thiết lập trang thái của checkbox
dùngsetChecked.
Môt radio button group là môt nhóm các radio button và chỉ có môt trong số
chúng được chọn tai môt thời điểm. Để tao môt radio button group, gán cùng ID
nhóm cho mỗi item, sau đó gọi phương thức Menu.setGroupCheckable, truyên
vào ID nhóm, và thiết lập giá tri cho các tham số khác là True.
// tao checkbox.
menu.add(0,CHECKBOX_ITEM,Menu.NONE,
“CheckBox”).setCheckable(true);
// tao radio button group.
menu.add(RB_GROUP, RADIOBUTTON_1, Menu.NONE, “Radiobutton 1”);
menu.add(RB_GROUP, RADIOBUTTON_2, Menu.NONE, “Radiobutton 2”);
menu.add(RB_GROUP, RADIOBUTTON_3, Menu.NONE,
“Radiobutton 3”).setChecked(true);
35
Page 36
menu.setGroupCheckable(RB_GROUP, true, true);
Shorcut Key: để chỉ đinh môt keypad shortcut cho môt Menu Item sử dụng
phương thức setShortcut. Phương thức này yêu cầu truyên vào 2 tham số, môt là
phím số và môt là bàn phím đầy đủ.
menuItem.setShortcut(‘0’, ‘b’);
Condensed Title: dùng môt text để hiển thi menu.
menuItem.setTitleCondensed(“Short Title”);
Icon: biểu tượng chỉ được hiển thi trên Icon Menu
menuItem.setIcon(R.drawable.menu_item_icon).
Menu Item Click Listener: khi môt menu được chọn sẽ có môt xử lý điêu khiển.
Đó là phương thức onOptionsItemSelected.
menuItem.setOnMenuItemClickListener(new OnMenuItemClickListener() {
public boolean onMenuItemClick(MenuItem _menuItem) {
[ ...thực hiên xử lý ... ]
return true;
}
});
Intent: Khi môt menu item được chọn, Android sẽ thực thi startActivity với môt
đối tượng Intent.
menuItem.setIntent(new Intent(this, MyOtherActivity.class));
Tao môt Menu:
Để tao môt menu, trong Activity override phương thức onCreateOptionsMenu,
phương thức này được thực thiên ở lần đầu tiên khi menu được hiển thi.
onCreateOptionsMenunhận môt tham số kiểu Menu. Dùng phương thức add trên
đối tượng Menu này để thêm vào các item. Mỗi menu item cần phải chỉ đinh các
thuôc tính sau:
Nhóm mà item đó được thêm vào.
36
Page 37
Mỗi item có môt ID duy nhất, bởi vì chúng được xử lý chung trong phương thức
onOptionsItemSelected nên viêc xác đinh item nào được chọn là phụ thuôc vào
ID được chỉ đinh cho nó.
Cách sắp xếp thứ tự mà item được hiển thi.
Text thể hiên của item, có thể là môt chuỗi các ký tự hoặc môt string resource.
1.2.6 Xử lý bất đồng bô
1.2.6.1 Thread
Thông thường lập trình viên dùng Thread để xử lý các code xử lý nặng, hoặc mất
thời gian có thể gây chậm chương trình hoặc giao diên bi block.Thread khá thông
dụng và trong Android dùng lớp Thread của Java.
Theo mặc đinh, mỗi ứng dụng chay trong môttiến trình và code được thực thi
trong thread chính của tiến trình đó.Nếu code xử lý quá lâu, không kip phản hồi
lai các sự kiên người dùng trong 5 giây thì sẽ xuất hiên dialog “Application is not
responding” và người dùng có thể đóng ứng dụng ngay lập tức. Nếu không bi
đóng thì ứng dụng sẽ bi lag, điêu này là khó chấp nhận.
Thread thread = new Thread() {
@Override
public synchronized void start() {
// Khởi tao các đối tượng cần thiết tai đây
super.start();
}
@Override
public void run() {
// code xử lý chính của thread trong này
super.run();
}
};
thread.start(); //bắt đầu thread
37
Page 38
Lưu ý:
Thread lần đầu thực thi gọi phương thức start(), những lần sau chỉ gọi phương
thức run(), không gọi start() nữa.
Các code xử lý liên quan đến giao diên chỉ được xử lý trong thread chính của ứng
dụng (ví dụ load ảnh từ mang vê thì dùng thread, nhưng hiển thi ảnh lên
ImageView thì xử lý trong thread chính)
Sau khi thực thi xong phương thức run(), thread không còn hoat đông nữa.
1.2.6.2 Handler
Trong Android, để tiên viêc giao tiếp giữa 2 thread ta dùng đối tượng Handler.
Có thể dùng Handler như bô đếm giây khi chơi nhac, hoặc chức năng tương tự.
Ngoài ra, có thể dùng Handler để đặt xử lý môt yêu cầu nào đó sau môt khoảng
thời gian xác đinh.
Giao tiếp giữa 2 Thread:
Giả sử trong phương thức run() đã lấy xong đối tượng Bitmap vê. Muốn truyên
đối tượng Bitmap cho Thread chính hiển thi lên màn hình:
Message msg = mHandler.obtainMessage(1, bitmap);
mHandler.sendMessage(msg);
Trong code của Activity (mặc đinh là thread chính), ta khai báo môt đối tượng
Handler tương tứng như sau:
Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
if(msg.what == 1) {
//Hiển thi Bitmap
mImageView.setImageBitmap((Bitmap)msg.obj);
}
super.handleMessage(msg);
}
};
38
Page 39
Trong đoan code trên, đối tượng mHandler lấy ra môt message và gắn mã vào
cho message đó, kèm theo đối tượng bitmap. Sau đó gửi đi.
Message gửi đi sẽ được nhận phương thức callback là handleMessage() của đối
tượng Handler.
Handler còn có thể gửi message để xử lý sau môt khoảng thời gian đinh sẵn
sendMessageAtTime hoặc xử lý tai môt thời điểm đinh sẵn
sendMessageDelayed.
1.2.6.3 AlarmManager
Dùng AlarmManager để thực hiên đăng ký xử lý môt thao tác nào đó tai môt thời
điểm nhất đinh trong tương lai (thường là thời gian dài, nếu xử lý trong thời gian
ngắn thì khuyến cáo nên dùng Handler). Khi đến thời điểm được đặt trước, dù
ứng dụng đang không chay thì nó vẫn được gọi. Nếu tắt máy rồi bật lai thì không
còn.
Khởi tao môt AlarmManager:
AlarmManager am
=(AlarmManager)getSystemService(ALARM_SERVICE);
Intent broadcastIntent = new Intent("org.multiuni.android.ACTION...");
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0,
broadcastIntent, PendingIntent.FLAG_CANCEL_CURRENT);
am.set(AlarmManager.RTC_WAKEUP, triggerAtTime, pendingIntent);
1.2.6.4 Notification
Trong những trường hợp chúng ta muốn hiên môt thông báo vê môt sự kiên nào
đó (tin nhắn, cuôc gọi, email…) cho người dùng mà không muốn ảnh hưởng đến
công viêc của họ hoặc không chắc là họ có đang cầm điên thoai hay không, hoặc
ban muốn hiển thi thông tin môt viêc nào đó đang xảy ra trên điên thoai (đang
nghe nhac, đang trong cuôc gọi, thiếu thẻ nhớ…) và mong người dùng biết thì
chúng ta dùng Notification.
39
Page 40
Chúng ta có thể tao môt thông báo có nhiêu hình thức khác nhau như có âm báo,
rung, đèn led, icon…
Mỗi phương pháp thông báo có môt tham số id kiểu int và tùy chọn môt tham số
tag kiểu String, có thể là null, tao thành môt bô hai (tag, id) hoặc (null, id). Bô
hai này nhận diên thông báo từ ứng dụng, và phải là duy nhất trong ứng
dụng.Nếu gọi môt trong những phương thức thông báo với bô (tag, id) hiên đang
hoat đông và thiết lập các thông số mới thì nó sẽ được cập nhật.
Tao môt thông báo
Tao môt đối tượng Notification, truyên vào icon để hiển thi ở thanh trang thái và
thời gian hiển thi:
// chọn môt drawable để hiển thi như là môt icon của thanh trang thái
int icon = R.drawable.icon;
// Text để hiển thi lên thanh trang thái khi thông báo được chay
String tickerText = “Notification”;
// Thanh trang thái mở rông sắp xếp các thông báo theo thứ tự thời gian when =
System.currentTimeMillis();
Notification notification = new Notification(icon, tickerText, when);
Cấu hình giao diên của Notification trong cửa sô trang thái mở rông, sử dụng
phương thức setLatestEventInfo. Cửa sô trang thái mở rông này hiển thi icon và
thời gian được khai báo trong constructor và đồng thời hiển thi tiêu đê và chi tiết
vê chuỗi thông báo.
Context context = getApplicationContext();
// Text để hiển thi trên cửa sô trang thái mở rông
String expandedText = “Extended status text”;
// Tiêu đê của thanh trang thái mở rông
String expandedTitle = “Notification Title”;
// Intent chay môt activity khi text được click
Intent intent = new Intent(this, MyActivity.class);
40
Page 41
PendingIntent launchIntent = PendingIntent.getActivity(context, 0, intent, 0);
notification.setLatestEventInfo(context, expandedTitle, expandedText,
launchIntent);
Cải tiến thông báo bằng các thuôc tính khác của đối tượng Notification để làm
nháy đèn trên LED trên thiết bi, rung điên thoai hay trình diễn các file nhac.
Gọi môt thông báo
Để thực hiên gọi môt thông báo, gọi phương thức notify của
NotificationManager:
int notificationRef = 1;
notificationManager.notify(notificationRef, notification);
Để cập nhật môt thông báo đã được sử dụng, gọi lai và truyên lai giá tri reference
ID. Cũng có thể sử dụng ID này để hủy thông báo bằng cách gọi phương thức
cancel của NotificationManager.
notificationManager.cancel(notificationRef);
Viêc hủy thông báo sẽ xóa thanh icon trang thái và cửa sô trang thái mở rông.
41
Page 42
CHƯƠNG 2: XÂY DỰNG CHƯƠNG TRÌNH QUẢN LÝ CONTACTS –
DEMO
2.1 Phân tích thiết kế hê thống quản lý Contact
2.1.1 Đặc tả bài toán
Đối với mọi chiếc điên thoai di đông Contact là ứng dụng không thể thiếu, dùng
để quản lý danh ba điên thoai, thông tin của những cá nhân cần liên lac trong
danh ba.
Với mục đích demo cho các tìm hiểu lý thuyết, ứng dụng “quản lý contacts
Demo” được xây dựng có môt số chức năng như ứng dụng Contact trong những
chiếc điên thoai thông thường:
Hiên thi danh sách liên lac.
Tìm kiếm nhanh môt thông tin liên lac.
Thêm mới, sửa và xóa thông tin liên lac.
Bài toán đặt ra là : Xây dựng ứng dụng demo cho các kĩ thuật lập trình cơ bản
trên nên tảng hê điêu hành mở Android.
2.1.2 Đặc tả chức năng
Hiển thi thông tin liên lac
Chức năng hiên thi thông tin liên lac cho phép người dùng xem được danh sách
các thông tin liên lac. Hiển thi toàn bô danh sách Contacts gồm cả Tên và Số liên
hê.
Dòng sự kiên:
Người dùng bật chương trình.
Chương trình hiển thi danh sách các thông tin liên lac.
Thêm mới thông tin liêc lac
Chức năng thêm mới thông tin liên lac cho phép người dung có thể thêm thông
tin liên lac mới vào danh sách thông tin liên lac.
Dòng sự kiên:
Người dùng chọn chức năng thêm mới.
42
Page 43
Hê thống hiển thi Form nhập thông tin.
Người dùng nhập thông tin và Submit.
Hê thống kiển tra thông tin. Nếu thông tin hợp lê thì hê thông tiến hành thêm mới
thông tin liên lac vào CSDL. Nếu ngược lai thì đưa ra thông báo và quay lai
Form nhập thông tin.
Nếu thêm mới thành công thì hê thống trả vê danh sách liên lac đã cập nhật.
Sửa thông tin liên lac
Chức năng sửa thông tin liên lac cho phép người dung có thể sửa đôi thông tin
của môt Contacts.
Dòng sự kiên:
Người dùng chọn chức năng sửa thông tin liên lac.
Hê thống hiển thi Form sửa thông tin.
Người dùng sửa thông tin và Submit.
Hê thống kiển tra thông tin. Nếu thông tin hợp lê thì hê thông tiến hành thêm mới
thông tin liên lac vào CSDL. Nếu ngược lai thì đưa ra thông báo và quay lai
Form nhập thông tin.
Nếu thêm mới thành công thì hê thống trả vê danh sách liên lac đã cập nhật.
Xóa thông tin liên lac
Chức năng xóa thông tin liên lac cho phép người dùng có thể xóa môt Contact.
Dòng sự kiên:
Người dùng chọn chức năng xóa thông tin liên lac.
Hiên thi thông báo xác nhận xóa.
Người dùng xác nhận
Hê thống xóa thông tin liên lac trong CSDL. Sau đó hiên thi danh sách liên hê đã
cập nhật mới.
Tìm kiếm nhanh thông tin liên lac
Chức năng tìm kiếm nhanh Contact cho phép người dùng tìm nhanh môt Contact
trong danh sách Contacts.
Dòng sự kiên:
Người dung nhập tư khóa tìm kiến vào textbox tìm kiếm.
43
Page 44
Hê thống tự đông kiểm tra so sánh từ khóa nhập vào với các Contacts, từ đó trả
vê kết quả tìm kiếm cho người dung.
2.1.3 Phân tích hê thống với UML
2.1.3.1 Biểu đồ Usercase
Mô hình UseCase dưới đây thể hiên cho các chức năng của hê thông, các chức
năng mà người dung có thể tương tác.
Hình 10: Biểu đồ UseCase tổng quát
2.1.3.2 Biểu đồ Sequence (Biểu đô tuần tự)
Hiên thi danh sách liên lac
Hình 11: Biểu tuần tư cho chưc năng hiển thị.
44
Page 45
Tìm hiếm nhanh thông tin liên lac
Hình 12: Biểu đồ tuần tư cho chưc năng tìm kiếm.
Thêm môt thông tin liên lac mới
Hình 13: Biểu đồ tuần tư cho chưc năng thêm mới.
45
Page 46
Sửa thông tin liên lac
Hình 14: Biểu đồ tuần tư cho chưc năng sưa thông tin liên lạc.
Xóa thông tin liên lac
46
Page 47
Hình 15: Biểu đồ tuần tư cho chưc năng xoa thông tin liên lạc.
Xây dựng giao diên chương trình
Giao diên chính – hiển thi danh sách thông tin liên lac
Giao diên chính – hiển thi danh sách các thông tin liên lac có trong máy. Danh
sách này hiên thi tên và số điên thoai có trong điên thoai.
Hình 16: Giao diện chính – hiển thị danh sách liên lạc
Giao diên tìm kiếm thông tin liên lac
47
Page 48
Giao diên tìm kiếm gồm có môt textbox nằm ở giao diên chính cho phép người
dung nhập nôi dung tìm kiếm theo tên.
Hình 17: Giao diện tìm kiếm
48
Page 49
Giao diên thêm mới thông tin liên lac và sửa thông tin liên lac
Ở đây em sử dụng chung môt giao diên cho thêm mới và sửa thông tin liên lac.
Giao diên gồm có các textbox để điên tên , số điên thoai và e-mail.
Hình 18: Giao diện thêm và sưa thông tin liên lạc
Các giao diên Menu sử dụng trong chương trình
Hình 19: Giao diện menu chọn chưc năng sưa, xoa
49
Page 50
Hình 20: Giao diện menu chọn chưc năng thêm mới
50
Page 51
KẾT LUẬN
Kết quả đat được
Đứng trước sự phát triển của các thiết bi di đông và những đòi hỏi của con người
trong lĩnh vực giải trí, ứng dụng trên các thiết bi di đông ngày càng cao. Với đê
tài “Tìm hiểu lập trình Android và xây dựng ứng dụng Contacts Demo”, khóa
luận này đã trình bày được tông quan vê lập trình trên Android và các kĩ thuật vê
lập trình cơ bản trên Android.
Tuy nhiên do han chế vê điêu kiên và thời gian cũng như năng lực, khoá luận sẽ
không thể tránh khỏi những thiếu sót. Kính mong được sự đóng góp ý kiến của
thầy cô và các ban để nhóm thực hiên có thể hoàn thiên hơn đê tài nghiên cứu
của mình.
Hướng phát triển
Hiên tai, hê điêu hành Android đang phát triển rực rỡ, vì tính năng mở của nó. Và
nó cũng đang được công đồng các lập trình viên trên khắp thế giới quan tâm và
tìm hiểu, đồng thời trợ giúp cho Google phát triển và hoàn thiên tính năng cho hê
điêu hành này.
Do đó, trong tương lai em thực hiên sẽ tiếp tục tìm hiểu, đi sâu hơn vê các kỹ
thuật chuyên sâu lập trình ứng dụng Android, hướng đến phát triển các demo trên
thành môt ứng dụng hoàn chỉnh.
51
Page 52
TÀI LIỆU THAM KHẢO
Reto Meier. Professional Android™ Application Development. Wiley
Publishing, Inc. 2009.
Frank Ableson. Nhập môn phát triên ứng dụng Android. 2011.
Châu Duy Thiên, Vũ Thùy Linh, Lê Quốc Tiến. Tiểu luận Tìm hiểu và viết ứng
dụng trên nên hê điêu hành mobile Android. 2010.
http://www.android.com/
http://developer.android.com/index.html
http://code.google.com/intl/vi-VN/android/
52