BỘ CÔNG THƯƠNG
TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP TP. HCM
KHOA CÔNG NGHỆ THÔNG TIN
-----oooooo-----
Báo Cáo Đồ Án 2
Tìm Hiểu Hệ Điều Hành Android
Và Xây Dựng Ứng Dụng Minh Họa
GVHD: Võ
SVTH: Trần Minh Nghĩa 09243231
Sengaloun Thammavongsa 09259101
LỚP : DHTH3TLT
KHÓA : 3
TP.HCM 03/2013
LỜI CẢM ƠN
Sau quá trình nghiên cứu và tìm hiểu đề tài “Tìm hiểu hệ điều hành
Android” đã cơ bản hoàn thành. Để đạt được kết quả này, chúng em đã hết
sức nỗ lực đồng thời chúng em đã nhận được rất nhiều sự quan tâm, giúp đỡ
và ủng hộ của thầy cô, gia đình và bạn bè.
Em xin chân thành cảm ơn các thầy cô trong Khoa Công nghệ Thông
Tin cùng các thầy cô giáo trong trường Đại Học Công nghiệp TPHCM đã tận
tình giảng dạy, trang bị cho em những kiến thức quý báu trong những năm
học tập tại trường.
Đặc biệt, em xin chân thành cảm ơn cô ??? đã tận tình hướng dẫn, giúp
đỡ, chỉ bảo và đóng góp ý kiến cho chúng em trong suốt thời gian thực hiện
đồ án này.
Chúng con xin nói lên lòng biết ơn sâu sắc đối với cha mẹ đã chăm sóc,
nuôi dạy con nên người và luôn đi bên con trong những lúc khó khăn nhất.
Xin cảm ơn các anh chị và bạn bè đã ủng hộ, giúp đỡ và động viên
chúng em trong thời gian học tập và nghiên cứu.
Mặc dù đã có nhiều cố gắng trong quá trình làm bài, nhưng do thời gian
và kinh nghiệm còn hạn chế nên bài làm không thể tránh được thiếu sót, vì
vậy em rất mong nhận được sự chỉ bảo của thầy cô và sự đóng góp ý kiến của
các bạn để đề tài được hoàn thiện hơn.
Em xin được gửi lời cảm ơn tới các thầy cô trong khoa khoa học máy
tính trường Đại học Công nghiệp TP.HCM đã tạo điều kiện và mang lại
những kiến thức quý báu để em có thể thực hiện đề tài này. Xin cảm ơn cô đã
tận tình hướng dẫn và chỉ bảo em trong suốt quá trình làm đồ án chuyên
ngành để em có thể hoàn thành tốt đề tài này.
Em xin chân thành cảm ơn!
Sinh viên thực hiện
Trần Minh Nghĩa
Trang 2
Sengaloun Thammavongsa
Trang 3
NHẬN XÉT CỦA GIÁO VIÊN HƯỚNG DẪN
....................................................................................................................................
.....................................................................................................................................
.....................................................................................................................................
.....................................................................................................................................
.....................................................................................................................................
.....................................................................................................................................
.....................................................................................................................................
.....................................................................................................................................
.....................................................................................................................................
.....................................................................................................................................
.....................................................................................................................................
.....................................................................................................................................
.....................................................................................................................................
.....................................................................................................................................
.....................................................................................................................................
.....................................................................................................................................
.....................................................................................................................................
.....................................................................................................................................
Tp. HCM, Ngày....tháng........... năm 2012
Ký tên
Võ Thị
Trang 4
NHẬN XÉT CỦA GIÁO VIÊN PHẢN BIỆN
....................................................................................................................................
.....................................................................................................................................
.....................................................................................................................................
.....................................................................................................................................
.....................................................................................................................................
.....................................................................................................................................
.....................................................................................................................................
.....................................................................................................................................
.....................................................................................................................................
.....................................................................................................................................
.....................................................................................................................................
.....................................................................................................................................
.....................................................................................................................................
.....................................................................................................................................
.....................................................................................................................................
.....................................................................................................................................
.....................................................................................................................................
.....................................................................................................................................
Tp. HCM, Ngày....tháng........... năm 2012
Ký tên
Võ
Trang 5
LỜI NÓI ĐẦU
Android là một hệ điều hành mã nguồn mở được phát triển
dựa trên nhân Linux. Trong một hai năm trở lại đây, sự phát triển
của Android đã có những bước phát triển mạnh mẽ và dần chiếm
cảm tình của người dùng. Do có lợi thế là được xây dựng theo tiêu
chí mở nên việc phát triển ứng dụng trên Android được cho là khá
dễ dàng. Tuy nhiên, nguồn tài liệu để lập trình được ứng dụng chạy
trên Android khá là rời rạc và chưa có sự sắp xếp và tổ chức tốt.
Chính vì thế mà cuốn Phụ lục này được viết ngoài mục đích hỗ trợ
cho Khóa luận “Tìm hiểu Hệ điều hành Android và xây dựng ứng
dụng minh họa” còn có mục đích cao hơn đó là cung cấp những cái
nhìn cơ bản nhất, chung nhất giúp cho người đọc có thể dễ dàng
nắm bắt, học hỏi cách thức vận hành cũng như phát triển ứng dụng
trên hệ điều hành nhiều tiềm năng này.
Do thời gian thực hiện đề tài khá ngắn cho nên việc thiếu sót
là một điều không thể tránh khỏi. Nhóm chúng em rất mong được
sự góp ý từ Thầy Cô và các Bạn. Nhóm chúng em xin chân thành
cảm ơn.
Trang 6
MỤC LỤC
LỜI NÓI ĐẦU.........................................................................................................6
CHƯƠNG I: TỔNG QUAN VỀ ANDROID.......................................................11
1.Lịch sử hình thành và phát triển Android:.........................................................11
2.Khái niệm hệ điều hành Android:.....................................................................11
3.Các phiên bản Android:....................................................................................12
4.Tính năng của Android:....................................................................................14
5.Kiến trúc Android:............................................................................................14
Hệ điều hành android có 4 tầng từ dưới lên trên là tầng Linux Kernel (Phiên bản
2.6), Tầng Libraries & Android runtime , Tầng Application Framework và trên
cùng là tầng Application......................................................................................14
.............................................................................................................................15
5.1 Tầng Linux Kennel:.......................................................................................15
Hệ điều hành android được phát trển dựa trên hạt nhân linux, cụ thể là hạt nhân
linux phiên bản 2.6, điều đó được thể hiện ở lớp dưới cùng này. Tất cả mọi hoạt
động của điện thoại muốn thi hành được thì đều được thực hiện ở mức cấp thấp
ở lớp này bao gồm quản lý bộ nhớ (memory management), giao tiếp với phần
cứng (driver model), thực hiện bảo mật (security), quản lý tiến trình (process)...15
Tuy được phát triển dựa vào nhân linux nhưng thực ra nhân linux đã được nâng
cấp và sửa đổi rất nhiều để phù hợp với tính chất của những thiết bị cầm tay
như hạn chế về bộ vi xử lý, dung lượng bộ nhớ, kích thước màn hình, nhu cần
kết nối mạng không dây.......................................................................................15
Tầng này có các thành phần chủ yếu :.................................................................15
Display Driver : Điều khiển việc hiển thị lên màn hình cũng như thu nhận
những điều khiển của người dùng lên màn hình (di chuyển, cảm ứng...).............15
Camera Driver : Điều kiển hoạt động của camera, nhận luồng dữ liệu từ camera
trả về....................................................................................................................15
Bluetooth Driver : Điều khiển thiết bị phát và thu sóng Bluetooth......................15
USB driver : Quản lý hoạt động của các cổng giao tiếp USB..............................15
Keypad driver : Điều khiển bàn phím..................................................................15
Wifi Driver : Chịu trách nhiệm về việc thu phát sóng wifi.................................16
Audio Driver : điều khiển các bộ thu phát âm thanh, giải mã các tính hiệu dạng
audio thành tín hiệu số và ngược lại.....................................................................16
Trang 7
Binder IPC Driver : Chịu trách nhiệm về việc kết nối và liên lạc với mạng vô
tuyến như CDMA, GSM, 3G, 4G, E để đảm bảo những chức năng truyền thông
được thực hiện.....................................................................................................16
M-System Driver : Quản lý việc đọc ghi... lên các thiết bị nhớ như thẻ SD, flash
.............................................................................................................................16
Power Madagement : Giám sát việc tiêu thụ điện năng.......................................16
5.2 Tầng Library va Android Runtime.................................................................16
5.2.1Library:........................................................................................................16
Thư viện hệ thống (System C library) : thư viện dựa trên chuẩn C, được sử dụng
chỉ bởi hệ điều hành.............................................................................................16
Thư viện Media (Media Libraries) : Có nhiều codec để hỗ trợ việc phát và ghi
các loại định dạng âm thanh, hình ảnh, video thông dụng....................................16
Thư viện web (LibWebCore) : Đây là thành phần để xem nội dung trên web,
được sử dụng để xây dựng phần mềm duyệt web (Android Browse) cũng như để
các ứng dụng khác có thể nhúng vào. Nó cực kỳ mạnh, hỗ trợ được nhiều công
nghệ mạnh mẽ như HTML5, JavaScript, CSS, DOM, AJAX............................17
Thư viện SQLite : Hệ cơ sở dữ liệu để các ứng dụng có thể sử dụng..................17
............................................................................................................................17
5.2.2Android Runtime:........................................................................................17
5.3 Tầng Application Framework........................................................................17
Tầng thứ ba là tầng Application Framework. Tầng này được tích hợp sẵn bộ công
cụ cơ bản, sử dụng để cung cấp các dịch vụ khác cho các ứng dụng Android. Các
nhà phát triển Android có thể sử dụng các dịch vụ cốt lõi để xây dựng một cách
sáng tạo và phong phú các ứng dụng Android. Kiến trúc Application Framework
được thiết kế giúp đơn giản hóa việc tái sử dụng các thành phần; bất kỳ ứng dụng
có thể xuất bản khả năng......................................................................................17
Tầng này xây dựng bộ công cụ - các phần tử ở mức cao để các lập trình viên
có thể nhanh chóng xây dựng ứng dụng. Nó được viết bằng Java, có khả năng
sử dụng chung để tiết kiệm tài nguyên................................................................17
Đây là một nền tảng mở, điều đó có 2 điều lợi:...................................................17
Với các hãng sản xuất điện thoại : Có thể tùy biến để phù hợp với cấu hình điện
thoại mà họ sản xuất cũng như để có nhiều mẫu mã, style hợp thị hiếu người
dùng. Vì thế nên tuy cùng chung nền tảng android mà điện thoại của Google có
thể khác hẳn với Motorola, HTC, T-Mobile, Samsung.......................................18
Với lập trình viên : Cho phép lập trình viên có thể sử dụng các API ở tầng trên
mà không cần phải hiểu rõ cấu trúc bên dưới, tạo điều kiện cho lập trình viên tự
do sáng tạo bởi vì chỉ cần quan tâm đến nội dung mà ứng dụng họ làm việc.
Một tập hợp API rất hữu ích được xây dựng sẵn như hệ thống định vị, các dịch
vụ chạy nền, liên lạc giữa các ứng dụng, các thành phần giao diện cấp cao ......18
Trang 8
Giới thiệu một số thành phần của phần này :.......................................................18
Activity Manager : Quản lý các chu kỳ sống của một ứng dụng cũng như cung
.............................................................................................................................18
cấp công cụ điều khiển các Activity.....................................................................18
Telephony Manager : Cung cấp công cụ để thực hiện việc liên lạc như gọi điện
.............................................................................................................................18
thoại.....................................................................................................................18
XMPP Service : Cung cấp công cụ để liên lạc trong thời gian thực.....................18
Location Manager : Cho phép xác định vị trí của điện thoại thoại dựa vào hệ....18
thống định vị toàn cầu GPS và Google Maps.......................................................18
Window Manager : Quản lý việc xây dựng và hiển thị các giao diện người dùng
.............................................................................................................................18
cũng như tổ chức quản lý các giao diện giữa các ứng dụng.................................18
Notication Manager : Quản lý việc hiển thị các thông báo (như báo có tin nhắn,
.............................................................................................................................18
có e-mail mới..)....................................................................................................18
Resource Manager : Quản lý tài nguyên tĩnh của các ứng dụng bao gồm các file
.............................................................................................................................18
hình ảnh, âm thanh, layout, string. (Những thành phần không được viết bởi ngôn
.............................................................................................................................18
ngữ lập trình).......................................................................................................18
.............................................................................................................................18
5.4 Tầng Application:..........................................................................................18
Đây là lớp ứng dụng giao tiếp với người dùng, bao gồm các ứng dụng như :......18
Các ứng dụng cơ bản, được cài đặt đi liền với hệ điều hành là gọi điện(phone),
quản lý danh bạ(Contacts), duyệt web (Browser), nhắn tin (SMS), lịch làm việc
(Calendar), đọc e-mail (Email-Client), bản đồ (Map), quay phim chụp ảnh
(camera)...............................................................................................................19
Các ứng dụng được cài thêm như các phần mềm chứng khoán (Stock), các ......19
trò chơi (Game), từ điển.......................................................................................19
Các chương trình có các đặc điểm là :.................................................................19
Viết bằng Java, phần mở rộng là apk...................................................................19
Khi mỗi ứng dụng được chạy, nó có một phiên bản Virtual Machine được dựng
lên để phục vụ cho nó. Nó có thể là một Active Program : Chương trình có giao
diện với người sử dụng hoặc là một background : chương trình chạy nền hay là
dịch vụ. ...............................................................................................................19
Android là hệ điều hành đa nhiệm, điều đó có nghĩa là trong cùng một thời điểm,
có thể có nhiều chương trình cùng chạy một lúc, tuy nhiên, với mỗi ứng dụng thì
Trang 9
có duy nhất một thực thể (instance) được phép chạy mà thôi. Điều đó có tác
dụng hạn chế sự lạm dụng tài nguyên, giúp hệ thống hoạt động tốt hơn.............19
Các ứng dụng được gán số ID của người sử dụng nhằn phân định quyền hạn khi
sử dụng tài nguyên, cấu hình phần cứng và hệ thống...........................................19
Android là một hệ điều hành có tính mở, khác với nhiều hệ điều hành di động
khác, android cho phép một ứng dụng của bên thứ ba được phép chạy nền. Các
ứng dụng đó chỉ có một hạn chế nhỏ đó là nó không được phép sử dung quá
5~10% công suất CPU, điều đó nhằn để tránh độc quyền trong việc sử dụng
CPU.....................................................................................................................19
Ứng dụng không có điểm vào cố định, không có phương thức main để bắt đầu..19
CHƯƠNG II: PHÁT TRIỂN ỨNG DỤNG TRÊN ANDROID...........................20
1.Môi trường lập trình Android:..........................................................................20
Trong chương này sẽ giới thiệu các công cụ lập trình cho Android là Eclipse và
Android Development Tool plug-in, thông qua Android SDK và công cụ của nó,
chạy một ứng dụng Android trên Emulator..........................................................20
1.1 Android SDK:................................................................................................20
Android SDK là công cụ phát triển phần mềm được chính Google xây dựng và
phát hành miễn phí đến người lập trình để họ dễ dàng xây dựng và phát triển các
ứng dụng chạy được trên hệ điều hành Android..................................................20
1.2 Máy ảo Dalvik...............................................................................................20
1.3 Các gói Java cần thiết:...................................................................................21
2.Các thành phần cơ bản:.....................................................................................22
3.File AndroidMainfest:.......................................................................................22
Broadcast receiver có một hàm cho phép người dùng viết lại là hàm void
onCreate(Context curContext, Intent broadcastMsg)........................................31
Khi một tin nhắn phát đi cho người nhận, Android gọi phương thức onReceive
và chuyển nó cho đối tượng Intent đang chứa tin nhắn. Broadcast receiver
được xem là có hiệu lực chỉ khi nào có đang thực thi phương thức này. Khi
phương thức onReceive() kết thúc thì broadcast receiver không còn hiệu lực
nữa..........................................................................................................................31
CHƯƠNG IV: CÁC THÀNH PHẦN GIAO DIỆN TRONG ANDROID ........33
Trang 10
CHƯƠNG I: TỔNG QUAN VỀ ANDROID
1. Lịch sử hình thành và phát triển Android:
Tháng 7/2005, Google mua lại công ty phát triển phần mềm điện thoại Android,
nhưng chưa công bố sẽ sử dụng cho mục đích gì. Để trả lời cho câu hỏi đó, tháng
11/2007, sau 2 năm phát triển, Google công bố hệ điều hành điện thoại di động mã
nguồn mở Android, cùng với sự thành lập “Liên minh di động mở” (Open Handset
Alliance) bao gồm hơn 65 nhà sản xuất phần cứng điện thoại lớn trên thế giới như
Intel, HTC, China Mobile, T-Mobile,....
Hình 1 - Các thành viên của "Liên minh di động mở"
Từ năm 2007, hệ điều hành Android đã trải qua nhiều lần cập nhật, với phiên
bản gần đây nhất là Gingerbread 2.3, ra ngày 06/12/2010. Tính đến tháng 6/2010,
đã có khoảng 70 mẫu điện thoại di động sử dụng hệ điều hành Android, chưa kể các
thiết bị điện tử khác như máy tính bảng (tablet computers), ebook readers, Google
TV,... Tính đến thời điểm hiện tại, trên toàn cầu có khoảng 570 triệu thiết bị sử
dụng Android.
2. Khái niệm hệ điều hành Android:
Android là hệ điều hành mã nguồn mở dựa trên nền tảng Linux được thiết kế
chủ yếu cho các thiết bị di động như điện thoại di động, máy tính bảng, … Ban đầu được
phát triển bởi Android, Inc, Google ủng hộ về tài chính và sau đó mua lại vào năm 2005.
Android đã được công bố năm 2007 cùng với sự thành lập của Open Handset Alliance:
Trang 11
một tập đoàn các công ty phần cứng, phần mềm và viễn thông để phát triển các tiêu chuẩn
mở cho các thiết bị di động. Các thiết bị hỗ trợ Android đầu tiên được bán vào tháng 10
năm 2008.
Hệ điều hành mã nguồn mở Android được Google phát hành theo Giấy phép
Apache. Điều này cho phép hệ điều hành Android có thể được tự do sửa đổi và phân phối
bởi các nhà sản xuất thiết bị, nhà cung cấp mạng không dây và các nhà phát triển phần
mềm. Ngoài ra Android còn có một cộng đồng nhà phát triển ứng dụng lớn. Họ đã viết
nhiều ứng dụng giúp mở rộng các chức năng của thiết bị Android. Các ứng dụng này được
viết chủ yếu bằng ngôn ngữ lập trình Java.
3. Các phiên bản Android:
• Phiên bản Android 1.0 đầu tiên ra đời ngày 23/9/2008. Điện thoại HTC
Dream trở thành thiết bị đầu tiên chạy hệ điều hành Android. Những tính
năng có trên phiên bản 1.0 là:
− Tích hợp với các dịch vụ của Google.
− Trình duyệt web cho phép xem các trang web viết bằng HTML,
XHTML theo nhiều thẻ để có thể tải nhiều trang cùng lúc.
− Cho phép tải về, cài đặt và cập nhật phần mềm từ Android
Market.
− Hỗ trợ Wifi, Bluetooth.
• Phiên bản Android 1.1 ra đời ngày 9/2/2009 cập nhật lỗi và thêm một số
tính năng mới, cập nhật thêm T-Mobile G1.
• Phiên bản Android 1.5 ra đời ngày 30/4/2009 có tên là Cupcake bao gồm
một số tính năng mới và các cập nhật về giao diện người dùng:
− Tải video lên Youtube và ảnh lên Picasa trực tiếp từ điện thoại.
− Bàn phím ảo mới với khả năng đoán trước văn bản.
− Hỗ trợ Bluetooth A2DP và AVRCP.
− Tự động kết nối với một thiết bị Bluetooth trong một khoảng cách
nhất định.
• Phiên bản Android 1.6 ra đời ngày 15/9/2009 có tên Donut được cập nhật
các tính năng mới:
− Cập nhật công nghệ hỗ trợ CDMA.
− Hỗ trợ độ phân giải màn hình WVGA.
Trang 12
− Tăng tốc độ tìm kiếm và các ứng dụng camera.
− Nâng cấp trải nghiệm Android Market.
• Phiên bản Android 2.0 ra đời ngày 26/10/2009 có tên Éclair với những tính
năng:
− Giao diện trình duyệt mới và hỗ trợ HTML5.
− Bluetooth 2.1
− Hình nền động
− Thêm nhiều độ phân giải màn hình và kích cỡ màn hình.
− Tối ưu hóa tốc độ phần cứng.
• Phiên bản Android 2.1 ra đời ngày 12/1/2010
• Phiên bản Android 2.2 ra đời ngày 20/5/2010 có tên là Froyo với những tính
năng:
− Tối ưu hóa toàn bộ hệ điều hành Android về tốc độ, bộ nhớ và hiệu
năng.
− Hỗ trợ Adobe Flash 10.1.
− Hỗ trợ Hotspot
• Phiên bản Android 2.3 ra đời ngày 6/12/2010 có tên Gingerbread với những
tính năng:
− Giao diện người dùng được cải tiến để đơn giản và nhanh hơn.
− Bàn phím mới nhập văn bản nhanh hơn.
− Gọi điện thoại internet.
• Phiên bản Android 3.0 ra đời ngày 10/5/2011 có tên Honeycomb với những
tính năng:
− Tối ưu hóa cho máy tính bảng và các thiết bị với kích thước màn
hình lớn hơn.
− Tùy biến màn hình chủ.
− Kết nối Bluetooth.
− Hỗ trợ giao thức truyền thông, hình ảnh
• Phiên bản Android 4.0 ra đời ngày 19/10/2011 có tên Ice Cream Sandwich
với những tính năng:
− Kiểu chữ mới Roboto.
Trang 13
− Tính năng mở khóa mới.
− Sắp đặt lại các thư mục, các mục yêu thích, ảnh chụp màn hình.
− Kéo bỏ các thông báo, nhiệm vụ và thẻ trình duyệt.
− Hỗ trợ wifi trực tiếp và Bluetooth HDP.
• Phiên bản Android 4.1 ra đời ngày 9/7/2012 có tên Jelly Bean với những
tính năng:
− Nhanh, mượt hơn, đáp ứng được nhiều hơn.
− Thay đổi kích thước ứng dụng Widgets
− Cập nhật ứng dụng tốt và nhanh hơn.
4. Tính năng của Android:
Android bao gồm các tính năng như:
• Khung ứng dụng: cho phép tái sử dụng lại các ứng dụng đã có sẵn.
• Máy ảo Dalvik: là máy ảo được tinh chỉnh dành riêng cho thiết bị di động
chạy trên nền Android. Các chương trình Java đa phần chạy trên máy ảo
Java; trong khi đó, Dalvik là máy ảo dùng để chạy ứng dụng Java trên di
động Android.
• Trình duyệt web được tích hợp sẵn: được dựa trên bộ mã nguồn mở Webkit.
• Hệ thống xử lý đồ họa được tối ưu hóa: gồm thư viện đồ họa 2D, thư viện
đồ họa 3D dựa trên nền OpenGL.
• SQLite: dùng cho lưu trữ cơ sở dữ liệu cục bộ.
• Media: hỗ trợ định dạng các tập tin âm thanh, video, và hình ảnh thông
thường như: MPEG4, H.264, MP3, AAC, AMR, JPG, PNG và GIF.
• Điện thoại GSM với các chức năng nghe gọi, tin nhắn.
• Hỗ trợ hầu hết các phương thức kết nối Bluetooth, EDGE, 3G và wifi.
• Hỗ trợ các phần cứng: camera, GPS, la bàn số và cảm nhận gia tốc.
• Môi trường phát triển đa dạng: bao gồm thiết bị máy ảo, công cụ để kiểm
lỗi, bộ nhớ và công cụ cung cấp thông tin giả lập và plugin cho Eclipse.
5. Kiến trúc Android:
Hệ điều hành android có 4 tầng từ dưới lên trên là tầng Linux Kernel (Phiên
bản 2.6), Tầng Libraries & Android runtime , Tầng Application Framework và trên
cùng là tầng Application.
Trang 14
5.1 Tầng Linux Kennel:
Hệ điều hành android được phát trển dựa trên hạt nhân linux, cụ thể là hạt
nhân linux phiên bản 2.6, điều đó được thể hiện ở lớp dưới cùng này. Tất cả mọi hoạt
động của điện thoại muốn thi hành được thì đều được thực hiện ở mức cấp thấp ở
lớp này bao gồm quản lý bộ nhớ (memory management), giao tiếp với phần cứng
(driver model), thực hiện bảo mật (security), quản lý tiến trình (process).
Linux Kernel là tầng nền tảng, cung cấp các trình điều khiển thiết bị phần cứng,
quản lý tiến trình, quản lý tài nguyên, bảo mật, …. Tầng này làm nhiệm vụ như một lớp
trung gian kết nối phần cứng thiết bị với phần ứng dụng.
Tuy được phát triển dựa vào nhân linux nhưng thực ra nhân linux đã được
nâng cấp và sửa đổi rất nhiều để phù hợp với tính chất của những thiết bị cầm tay
như hạn chế về bộ vi xử lý, dung lượng bộ nhớ, kích thước màn hình, nhu cần kết
nối mạng không dây...
Tầng này có các thành phần chủ yếu :
 Display Driver : Điều khiển việc hiển thị lên màn hình cũng như thu
nhận những điều khiển của người dùng lên màn hình (di chuyển, cảm
ứng...)
 Camera Driver : Điều kiển hoạt động của camera, nhận luồng dữ liệu
từ camera trả về.
 Bluetooth Driver : Điều khiển thiết bị phát và thu sóng Bluetooth.
 USB driver : Quản lý hoạt động của các cổng giao tiếp USB
 Keypad driver : Điều khiển bàn phím
Trang 15
 Wifi Driver : Chịu trách nhiệm về việc thu phát sóng wifi
 Audio Driver : điều khiển các bộ thu phát âm thanh, giải mã các tính
hiệu dạng audio thành tín hiệu số và ngược lại
 Binder IPC Driver : Chịu trách nhiệm về việc kết nối và liên lạc với
mạng vô tuyến như CDMA, GSM, 3G, 4G, E để đảm bảo những chức
năng truyền thông được thực hiện.
 M-System Driver : Quản lý việc đọc ghi... lên các thiết bị nhớ như thẻ
SD, flash
 Power Madagement : Giám sát việc tiêu thụ điện năng.
5.2 Tầng Library va Android Runtime
5.2.1 Library:
Library chứa các thư viện gốc của Android, được viết bằng C/C++, giúp cho
người phát triển phần mềm có thể phát triển ứng dụng thông qua tầng Application
Framework. Một số thư viện quen thuộc:
Surface Manager: dùng để quản lý các hình ảnh hiển thị trên màn hình, quản lý
sự liền mạch của các lớp đồ họa 2D, 3D.
OpenGL | ES: là thư viên đồ họa 3D, dùng để gia tốc phần cứng nếu thiết bị có
chip đồ họa 3D hoặc chuyển sang kiểu định dạng có thể hiển thị lên màn hình của hình ảnh
3D.
SLG: thư viện đồ họa 2D, dùng khi cần hiển thị các hình ảnh 2D.
Media Framework: phát triển dựa trên nền tảng PacketVideo OpenCORE, hỗ
trợ bộ giải mã phần cứng, phần mềm; hỗ trợ các định dạng âm thanh, phim phổ biến như
MPEG4, H.264, MP3, AAC, AMR, JPG, PNG.
FreeType: Hỗ trợ tạo ra hình ảnh và vector font chữ.
SSL: thư viện SSL đảm bảo sự riêng tư và toàn vẹn khi truyền dữ liệu giữa
máy chủ web và trình duyệt trên thiết bị.
SQLite: Là hệ thống quản lý cơ sở dữ liệu cho mỗi ứng dụng của Android.
Webkit: Là một trình duyệt web mã nguồn mở được tích hợp sẵn trong
Android.
 Thư viện hệ thống (System C library) : thư viện dựa trên chuẩn
C, được sử dụng chỉ bởi hệ điều hành.
 Thư viện Media (Media Libraries) : Có nhiều codec để hỗ trợ
việc phát và ghi các loại định dạng âm thanh, hình ảnh, video
thông dụng.
Trang 16
 Thư viện web (LibWebCore) : Đây là thành phần để xem nội
dung trên web, được sử dụng để xây dựng phần mềm duyệt web
(Android Browse) cũng như để các ứng dụng khác có thể
nhúng vào. Nó cực kỳ mạnh, hỗ trợ được nhiều công nghệ
mạnh mẽ như HTML5, JavaScript, CSS, DOM, AJAX..
 Thư viện SQLite : Hệ cơ sở dữ liệu để các ứng dụng có thể sử
dụng.
 .....
5.2.2 Android Runtime:
Phần này chứa các thư viện mà một chương trình viết bằng ngôn ngữ Java có
thể hoạt động. Phần này có 2 bộ phận tương tự như mô hình chạy Java trên máy tính
thường. Thứ nhất là các thư viện lõi (Core Library) , chứa các lớp như JAVA IO,
Collections, File Access. Thứ hai là một máy ảo java (Dalvik Virtual Machine). Mặc dù
cũng được viết từ ngôn ngữ Java nhưng một ứng dụng Java của hệ điều hành android
không được chạy bằng JRE của Sun (nay là Oracle) (JVM) mà là chạy bằng máy ảo
Dalvik do Google phát triển.
Android Runtime bao gồm máy ảo Dalvik và một số thư viện lõi, được thừa kế
gần như tất cả các tính năng được cung cấp bởi các thư viện của các ngôn ngữ lập trình
Java.
Máy ảo Dalvik là một điểm đặc biệt được thiết kế cho nền tảng Android giúp
tối ưu hóa cho các thiết bị di động, nơi mà nguồn tài nguyên bị hạn chế - như bộ nhớ thấp,
kích thước nhỏ, tốc độ xử lý chậm. Máy ảo Dalvik có khả năng thực hiện các chương trình
viết bằng Java. Một công cụ dx được sử dụng để chuyển đổi mã Java thành mã Byte mà
máy ảo Dalvik có thể thực thi một cách dễ dàng trên các thiết bị di động. Android hỗ trợ
thực hiện nhiều ứng dụng đồng thời trên máy ảo Dalvik.
5.3 Tầng Application Framework
Tầng thứ ba là tầng Application Framework. Tầng này được tích hợp sẵn bộ công
cụ cơ bản, sử dụng để cung cấp các dịch vụ khác cho các ứng dụng Android. Các nhà phát
triển Android có thể sử dụng các dịch vụ cốt lõi để xây dựng một cách sáng tạo và phong
phú các ứng dụng Android. Kiến trúc Application Framework được thiết kế giúp đơn giản
hóa việc tái sử dụng các thành phần; bất kỳ ứng dụng có thể xuất bản khả năng.
Tầng này xây dựng bộ công cụ - các phần tử ở mức cao để các lập trình
viên có thể nhanh chóng xây dựng ứng dụng. Nó được viết bằng Java, có khả năng
sử dụng chung để tiết kiệm tài nguyên.
Đây là một nền tảng mở, điều đó có 2 điều lợi:
Trang 17
• Với các hãng sản xuất điện thoại : Có thể tùy biến để phù hợp với cấu
hình điện thoại mà họ sản xuất cũng như để có nhiều mẫu mã, style
hợp thị hiếu người dùng. Vì thế nên tuy cùng chung nền tảng android
mà điện thoại của Google có thể khác hẳn với Motorola, HTC, T-
Mobile, Samsung...
• Với lập trình viên : Cho phép lập trình viên có thể sử dụng các API ở
tầng trên mà không cần phải hiểu rõ cấu trúc bên dưới, tạo điều kiện
cho lập trình viên tự do sáng tạo bởi vì chỉ cần quan tâm đến nội dung
mà ứng dụng họ làm việc. Một tập hợp API rất hữu ích được xây
dựng sẵn như hệ thống định vị, các dịch vụ chạy nền, liên lạc giữa các
ứng dụng, các thành phần giao diện cấp cao ...
Giới thiệu một số thành phần của phần này :
• Activity Manager : Quản lý các chu kỳ sống của một ứng dụng cũng như
cung
• cấp công cụ điều khiển các Activity.
• Telephony Manager : Cung cấp công cụ để thực hiện việc liên lạc như gọi
điện
• thoại
• XMPP Service : Cung cấp công cụ để liên lạc trong thời gian thực
• Location Manager : Cho phép xác định vị trí của điện thoại thoại dựa vào hệ
• thống định vị toàn cầu GPS và Google Maps.
• Window Manager : Quản lý việc xây dựng và hiển thị các giao diện người
dùng
• cũng như tổ chức quản lý các giao diện giữa các ứng dụng.
• Notication Manager : Quản lý việc hiển thị các thông báo (như báo có tin
nhắn,
• có e-mail mới..)
• Resource Manager : Quản lý tài nguyên tĩnh của các ứng dụng bao gồm các
file
• hình ảnh, âm thanh, layout, string. (Những thành phần không được viết bởi
ngôn
• ngữ lập trình)
• .....
5.4 Tầng Application:
Đây là lớp ứng dụng giao tiếp với người dùng, bao gồm các ứng dụng như :
Trang 18
Các ứng dụng cơ bản, được cài đặt đi liền với hệ điều hành là gọi điện(phone), quản
lý danh bạ(Contacts), duyệt web (Browser), nhắn tin (SMS), lịch làm việc (Calendar),
đọc e-mail (Email-Client), bản đồ (Map), quay phim chụp ảnh (camera)...
Các ứng dụng được cài thêm như các phần mềm chứng khoán (Stock), các
trò chơi (Game), từ điển...
Các chương trình có các đặc điểm là :
• Viết bằng Java, phần mở rộng là apk
• Khi mỗi ứng dụng được chạy, nó có một phiên bản Virtual Machine được
dựng lên để phục vụ cho nó. Nó có thể là một Active Program : Chương
trình có giao diện với người sử dụng hoặc là một background : chương
trình chạy nền hay là dịch vụ.
• Android là hệ điều hành đa nhiệm, điều đó có nghĩa là trong cùng một thời
điểm, có thể có nhiều chương trình cùng chạy một lúc, tuy nhiên, với mỗi
ứng dụng thì có duy nhất một thực thể (instance) được phép chạy mà thôi.
Điều đó có tác dụng hạn chế sự lạm dụng tài nguyên, giúp hệ thống hoạt
động tốt hơn.
• Các ứng dụng được gán số ID của người sử dụng nhằn phân định quyền
hạn khi sử dụng tài nguyên, cấu hình phần cứng và hệ thống.
• Android là một hệ điều hành có tính mở, khác với nhiều hệ điều hành di
động khác, android cho phép một ứng dụng của bên thứ ba được phép
chạy nền. Các ứng dụng đó chỉ có một hạn chế nhỏ đó là nó không được
phép sử dung quá 5~10% công suất CPU, điều đó nhằn để tránh độc
quyền trong việc sử dụng CPU.
• Ứng dụng không có điểm vào cố định, không có phương thức main để bắt
đầu.
Trang 19
CHƯƠNG II: PHÁT TRIỂN ỨNG DỤNG TRÊN ANDROID
1. Môi trường lập trình Android:
Trong chương này sẽ giới thiệu các công cụ lập trình cho Android là Eclipse và
Android Development Tool plug-in, thông qua Android SDK và công cụ của nó, chạy một
ứng dụng Android trên Emulator.
1.1 Android SDK:
Android SDK là công cụ phát triển phần mềm được chính Google xây dựng và phát
hành miễn phí đến người lập trình để họ dễ dàng xây dựng và phát triển các ứng dụng chạy
được trên hệ điều hành Android.
Android SDK có các đặc tính sau:
• Được phát triển và cung cấp miễn phí.
• Truy cập đến phần cứng wifi.
• GSM, EDGE và tính năng mạng 3G cho phép việc chuyển dữ
liệu, gọi điện hay gửi tin SMS trong mạng di động.
• Gói API toàn diện cho các dịch vụ nền tảng như GPS.
• Truy cập toàn bộ phần cứng điều khiển đa phương tiện như
nghe nhạc, ghi âm hay sử dụng microphone và camera.
• Chia sẽ dữ liệu trong kho dữ liệu.
• Tích hợp trình duyệt dựa trên bộ WebKit.
• P2P hỗ trợ sử dụng Goolge Talk.
• Hỗ trợ tốt đồ họa 3D nhờ sử dụng OpenGL ES.
Android SDK cần phải được cài đặt để xây dựng các ứng dụng Android.
Android SDK bao gồm tài liệu tích hợp HTML_base lõi chính của Javadoc để thể hiện các
gói và lớp trong Java.
1.2 Máy ảo Dalvik
Một trong những thành phần quan trọng của Android là máy ảo Dalvik. Thay
vì sử dụng máy ảo Java như trước kia, Android sử dụng máy ảo của riêng nó được thiết kế
để bảo đảm rằng đa ứng dụng có thể chạy mượt mà trên một thiết bị di động.
Máy ảo Dalvik sử dụng lõi Linux để xử lý các chức năng ở mức thấp bao gồm
bảo mật, các tiến trình, các luồng và quản lý vùng nhớ. Nó cũng có thể viết bằng ứng dụng
C/C++ để chạy trực tiếp lên lõi Linux bên dưới. Giữa phần cứng và các dịch vụ hệ thống
được quản lý bởi máy ảo Dalvik, nó là một thành phần ở giữa. Bằng cách sử dụng máy ảo
này để chạy ứng dụng, các nhà phát triển hoàn toàn không phải bận tâm gì về các phần
Trang 20
cứng bên dưới. Khi máy ảo náy chạy nó sẽ tạo ra tập tin có đuôi là .dex, tập tin này được
SDK tạo ra bởi sự chuyển đổi từ các lớp biên dịch ngôn ngữ Java.
1.3 Các gói Java cần thiết:
• Java.lang: Gói chứa các lớp lõi của Java
• Java.io: Xuất nhập
• Java.net: Kết nối mạng
• Java.util: Chứa các lớp tiện ích
• Java.text: Tiện ích xử lý vă bản
• Java.math: Các lớp toán học
• Javax.net: Các lớp mạng
• Javax.security: Lớp liên quan đến bảo mật
• Javax.xml: Các lớp liên quan đến DOM-based XML
• Org.apache.*: Các lớp liên quan đến HTTP.
• Org.xml: Các lớp liên quan đến SAX-based XML
Các gói dùng cho lập trình Android:
• Android.app: Mô hình truy cập ứng dụng Android
• Android.content: Truy xuất dữ liệu trong Android
• Android.net: Bao gồm lớp Uri dùng cho việc truy xuất các nội dung
khác
• Android.graphics: Đồ họa
• Android.opengl: Các lớp OpenGL
• Android.os: Truy cập ở mức độ hệ thống đến mội trường Android
• Android.provider: Các lớp liên quan đến ContentProvider
• Android.telephony: Khả năng truy cập Telephony
• Android.text: Bố trí văn bản
• Android.util: Tập các tiện ích thao tác trên văn bản bao gồm XML
• Android.view: Thành phần giao diện người dùng
• Android.webkit: Chức năng trình duyệt
• Android.widget: Thành phần giao diện người dùng ở mức độ cao hơn
Trang 21
Các gói gần như là lõi của mọi ứng trên Android là Android.app, Android.view
và Android.content.
2. Các thành phần cơ bản:
• Activities (Android.app.Activity): đây là lớp khởi tạo giao diện ứng dụng
nội bộ trên Android tương tự như MIDlet trong J2ME.
• Services (Android.app.Service): cung cấp các dịch vụ liên quan đến
Client/Service. Một Service sẽ chạy ngầm bên dưới, sau đó các Client sẽ
kết nối và truy xuất các hàm trên thông quan lớp Interface.
• Broadcast Receiver (Android.content.BroadcastReceiver): đây là một ứng
dụng chạy ngầm dùng để đọc và cập nhật thông tin trên giao diện người
dùng như cập nhật sự thay đổi giờ, pin...
• Content Providers: cung cấp chức năng truy vấn dữ liệu giữa các ứng dụng
của Android.
3. File AndroidMainfest:
Trong bất kỳ một dự án Android nào khi tạo ra đều có một tập tin
AndroidManifest.xml, tập tin này được dùng để định nghĩa các màn hình sử dụng cũng
như giao diện ứng dụng. Đồng thời nó cũng chứa thông tin về phiên bản SDK cũng như
chương trình chính sẽ chạy đầu tiên.
Tập tin này được tự động sinh ra khi tạo một dự án Android. Trong tập tin
Manifest bao giờ cũng có 3 thành phần chính đó là: Application, Permission và SDK
Version.
Dưới đây là nội dung của một tập tin AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="dtu.k12tpm.pbs.activity"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon"
android:label="@string/app_name">
<activity android:name=".LoginActivity"
android:label="@string/app_name">
Trang 22
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".MainContactListActivity" />
<activity android:name=".RestoreContactActivity" />
</application>
<uses-sdk android:minSdkVersion="7" />
<uses-sdk android:minSdkVersion="7" />
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.CALL_PHONE"/>
</manifest>
• Application
Bên trong thẻ <application> chứa các thuộc tính được định nghĩa cho
ứng dụng Android như:
− Android:icon = “drawable resource”: Ở đây đặt đường dẫn đến
tập tin biểu tượng của ứng dụng khi cài đặt.
− Android:name = “string”: Thuộc tính này để đặt tên cho ứng
dụng Android. Tên này sẽ được hiển thị lên màn hình sau khi
cài đặt ứng dụng.
− Android:theme = “drawable theme”: Thuộc tính này để đặt giao
diện cho ứng dụng.
− Ngoài ra còn nhiều thuộc tính khác.
• Permission
Bao gồm các thuộc tính chỉ định quyền truy xuất và sử dụng tài nguyên
của ứng dụng. Khi cần sử dụng một loại tài nguyên nào đó thì trong tập
tin Manifest của ứng dụng cần phải khai báo các quyền truy xuất như
sau:
<uses-permission
android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission
android:name="android.permission.ACCOUNT_MANAGER"/>
<uses-permission android:name="android.permission.VIBRATE" />
Trang 23
<uses-permission
android:name="android.permission.CALL_PHONE"/>
• SDK Version
Thẻ xác định phiên bản SDK được khai báo như sau:
<uses-sdk android:minSdkVersion="7" />
Ở đây chỉ ra phiên bản SDK nhỏ nhất mà ứng dụng hiện đang sử dụng.
CHƯƠNG III: COMPONENTLIFE CYCLE
Các thành phần ứng dụng có vòng đời – đó là sự bắt đầu khi Android khởi động thành
phần cho đến khi kết thúc ứng dụng khi thực thể ứng dụng bị hủy. Các trạng thái ứng
dụng có thể có hiệu lực hay không có hiệu lực; đối với activities, thì có tình trạng visible
hoặc invisible. Trong mục này ta nói về vòng đời của activities, services, và broadcast
receiver.
1. Vòng đời của Activity:
1.1Activity Stack:
Bên trong hệ thống các activity được quản lý như một ngăn xếp các hoạt động.
Khi một hoạt động mới được bắt đâu, nó được đặt ở đỉnh của ngăn xếp và trở thành hoạt
động đang chạy, hoạt động trước sẽ ở bên dưới hoạt động mới và sẽ không thấy trong suốt
quá trình hoạt động mới tồn tại.
Nếu người dùng nhấn nút Back thì hoạt động kết tiếp của ngăn xếp sẽ di duyển
lên và trở thành hoạt động.
Hình: Activity stack
1.2Các trạng thái của chu kì sống:
Trang 24
Một hoạt động chủ yếu có 3 trạng thái chính sau:
Trạng thái hoạt động: khi ứng dụng được chạy lên màn hình – tức là hoạt động
đang ở trên đỉnh của ngăn xếp. Người dùng sẽ tương tác trực tiếp đến hoạt động này.
Trạng thái tạm dừng: một hoạt động bị tạm dừng là khi hoạt động khác ở phía
trên hoạt động bị dừng. Hoạt động ở phía trên có thể trong suốt hoặc chỉ che khuất một
phần màn hình, do đó có thể nhìn thấy được các hoạt động tạm dừng ở phía dưới. Một hoạt
động bị tạm dừng duy trì tất cả các thông tin, trạng thái và vẫn gắn liền với trình quản lý
cửa sổ. Các hoạt động bị tạm dừng có thể bị tắt nếu hệ thống gặp tình trạng bộ nhớ thấp.
Trạng thái ngừng hoạt động: là trạng thái hoạt động không được hiển thị cho
người sử dụng và người dụng không thể tương tác trực tiếp với nó, nhưng nó vẫn còn duy
trì tất cả các trạng thái. Các hoạt động bị ngừng có thể bị tắt nếu hệ thống có nhu cầu sử
dùng bộ nhớ cho các hoạt động khác. Hệ thống có thể loại bỏ một hoạt động bị dừng bằng
cách gọi phương thức finish() hoặc đơn giản là tắt quá trình xử lý của nó.
Khi một hoạt động chuyển đổi từ trạng thái này sang trạng thái khác, hoạt động
sẽ gọi các phương thức:
Void onCreate( Bundle saveInstanceState)
Void onStart()
Void onRestart()
Void onResume()
Void onPause()
Void onStop()
Void onDestroy()
Phương pháp onCreate() phải được thực hiện trong phần khai báo đối tượng.
Các phương thức trên có thể được ghi đè các hoạt động khi trạng thái thay đổi. Để thực
hiện các thay đổi về dữ liệu và ngăn chặn người dùng tương tác, phương thức onPause() có
thể được gọi.
Trang 25
Nếu một Activity bị tạm dừng và dừng hẳn, hệ thống có thể loại bỏ nó ra khỏi bộ
nhớ bằng cách gọi hàm finish() hoặc loại bỏ nó ra khỏi tiến trình.
Với 7 phương thức định nghĩa cho toàn bộ vòng đời ứng dụng của Activity. Nếu
chú ý, ta thấy có những vòng khép kín như sau:
• Vòng khép kín toàn bộ của ứng dụng: Activity bắt đầu từ lần gọi hàm đầu
tiên onCreate() đến hàm cuối cùng onDestroy(). Một Activity làm tất cả các
thiết lập đầu tiên cho chương trình trong hàm onCreate() và giải phóng tất
cả các tài nguyên trong hàm onDestroy(). Ví dụ như ứng dụng có 1 luồng
chạy ngầm để tải dữ liệu từ máy chủ về thì nó tạo luồng trong hàm
onCreate() và sau đó dừng hẵn luồng trong hàm OnDestroy().
• Vòng đời nhìn thấy được bởi người dùng: trong Activity từ hàm onStart()
cho đến hàm onStop(). Trong suốt thời gian này, người dùng có thể thấy
Activity trên màn hình. Giữa 2 phương thức này, bạn có thể duy trì các tài
nguyên mà cần thiết để trình bày Activity cho người dùng. Ví dụ, bạn có
thể khai báo BroadcastReceiver trong hàm onStart() để giám sát tự thay
đổi ảnh hưởng đến giao diện và giải phóng nó trong hàm onStop() khi
người dùng không còn nhìn thấy những gì bạn đang trình bày. Hàm
onStart() và onStop() được gọi nhiều lần bởi vì acitivity thay đổi nhiều lần
giữa trạng thái nhìn thấy được và ẩn đi đối với người dùng.
• Vòng đời chạy ngầm: từ hàm onResume() đến hàm onPause(). Trong suốt
thời gian này, Activity chuyển từ trạng thái resume sang pause hay ngược
lại. onPause() được gọi khi thiết bị “ngủ” hoặc khi Activity mới được
khởi động, hàm onResume() được gọi khi kết quả của một Activity hay
một intent mới được đưa ra. Vì thế mã lệnh trong hai phương thức này nên
ít thôi. Hình sau mô tả những vòng khép kín và con đường mà activty phải
trải qua giữa các trạng thái. Hình ô van thể hiện trạng thái của Activity, hình
chữ nhật thể hiện các phương thức của vòng đời ứng dụng khi mà Activity
có sự thay đổi trạng thái.
Trang 26
Hình: Vòng đời của 1 Ativity
1.3 Các sự kiện trong chu kỳ sống của vòng đời ứng dụng:
Nếu một hoạt động được tạm dừng hoặc dừng hẵn, hệ thống có thể bỏ thông tin
khác của nó từ vùng nhớ bằng việc gọi hàm finish(), hoặc đơn giản dừng tiến trình của nó.
Khi nó được hiển thị lần nữa với người dùng, nó phải được hoàn toàn khởi động lại và
phục hồi lại trạng thái trước. Khi một hành động chuyển qua chuyển lại giữa các trạng thái,
nó báo việc chuyển đổi bằng cách gọi hàm transition.
Hình: Các hàm thực thi
Trang 27
Tất cả các phương thức là những móc nối mà chúng ta có thể ghi đè để làm
tương thích công việc trong ứng dụng khi thay đổi trạng thái. Tất cả các hoạt động phải có
onCreate() để khởi tạo ứng dụng. Nhiều hoạt động sẽ thực hiện onPause() để xác nhận việc
thay đổi dữ liệu và chuẩn bị dừng hoạt động với người dùng.
1.4 Thời gian sống của ứng dụng:
Thời gian sống của một hoạt động diễn ra giữa lần đầu tiên gọi onCreate() đến trạng thái
cuối cùng gọi onDestroy(). Một hoạt động khởi tạo toàn bộ trạng thái toàn cục trong
onCreate() và giải phóng các tài nguyên đang tồn tại trong onDestroy().
1.5 Thời gian hiển thị các hoạt động:
Visible lifetime của một hoạt động diễn ra giữa lần gọi một onStart() cho đến
khi gọi onStop(). Trong suốt khoảng thời gian này người dùng có thể thấy hoạt độn trên
màn hình, có nghĩa là nó không bị hoạt động khác phía trên hoặc đang tương tác với người
dùng. Giữa hai phương thức người dùng có thể duy trì tài nguyên để hiển thị hoạt động đến
người dùng.
1.6 Các hàm thực thi:
Phương thức
hàm
Mô tả Có thể hủy
(Killable)
Theo sau
hàm
onCreate()
Được gọi khi Activity lần đầu tiên
được tạo. Đây là nơi đầu tiên bạn nên
làm tất cảcác thiết lập như tạo Views,
gắn dữ liệu vào danh sách hay đại loại
vậy. Luôn theo sau là hàm onStart().
Không onStart()
onRestart()
Được gọi sau khi Activity đã bị dừng
trước đó và được được khởi động lại.
Luôn theo sau hàm onStart().
Không onStart()
onStart()
Được gọi chỉ trước khi acitivity trở nên
nhìn thấy được với người dùng. Luôn
theo sau là hàm onResume() nếu
Activity chạy ngầm hoặc onStop() nếu
nó bị ẩn đi.
Không onResume()
hoặc
onStop()
onResume()
Chỉ được gọi trước Activity bắt đầu
tương tác với người dùng. Tại thời
điểm này, Activity nằm trên đầu của
ngăn xếp Activity và người dùng chuẩn
bị tương tác với chúng. Luôn theo sau
là hàm onPause().
Không onPause()
onPause()
Được gọi khi hệ thống sắp bắt đầu hồi
phục lại một Activity khác. Phương
thức này được dùng để lưu những dữ
Có onResume()
hoặc
onStop()
Trang 28
liệu mới vừa thay đổi, dừng hẳn hiệu
ứng động và và dừng hẳn những thứ
khác có thể ngốn tài nguyên CPU hay
đại loại vậy. Ứng dụng làm bất cứ cái
gì để sao cho nó chạy nhanh bởi vì
Activity kế tiếp sẽ không hồi phục lại
cho đến khi acitvity hiện tại dừng lại.
Nó theo sau hàm onResume() nếu
Activity hiện tại sắp được thực thi
hoặc theo sau là hàm onStop() nếu nó
trở nên ẩn đi đối với người dùng.
onStop()
Được gọi khi người dùng không nhìn
thấy được Activity nữa. Điều này có
thể xảy ra bởi vì nó đang được hủy
hoặc một Activity khác (có thể Activity
đang tồn tại hoặc Activity mới) được
hồi phục lại và đang đè lên Activity
hiện tại. Vừa theo sau là hàm
onRestart() nếu Activity đang quay lại
để tương tác với người dùng hoặc hàm
onDestroy() nếu Activity dự định hủy
đi.
Có onRestart()
hoặc
onDestroy
onDestroys()
Được gọi trước khi Activity bị hủy đi.
Hàm này được gọi lần cuối cùng khi
mà một ativity đang kết thúc hay hệ
thống chỉ đang hủy những thực thể của
Activity để tiết kiệm không gian. Có
thể phân biệt 2 trạng thái này bằng hàm
isFinishing().
Có Không
Bảng mô tả lại ý nghĩa các phương thức trong vòng đời của một Activity
Ghi chú cột Có thể hủy (Killable): Ý nghĩa của nó là dù muốn dù không thì hệ thống
có thể “giết” tiến trình đang giữ Activity tại thời điểm sau khi phương thức kết thúc mà
không thực thi dòng mã lệnh cũa một Activity khác. Ba phương thức (onPause(), onStop(),
onDestroy()) có giá trị là Có. Bởi vì onPause() là phương thức đầu tiên của ba phương
thức, nó là phương thức duy nhất bảo đảm được gọi trước khi tiến trình kết thúc trong khi
đó onStop() và onDestroy() thì không. Vì thế, bạn nên dùng onPause() để cập nhật tất cả
dữ liệu mới vừa được thay đổi.
Còn những phương thức được đánh dấu là Không trong cột Có thể hủy (Killable) bảo
đảm tiến trình giữ acitivity khỏi bị “giết” khỏi thời điểm mà chúng được gọi. Mặc dù vậy
một ativity trong tình trạng có thể hủy bắt đầu từ khi onPause() đến onResume(). Nó không
thể bị hủy cho đến khi hàm onPause() kết thúc.
Trang 29
• Tiết kiệm tình trạng của Activity: Khi hệ thống tắt Activity để bảo toàn bộ
nhớ, người dùng mong muốn Activity giữ được trạng thái Activity như lúc
trước khi tắt. Để giữ lại trạng thái trước khi Activity bị tắt, bạn nên dùng
hàm onSaveInstanceState() cho Activity. Android gọi hàm này trước khi
hủy acvitity. Tiếp theo sau đó, để lấy lại trạng thái của Activity thì phải thực
thi hàm onRestoreInstanceState() sau hàm onStart() và hàm onCreate() đã
chạy trước đó. Vì thế ta có thể vừa tái tạo và lưu vết lại trạng thái Activity.
Không giống như hàm onPause() hay những hàm trong vòng đời ứng dụng,
hàm onSaveInstanceState() hay hàm onRestoreInstanceState() không phải
phương thức vòng đời của ứng dụng và không phải lúc nào cũng được gọi
vì không phải lúc nào người dùng cũng muốn lưu vết lại trạng thái của
Activity.
• Phối hợp các activities: khi một Activity khởi động một Activity khác, cả
hai Activity sẽ thay đổi trạng thái của vòng đời của mình. Activity này tạm
dừng và có thể dừng hẳn trong khi cái khác thì mới khởi động. Trong
trường hợp bạn có thể cần phối hợp các Activity này khi mà 2 Activity cùng
nằm trong cùng một tiến trình.
2. Vòng đời Service:
Một service có thể dùng trong 2 cách:
• Nó có thể được khởi động và được cho phép dùng cho đến khi ai đó dừng
hẳn nó hoặc nó tự dừng hẳn. Để khởi động dùng hàm Context.startService()
và dừng hẳn bằng hàm Context.stopService() hoặc tự dừng bằng hàm
Service.stopSelf() hoặc Service.stopSelfResult(). Chú ý là hàm
stopService() chỉ được gọi một lần duy nhất để dừng service trong khi đó
gọi hàm startService() bao nhiêu lần tùy thích.
• Nó có thể được vận hành bằng mã lệnh dùng lớp interface mà nó đã định
nghĩa. Client thiết lập kết nối và dùng kết nối ấy để gọi dịch vụ. Kết nối
được thiết lập bằng cách gọi Context.bindService() và được đóng bởi hàm
Context.unbindService().
Giống như Activity, service có những phương ứng vòng đời của riêng mình mà có
thể thực thi để giám sát sự thay đổi trong trạng thái của nó. Nhưng service có ít hơn và
gồm có 3 phương thức public: void onCreate(), void onStart(Intent intent), void
onDestroy().
Bằng cách thực thi những phương thức này, bạn có thể giám sát vòng đời của
service:
• Toàn bộ vòng đời của service xảy ra khi gọi hàm onCreate() và kết thúc khi
gọi hàm onDestroy(). Giống như một Activity, một service khởi động trong
hàm onCreate() và giải phóng mọi tài nguyên trong hàm onDestroy().
• Vòng đời “có hiệu lực” của service bắt đầu khi gọi hàm onStart(). Và không
được kết thúc bằng onStop() vì hàm này không có thực.
Phương thức onCreate() và onDestroy() được gọi cho tất cả dịch vụ cho dù service
khởi động bằng hàm Context.startService() hay hàm Context.bindService(). Tuy nhiên,
onStart() được gọi khi service đã khởi động bằng hàm startService(). Nếu một service cho
phép những service khác liên kết với nó thì phải dùng các phương thức sau: IBinder
onBind(Intent intent), boolean onUnbind(Intent intent), void onRebind(Intent intent).
Hình sau mô tả các phương thức cho service, Mặc dù, hình chia ra 2 loại service
dựa trên tiêu chí khởi động bởi hàm startService (0 và hàm bindService(). Cho dù nó khởi
Trang 30
động bằng cách nào đi chăng nữa, thì nó vẫn cho client kết nối tới nó và bất kì service nào
cũng có thể gọi 2 hàm onBind() và onUnbind().
Hình: Vòng đời của 1 Service
3. Vòng đời Broadcast Recievers:
Broadcast receiver có một hàm cho phép người dùng viết lại là hàm void
onCreate(Context curContext, Intent broadcastMsg).
Khi một tin nhắn phát đi cho người nhận, Android gọi phương thức onReceive và
chuyển nó cho đối tượng Intent đang chứa tin nhắn. Broadcast receiver được xem là có
hiệu lực chỉ khi nào có đang thực thi phương thức này. Khi phương thức onReceive() kết
thúc thì broadcast receiver không còn hiệu lực nữa.
Một tiến trình với một broadcast receiver thì được bảo vệ khỏi bị “giết”. Nhưng một
tiến trình với các thành phần không còn hiệu lực (Activity, service,…) thì bị hệ thống
“giết” bất kì lúc nào khi mà bộ nhớ không đủ cho kác tiến trình khác.
4. Life cycles and process
Hệ thống Android duy trì một tiến trình ứng dụng càng lâu càng tốt nhưng nó
sẽ loại bỏ các tiến trình cũ khi mà bộ nhớ thấp. Để quyết định tiến trình nào được giữ lại,
Trang 31
tiến trình nào bị “giết” đi, Android đặt mỗi tiến trình vào một “hệ thống cấp bậc quan
trọng” dựa trên các thành phần đang chạy trên nó và trạng thái của các thành phần đó.
Những tiến trình với độ quan trọng thấp bị loại bỏ đi đầu tiên, sau đó tới lượt các tiến trình
có độ ưu tiên thấp hơn và cứ như vậy. Có 5 cấp trong hệ thống cấp bậc gồm các cấp bậc
sau:
• Tiến trình nền: là tiến trình người dùng đang làm việc. Một tiến trình được
xem là tiến trình nền nếu có bất kì điều kiện sau đây:
• Nó đang chạy một activty mà người dùng đang tương tác.
• Giữ một service mà được liên kết với Activity mà người dùng đang
tương tác.
• Có đối tượng Service mà đang thực thi một trong những phương thức
onCreate(), onStart(), onDestroy().
• Có đối tượng BroadcastReceiver mà đang thực thi hàm onReceive().
• Chỉ có một vài tiến trình ngầm sẽ tồn tại tại bất kì thời gian nào. Chúng
chỉ bị “giết đi” khi nằm cuối “bảng tổng sắp” nếu bộ nhớ quá thấp đến
nỗi chúng không thể tiếp tục chạy được nữa.
• Tiến trình nhìn thấy được: là tiến trình không có các thành phần nền nhưng
vẫn có thể ảnh hưởng đến những gì mà người dùng thấy trên màn hình. Một
tiến trình được xem như là thấy nếu thỏa cả hai điều kiện sau:
• Nó giữ một acitivity mà không phải acitivity nền nhưng vẫn nhìn thấy
được đối với người dùng. Điều này xảy ra khi Activity hiện tại là một
hộp thoại và Activity trước đó có thể nhìn thấy được do hộp thoại
không che hết màn hình.
• Nó giữ một service mà đang kết nối tới một Activity nhìn thấy được.
• Tiến trình dịch vụ: là tiến trình chạy một service mà được bắt đầu bởi hàm
startService() mà nó không rơi vào 2 trạng thái trên. Mặc dù tiến trình dịch
vụ không liên quan gì tới bất kì cái gì mà người dùng thấy, nhưng nó làm
những thứ mà người dùng quan tâm đến chẳng hạn chơi nhạc mp3 ngầm, và
vì thế hệ thống giữ cho chúng chạy nếu đủ bộ nhớ để duy trì 2 tiến trình
trên.
• Tiến trình ngầm: là tiến trình giữ một Activity mà người dùng không nhìn
thấy được. Những tiến trình này không ảnh hưởng trực tiếp lên người dùng, nó
có thể bị “giết” bất kì lúc nào để dành bộ nhớ cho 3 dạng tiến trình trên.
• Tiến trình rỗng là tiến trình không giữ bất cứ một ứng dụng nào cả. Chỉ có
một lí do để giữ những tiến trình như vậy là xem nó như là một vùng đệm để cải
thiện tốc độ thời gian khởi động vào lần tới khi mà các thành phần cần nó để
chạy nhanh hơn. Hệ thống thường “giết” các tiến trình này để mà cân bằng tài
nguyên hệ thống giữa vùng đệm tiến trình và vùng đệm lõi bên dưới thiết bị.
Android xếp hạng các tiến trình từ cao đến thấp dựa trên mức độ quan trọng của
các thành phần hiện đang có hiệu lực trong tiến trình. Thêm vào đó, thứ hạng các tiến trình
có thể tăng lên bởi vì các tiến trình khác phụ thuộc vào nó. Một tiến trình mà phục vụ cho
tiến trình khác có thể không bao giờ được sắp thấp hơn tiến trình mà nó đang phục vụ. Ví
dụ tiến trình A đang phục vụ cho B thì thứ hạng A luôn cao hơn B.
Trang 32
CHƯƠNG IV: CÁC THÀNH PHẦN GIAO DIỆN TRONG ANDROID
1. View:
Trong một ứng dụng Android, giao diện người dùng được xây dựng từ các đối tượng
View và ViewGroup. Có nhiều kiểu View và ViewGroup. Mỗi một kiểu là một hậu duệ
của class View và tất cả các kiểu đó được gọi là các Widget.
Tất cả mọi widget đều có chung các thuộc tính cơ bản như là cách trình bày vị trí,
background, kích thước, lề… Tất cả những thuộc tính chung này được thể hiện hết ở trong
đối tư ợng View.
Trong Android Platform, các screen luôn được bố trí theo một kiểu cấu trúc phân cấp
như hình dưới. Một screen là một tập hợp các Layout và các widget được bố trí có thứ tự.
Để thể hiện một screen thì trong hàm onCreate của mỗi Activity cần phải được gọi một
hàm là setContentView(R.layout.main), hàm này sẽ load giao diện từ file XML lên để
phân tích thành mã bytecode.
Hình: Cấu trúc một giao diện ứng dụng Android
2. View Group:
ViewGroup thực ra chính là View hay nói đúng hơn thì ViewGroup chính là các
widget Layout được dùng để bố trí các đối tượng khác trong một screen. Có một s ố loại
ViewGroup như sau:
2.1 LinearLayout
LinearLayout được dùng để bố trí các thành phần giao diện theo chiều ngang hoặc
chiều dọc nhưng trên một line duy nhất mà không có xuống dòng.
LinearLayout làm cho các thành phần trong nó không bị phụ thuộc vào kích thước
của màn hình. Các thành phần trong LinearLayout được dàn theo những tỷ lệ cân xứng dựa
vào các ràng buộc giữa các thành phần.
Trang 33
Hình: Bố trí các widget sử dụng LinearLayout
2.2 FrameLayout
FrameLayout được dùng để bố trí các đối tượng theo kiểu giống như là các Layer
trong Photoshop. Những đối tư ợng nào thuộc Layer bên dưới thì sẽ bị che khuất bởi các
đối tượng thuộc Layer nằm trên. FrameLayer thường được sử dụng khi muốn tạo ra các đối
tượng có khung hình bên ngoài chẳng hạn như contact image button.
Hình: Bố trí các widget trong FrameLayout
2.3 AbsoluteLayout
Layout này được sử dụng để bố trí các widget vào một vị trí bất kì trong layout dựa
vào 2 thuộc tính toạ độ x, y. Tuy nhiên, kiểu layout này rất ít khi được dùng bởi vì toạ độ
của các đối tượng luôn cố định và sẽ không tự điều chỉnh được tỷ lệ khoảng cách giữa các
đối tượng. Khi chuyển ứng dụng sang một màn hình có kích th ước với màn hình thiết kế
ban đầu thì vị trí của các đối tượng sẽ không còn được chính xác như ban đầu.
2.4 RetaliveLayout
Layout này cho phép bố trí các widget theo một trục đối xứng ngang hoặc dọc. Để
đặt được đúng vị trí thì các widget cần được xác định một mối ràng buộc nào đó với các
widget khác. Các ràng buộc này là các ràng buộc trái, phải, trên, dưới so với một widget
Trang 34
hoặc so với layout parent. Dựa vào những mối ràng buộc đó mà RetaliveLayout cũng
không phụ thuộc vào kích thước của screen thiết bị. Ngoài ra, nó còn có ưu điểm là giúp
tiết kiệm layout sử dụng nhằm mục đích giảm lượng tài nguyên sử dụng khi load đồng
thời, đẩy nhanh quá trình xử lý.
Hình: Bố trí widget trong RetaliveLayout
2.5 TableLayout
Layout này được sử dụng khi cần thiết kế một table chứa dữ liệu hoặc cần bố trí các
widget theo các row và column. Chẳng hạn như, giao diện của một chiếc máy tính đơn
giản hoặc một danh sách dữ liệu.
Hình: Bố trí widget trong TableLayout
3. Button:
Sở dĩ widget button được giới thiệu đầu tiên trong số các widget khác là vì đây là đối
tượng có thể nói là được dùng nhiều nhất trong hầu hết các ứng dụng Android.
Để thiết kế giao diện với một button ta có 2 cách như sau:
• Thiết kế bằng XML:
Trang 35
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/cmdButton1"
android:text="Touch me!"
android:onClick="touchMe"/>
Thuộc tính android:onClick="touchMe" được dùng để nắm bắt sự kiện click
vào button. Khi sự kiện click button xảy ra thì phương thức “touchMe” được khai
báo trong thẻ thuộc tính sẽ được gọi. Nếu trường hợp phương thức “touchMe”
chưa được khai báo trong file mã nguồn tương ứng thì sẽ phát sinh một exception.
Ngược lại, phương thức “touchMe” sẽ nhận được một đối tham biến là đối tượng
View nơi đã phát sinh ra sự kiện. Đối tượng View này có thể ép kiểu trực tiếp sang
kiểu Button vì thực chất nó là một button.
VD: trong file mã nguồn khai báo một hàm như sau:
public void touchMe(View v)
{
Button me = (Button) v;
Me.setText(“Touched”);
}
• Thiết kế bằng code:
Thực ra mà nói thì nếu không phải đòi hỏi phải custom lại một widget thì
không cần phải sử dụng tới code. Trong một số trường hợp bắt buộc chúng ta
phải custom các widget để cho phù hợp với hoàn cảnh. Chẳng hạn như trong
game, các menu hay các nút điều khiển,…
Để khai báo một Button trong code ta làm như sau:
Button cmdButton = new Button(this);
cmdButton.setText(“Touch Me!”);
cmdButon.setOnClickListener(…);
Để custom một widget nào đó ta phải tạo một class kế thừa từ class Widget
muốn custom, sau đó sử dụng hàm draw để vẽ lại widget đó như m ột Canvas.
VD: canvas.drawPicture(Picture.createFromStream(...));
4. ImageButton:
Cũng tương tự như Button, ImageButton chỉ có thêm một thuộc tính android: src =
“@drawable/icon” để thêm hình ảnh vào và không có thẻ text.
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/cmdButton1"
android:src="@drawable/icon"
android:onClick="touchMe"/>
Hình: ImageButton
5. ImageView:
Trang 36
Được dùng để thể hiện một hình ảnh. Nó cũng giống như ImageButton, chỉ khác là
không có hình dáng của một cái button.
Hình: ImageView và ImageButton
6. ListView:
Được sử dụng để thể hiện một danh sách các thông tin theo từng cell. Mỗi cell thông
thường được load lên từ một file XML đ ã được cố định trên đó số lượng thông tin và loại
thông tin cần được thể hiện.
Để thể hiện được một list thông tin lên một screen thì cần phải có 3 yếu tố chính:
• Data Source: Data Source có thể là một ArrayList, HashMap hoặc bất kỳ một
cấu trúc dữ liệu kiểu danh sách nào.
• Adapter: Adapter là một class trung gian giúp ánh xạ dữ liệu trong Data
Source vào đúng vị trí hiển thị trong ListView. Chẳng hạn, trong Data Source
có một trường name và trong ListView cũng có một TextView để thể hiện
trường name này. Tuy nhiên, ListView sẽ không thể hiển thị dữ liệu trong Data
Source lên được nếu như Adapter không gán dữ liệu vào cho đối tượng hiển thị.
• ListView: ListView là đối tượng để hiển thị các thông tin trong Data Source ra
một cách trực quan và người dùng có thể thao tác trực tiếp trên đó.
Trang 37
Hình: Minh hoạ cho một ListView
7. TextView:
TextView ngoài tác dụng là để hiển thị văn bản thì nó còn cho phép định dạng nội dung
bằng thẻ html.
VD:
TextView textView = (TextView)findViewById(R.id.textView);
CharSequence styledText =
Html.fromHtml("<i>This</i> is some <b>styled</b> <s>text</s>");
textView.setText(styledText);
Nội dung TextView cũng có thể được định dạng bằng thẻ html ngay trong XML.
8. EditText:
Trong Android đối tượng EditText được sử dụng như một TextField hoặc một
TextBox.
<EditText
android:id="@+id/EditText01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textStyle="bold"
android:textSize="20dip"
android:textColor="#000000"
android:text="Hello Android!"
android:singleLine="true"
android:inputType="textCapWords"/>
Các thuộc tính cần chú ý sử dụng EditText đó là:
• android:inputType = “…” sử dụng để xác định phương thức nhập
cho EditText. Chẳng hạn như khi bạn muốn một ô để nhập password hay
một ô để nhập Email thì thuộc tính này sẽ làm điều đó.
• android:singleLine = “true” EditText của bạn sẽ trở thành một
TextField, ngược lại sẽ là TextBox.
9. CheckBox:
Nhận 2 giá trị true ho ặc false. Đối tượng CheckBox cho phép chọn nhiều item cùng một
lúc.
Khai báo: CheckBox cb = new CheckBox(Context …);
XML:
<CheckBox
android:id="@+id/CheckBox01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Check me"
android:checked="true"/>
10. MenuOptions:
Có 2 cách tạo một MenuOptions:
• Tạo bằng code:
public class Main extends Activity {
private int searchBtnId = Menu.FIRST;
private int scheduleBtnId = Menu.FIRST + 1;
Trang 38
private int playBtnId = Menu.FIRST + 2;
private int stopBtnId = Menu.FIRST + 3;
private int group1Id = 1;
private int group2Id = 2;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setContentView(R.layout.main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
menu.add(group1Id,searchBtnId ,searchBtnId,"Search");
menu.add(group2Id,scheduleBtnId,scheduleBtnId,R.string.schedule);
menu.add(group2Id,playBtnId ,playBtnId,"Play");
menu.add(group2Id,stopBtnId ,stopBtnId,R.string.stop);
// the following line will hide search
// when we turn the 2nd parameter to false
menu.setGroupVisible(1, false);
return super.onCreateOptionsMenu(menu);
}
}
Hình: Minh hoạ option menu
• Tạo bằng XML
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:icon="@drawable/icon" android:title="Item1"
android:orderInCategory="1" android:id="@+id/item1">
<item android:title="Item 2" android:id="@+id/item2"
android:orderInCategory="2">
<menu>
<item android:id="@+id/item01" android:title="Sub item 1"
android:orderInCategory="1/>
<item android:title="Sub item 2" android:id="@+id/item02"
android:orderInCategory="2"/>
Trang 39
</menu>
</item>
</menu>
public boolean onCreateOptionsMenu(Menu menu) {
new MenuInflater(
getApplication()).inflate(R.menu.menu_options, menu);
return super.onCreateOptionsMenu(menu);
}
11. ContextMenu:
ContextMenu được sử dụng để hiển thị các tuỳ chọn khi người dùng nhấn dài vào một
cell nào đó trong ListView. Để tạo một ContextMenu ta cũng có 2 cách giống như tạo
MenuOptions ở trên chỉ khác tên phương thức.
Khi nhấn dài vào một cell trong ListView thì phương thức:
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo)
sẽ được gọi và truy ền vào 3 tham số là:
 ContextMenu: đối tượng để add các context menu item
 View: Đối tượng nơi mà xảy ra sự kiện
 ContextMenuInfo: Cho biết vị trí xảy ra sự kiện trong ListView. Để biết
được vị trí xảy ra sự kiện ta làm như sau:
AdapterView.AdapterContextMenuInfo info;
try {
info = (AdapterView.AdapterContextMenuInfo) menuInfo;
} catch (ClassCastException e) {
return;
}
info.position
Hình: Minh Họa Context Menu
12. Quick Search Box:
Trang 40
Một trong những tính năng mới trong phiên bản Android 1.6 đó là Quick Search Box.
Đây là khuôn khổ tìm kiếm mới trên toàn h ệ thống Android, điều này làm cho người dùng
có thể nhanh chóng tìm kiếm bất c ứ thứ gì có trên chiếc điện thoại Android của họ và cả
các tài nguyên trên web khi họ đang online. Nó tìm kiếm và hiển thị kết quả tìm kiếm ngay
khi bạn đang gõ. Nó cũng cung cấp các kết quả từ các gợi ý tìm kiếm web, danh sách
doanh nghiệp địa phương, và thông tin khác từ Google, chẳng hạn như báo giá cổ phiếu,
thời tiết, và tình trạng chuyến bay. Tất cả điều này có sẵn ngay từ màn hình chủ, bằng cách
khai thác trên Quick Search Box (QSB).
Hình: Minh họa Quick Search Box
13. Activity và Intend:
13.1 Activity:
Activity là một thành chính của một ứng dụng Android, được dùng để hiển thị một
màn hình và nắm bắt các hoạt động xảy ra trên màn hình đó. Khi làm việc với Activity cần
nắm bắt được một số kiến thức cơ bản như sau:
 Chu kỳ sống của một Activity
 Tạo menu và dialog
 Khởi động một Activity:
Để khởi động một Activity ta sử dụng Intend sẽ tìm hiểu kỹ hơn ở phần b. Tuy
nhiên, trong phần này tôi sẽ hướng dẫn cách chuy ển giữa các Intend theo 2 loại:
• Khai báo tường minh:
Cung cấp chính xác thông tin của activity cần gọi b ằng cách truy ền vào
tên class của Activity đó
VD: Từ Activity A muốn chuy ển qua Activity B ta khai báo một Intend
trong Activity A:
Intend intend = new Intend(this, B.class);
startActivity(intend);
• Khai báo không tường minh:
Trang 41
Cung cấp các thao tác cần làm gì với loại dữ liệu nào, hệ thống sẽ tìm
đến activity tương ứng để khởi động.
Intent i = new Intent();
i.setAction(Intent.ACTION_VIEW);
i.setData(Uri.withAppendedPath(
android.provider.Contacts.People.CONTENT_URI, "1));
startActivity(i);
 Tính liên lạc giữa 2 activity:
Khi chuyển sang một Activity khác ta có th ể gửi kèm dữ liệu trong
intend đó như sau:
intend.putExtra(“key1”, “value1”);
intend.putExtra(“key2”, 23);
Bên phía Activity được khởi động hay được chuy ển đế n, có thể lấy dữ
liệu được gửi như sau:
getIntend().getExtra().getString(“key1”);
getIntend().getExtra().getInt(“key2”);
 Task:
Android là một hệ điều hành đa tiến trình. Khi lập trình trên nền tảng
Android thì tiến trình là một vấn đề cần phải được chú ý nhiều nhất. Mặc
dù Android hỗ trợ đa tiến trình nhưng trên một thiết bị di động với c ấu
hình thấp mà chúng ta quá lạm dụng tiến trình thì sẽ rất tốn bộ xử lý điều
này cũng đồng nghĩa với việc bạn đang biến ứng dụng của bạn trở thành
một thứ phần mềm tiêu thụ điện năng.
13.2 Intent:
 Khái niệm Intent:
 Là một cấu trúc dữ liệu mô tả cách thức, đối tượng thực hiện của một
Activity
 Là cầu nối giữa các Activity: ứng dụng Android thường bao gồm nhiều
Activity, mỗi Activity ho ạt động độc lập với nhau và thực hiện những
công việc khác nhau. Intent chính là người đưa thư, giúp các Activity có
thể triệu gọi cũng như truyền các dữ liệu cần thiết tới một Activity khác.
Điều này cũng giống như việc di chuy ển qua lại giữa các Forms trong lập
trình Windows Form.
Hình: truyền dữ liệu giữa 2 Activity
 Dữ liệu Intent:
 Intent về cơ bản là một cấu trúc dữ liệu, được mô tả trong lớp
android.content.Intent
Trang 42
 Các thuộc tính của một đối tượng Intend:
Thuộc Tính Chính Thuộc Tính Phụ
action
_ tên (string) của action mà Intent sẽ yêu
cầu thực hiện
_ có thể là Action được Android định nghĩa
sẵn (built-in standard action) hoặc do người
lập trình tự định nghĩa
category
_ thông tin về nhóm action
type
_ định dạng kiểu dữ liệu (chuẩn MIME)
_ thường được tự động xác định
data
_ dữ liệu mà Activity được gọi sẽ xử lí
_ định dạngUri (thong qua hàm
Uri.parse(data))
component
_ chỉ định cụ thể lớp sẽ thực thi Activity
_ khi được xác định, các thuộc tính khác trở
thành không bắt buộc (optional)
extras
_ chứa tất cả các cặp (key, value) do ứng
dụng thêm vào để truyền qua Intent (cấu
trúc Bundle)
http://developer.android.com/reference/android/content/Intent.html
Hình: Các thuộc tính của Intent
Các Action được định nghĩa sẵn:
Dưới đây là những hằng String đã được định nghĩa sẵn trong lớp Intent. Đi kèm với
nó là các Activity hay Application được xây dựng sẵn sẽ được triệu gọi mỗi khi Intent
tương ứng được gửi (tất nhiên khi được cung cấp đúng data). VD: Gọi tới một số điện
thoại:
Intent dialIntent =
new Intent(Intent.ACTION_DIAL, Uri.parse("tel:123456"));
startActivity(dialIntent);
Hình: Các Action đã được định nghĩa sẵn trong Intent
Trang 43
CHƯƠNG V: PHÂN TÍCH VÀ THIẾT KẾ HỆ THỐNG
1. Đặc tả bài toán:
Đối với mọi chiếc điện thoại di động Contact là ứng dụng không thể thiếu, dùng để
quản lý danh bạ điện thoại, thông tin của những cá nhân cần liên lạc trong danh bạ. Trong
Android trên phiên bản mới nhất hiện nay cũng đã có hỗ trợ ứng dụng Contact với nhiều
chức năng cơ bản giống các ứng dụng thông thường khác trên các điện thoại di động.
Ngoài ra, còn có một số chức năng nổi trội như:
 Hỗ trợ kết nối với ứng dụng Map, có thể định vị người cần liên lạc thông qua
địa chỉ được lưu trong Contact.
 Cho phép lưu trữ nhiều số điện thoại, email, address của người dùng trong
Contact.
 Cho phép đồng bộ hoá giữa các contact trong điện thoại và trong tài khoản
Gmail và tài khoản trên mạng xã hội facebook.
Mặc dù, ứng dụng contact của Android đã cung cấp khá nhiều chức năng nhưng
ứng dụng này vẫn còn nhiều hạn chế, đặc biệt thiếu nhiều chức năng cơ bạn như quản lý
Group, xác lập lại số điện thoại chính hay Email chính. Ngoài ra, với một số người sử dụng
thì thông tin lưu trong Contact cũng rất quan trọng. Đề phòng mất điện thoại hay tránh để
người khác truy cập vào những thông tin khác được lưu trong điện thoại hoặc khi bị mất
các contact do các tác động ngoại cảnh hoặc khi thay số thuê bao. Do đó, ứng dụng
PhoneBookSafeManager phát triển trên nền tảng ứng dụng Contact sẵn có trong Android,
sẽ đáp ứng nhu cầu bảo mật thông tin cá nhân được lưu trong Contact, đồng thời cải tiến
một vài chức năng khác còn hạn chế của ứng dụng Contact trong Android nhằm giúp cho
người dùng có thể yên tâm contact của họ được bảo vệ an toàn.
Kết luận: bài toán đặt ra cho chúng ta là: Xây dựng một ứng dụng cho phép người
sử dụng điện thoại Android quản lý các contact của họ một cách an toàn, hiệu quả, dễ dàng
chia sẽ, dễ dàng quản lý và tìm kiếm.
2. Đặc tả chức năng:
2.1Upload phone book:
 Mô tả chức năng:
Chức năng upload phone book cho phép người dùng lưu trữ toàn bộ sổ contact của họ vào
tài khoản online. Tuy nhiên, một số thông tin ít sử dụng sẽ được lược bỏ bớt nhằm giảm
kích thước của nội dung XML khi đóng gói.
 Mô tả hoạt động:
1. Đọc tất cả các thông tin trong phone book và lưu vào một list các contacts.
2. Phân tích list các contact đó thành nội dung XML dựa vào kỹ thuật XStream.
3. Kết nối tới webservice và gửi nội dung XML kèm theo các thông tin tài khoản
người dùng cần thiết.
4. Webservice lưu nội dung XML vào đúng tài khoản người dùng.
5. Webservice trả về một thông điệp thông báo là đã lưu hoặc nếu không lưu được.
Trang 44
Hình: Quá trình upload nội dung XML tới Webserver bằng giao thức SOAP.
2.2Revert phone book:
 Mô tả chức năng:
Cho phép người dùng có thể lấy lại các bản phone book mà đã từng upload trước đây.
 Mô tả hoạt động:
1. Người dùng chọn phiên bản cần upload.
2. Ứng dụng gửi ID của phiên bản và thông tin về tài khoản người dùng tới
webservice.
3. Webservice chịu trách nhiệm tìm kiếm dữ liệu tương ứng với ID mà người dùng
đã gửi.
4. Ứng dụng nhận dữ liệu trả về từ webservice và phân tích nội dung XML thành
một list contact.
5. Cảnh báo người dùng trước khi thay thế phone book.
6. Ghi các dữ liệu trong phiên bản lấy về vào điện thoại.
Hình: Mô tả quá trình revert phone book
2.3 Send contact:
 Mô tả chức năng:
Cho phép người dùng gửi một ho ặc nhiều contact tới một hoặc nhiều người khác cũng có
tài khoản của ứng dụng.
 Mô tả hoạt động:
1. Chuyển đổi các contact cần gửi thành nội dung XML.
2. Gửi yêu cầu tới webservice kèm theo nội dung XML, thông tin tài khoản và các
thông tin cần thiết khác.
Webservice gửi nội dung XML vào contact box c ủa người nhận và trả về thông điệp nếu
gửi thành công.
2.4 Reveive contact:
• Mô tả chức năng:
Thông báo tới người dùng nếu có ai đó gửi contact tới tài khoản của họ bằng một thông
điệp. Đồng thời, người dùng cũng có thể xem và lưu các contact hoặc gỡ bỏ chúng.
Trang 45
Hình: Quá trình gửi và nhận contact
2.5 Export contact tới SD Card:
• Mô tả chức năng:
Chức năng export to an SD Card cho phép người dùng chia sẻ hoặc backup các contact của
họ vào thẻ nhớ dưới dạng XML. Khi người dùng cần chia sẻ họ có thể trao đổi thông qua
thẻ nhớ hoặc có thể gửi file XML này đi bất kỳ đâu và người nhận có thể phân tích file
XML này thành các contact như cũ.
Hình: Quá trình lưu contact xuống SD Card
2.6Import contact từ SD Card:
• Mô tả chức năng:
Ngược lại với chức năng export to SD Card thì chức năng này được dùng để phân tích
ngược lại từ một file XML thành các contact.
Hình: Quá trình đọc contact từ SD Card
Trang 46
2.7 Account Manager:
2.7.1 Login:
• Mô tả chức năng:
Chức năng login không phải được thiết kế để bảo vệ hệ thống mà chủ yếu là sử dụng để
quản lý người dùng và dữ liệu người dùng trên server. Khi người dùng login thì username
and password sẽ được lưu lại để làm chìa khoá liên lạc với server, đảm bảo rằng dữ liệu
được an toàn và dễ dàng truy xuất. Hay nói cách khác mỗi username là một định danh giúp
server quản lý được dữ liệu của họ.
2.7.2 Change password:
• Mô tả chức năng:
Chức năng này giúp người dùng quản lý an toàn hơn tài khoản của họ. Để sử dụng được
chức năng này bắt buộc người dùng phải đăng nhập vào tài khoản cũ.
Sau người dùng touch chọn passowrd mới thì ứng dụng sẽ gửi password mới và các thông
tin người dùng lên web service và web service sẽ thực hiện việc hay đổi password.
2.7.3 Restore account:
• Mô tả chức năng:
Khi quên username hoặc password thì người dùng có thể sử dụng chức năng này để khôi
phục lại tài khoản của họ. Ứng dụng sẽ bắt buộc người dùng phải nhập một email dự
phòng trong khi tạo tài khoản để ứng dụng có thể gửi tài khoản của họ vào email đó.
Dưới đây là qui trình khôi phục tài khoản của người dùng:
Hình: Quá trình khôi phục tài khoản người dùng
2.7.4 Create account:
Thay vì phải tạo tài khoản trên một trang web, điều này sẽ không đảm bảo an toàn và
thực sự là một phiền phức không cần thiết. Do đó, ứng dụng cung cấp chức năng tạo tài
khoản ngay trên màn hình đăng nhập của ứng dụng nhằm tạo điều kiện thuận lợi nhất đối
Trang 47
với người dùng. Để tạo tài khoản người dùng cần nhập các thông tin: Username,
Password, Confirm password, Email.
3. Các biểu đố hệ thống:
3.1Biểu đồ Usercase:
Mô hình usercase dưới đây thể hiện cho số lượng chức của hệ thống mà người dùng có thể
tương tác đư ợc trực tiếp.
Hình: Sơ đồ Use Case tổng quát
3.1.1 Restore account:
Hình: Usercase khôi phục tài khoản
3.1.2 Export Contact vào SD Card:
Hình: Usercase Export contact từ sd card
3.1.3 Import Contact từ SD Card:
Trang 48
Hình: Usercase Import contact từ sd card
3.1.4 Login:
Hình: Usercase chức năng Login
3.2 Biểu đồ lớp:
3.2.1 Biểu đồ lớp giữa các thành phần giao diện:
3.2.2 Biểu đồ lớp Contact:
Trang 49
3.2.3 Biểu đồ lớp ContactProvider:
3.2.4 Class Webservice:
3.3Biểu đồ tuần tự:
3.3.1 Login:
Trang 50
Bước 1: Người dùng nhập username, password và nhấn nút login
Bước 2: Chức năng Login thực hiện triệu gọi hàm CheckLogin trên webservice và truyền
các tham số username, password vào.
Bước 3: Hàm CheckLogin truy vấn vào CSDL để kiểm tra username và password có tồn
tại hay không.
Bước 4, 5, 6: Trả về kết quả valid, invalid hoặc exception do lỗi kết nối.
3.3.2 Create new account:
Bước 1: Người dùng nh ập username, password, confirm password, email.
Bước 2: Kiểm tra thông tin nhập vào có hợp lệ hay không.
Bước 3: Triệu gọi hàm tạo tài khoản trên web service. Đồng thời, gửi lên các tham số
tương ứng.
Bước 4: Hàm tạo tài khoản trên web service sẽ thực hiện lệnh SQL để insert thông tin tài
kho ản mới vào.
Bước 5, 6: Trả về kết quả của quá trình tạo tài khoản cho người dùng bằng một message.
3.3.3 Restore account:
Trang 51
Bước 1: Người dùng nhập địa chỉ email dự phòng đã được nhập trong quá trình tạo tài
khoản trước đây.
Bước 2: Kiểm tra biểu thức email có chính xác hay không. Bước này nhằm mục đích giảm
thời gian kiểm tra trên server nếu như email không chính xác.
Bước 3: Triệu gọi từ xa hàm RestoreAccount trên web service.
Bước 4: Thực hiện truy vấn để lấy về thông tin tài kho ản trong CSDL.
Bước 5, 6: Trả thông tin tài khoản về Client.
Bước 7: Client sẽ thực hiện gửi thông tin tài khoản vào email dự phòng của người dùng.
Người dùng sẽ truy cập email dự phòng của họ để xem lại thông tin tài khoản và có thể
đăng nhập lại để đổi thông tin tài khoản.
3.3.4 Upload phone book:
Bước 1, 2: Đọc tất cả các Contact trong phone book và lưu vào một list
Bước 3: Chuy ển đổi Contact list thành XML
Trang 52
Bước 4, 5: Triệu gọi hàm BackupConatct trên Webservice và truy ền vào các tham số là
các thông tin upload, UserID, hàm này sẽ thực hiện chèn dữ liệu vào CSDL tương ứng với
tài kho ản của người dùng.
Bước 6, 7: Trả về kết qu ả là đ ã upload thành công hay không.
3.3.5 Revert phone book:
Bước 1, 2: Đọc tất cả các Contact trong phone book và lưu vào một list
Bước 3: Chuy ển đổi Contact list thành XML
Bước 4, 5: Triệu gọi hàm BackupConatct trên Webservice và truy ền vào các tham số là
các thông tin upload, UserID, hàm này sẽ thực hiện chèn dữ liệu vào CSDL tương ứng với
tài kho ản của người dùng.
Bước 6, 7: Trả về kết qu ả là đ ã upload thành công hay không.
3.3.6 Export Contact to SD Card:
3.3.7 Import Contact from SD Card:
Trang 53
Bước 1, 2: Đọc file từ SD Card.
Bước 3, 4: Convert nội dung XML đ ã được đọc từ file thành Contact list và ghi các
Contact đó vào phone book trong điện thoại Android.
3.3.8 Send Contact:
Biểu đồ sequence send Contact thể hiện ở mức hệ thống quá trình gửi các Contact
tới một tài khoản nào đó cũng được quản lý bởi h ệ thống.
Để tiết kiệm bộ nhớ, khi hiển thị một Contact list nào đó thì chỉ những thông tin
cần hiển thị được load vào bộ nhớ còn những thông tin khác thì không được load. Vì vậy,
để gửi các Contact tới một người dùng nào đó ứng dụng sẽ thực hiện qua các bước như
biểu đồ được mô tả chi tiết sau:
Trang 54
Bước 1, 2, 3, 4: Đọc các thông tin đầy đủ của các Contact đã được chọn và trả về một
Contact list.
Bước 5, 6: Convert Contact list thành nội dung XML và triệu gọi từ xa hàm SendContact
từ web service. Đồng thời truy ền vào các tham số là nội dung cần gửi và các thông tin cần
thiết như ngư ời gửi, người nhận, ngày gửi, …
Bước 7: Add nội dung gửi và các thông tin gửi vào một table. Từ table này tất cả các
người dùng sẽ truy cập vào và lấy các dữ liệu của họ.
Bước 8, 9: Trả về một thông điệp thông báo cho người dùng biết là đ ã gửi được hay chưa
cũng như các trường hợp lỗi.
3.4Biểu đồ hoạt động:
3.4.1 Change password:
3.4.2 Export Contact to SD Card:
Trang 55
3.4.3 Import Contact from SD Card
3.4.4 Upload phone book:
Trang 56
3.4.5 Send Contact:
3.4.6 Revert phone book:
Trang 57
4. Cơ sở dữ liệu Web Service:
 Bảng ACCOUNTS:
Được dùng để lưu trữ thông tin tài khoản người dùng.
Thuộc tính của các field như sau:
Trang 58
Field Name Type
USERNAME nvarchar(50)
PASSWORD nvarchar(50)
EMAIL nvarchar(100)
USERID bigint, primary key
 Bảng BACKUP_CONTACT:
Được dùng để lưu trữ các phiên bản phone book của người dung
Thuộc tính:
Field Name Type
CONTENT_BACKUP xml
USERID bigint
NOTE nvarchar(MAX), allow null
DATE nvarchar(30)
TIME nvarchar(30)
VERSION_ID bigint, primary key
 Bảng MYUSERNAME:
Được dùng để lưu trữ tên tài kho ản của những người bạn có sử dụng hệ thống phone book
safe. Cũng giống như khi chat yahoo hoặc skype thì đều có một contact list nhằm giúp bạn
dễ dàng quản lý và tìm kiếm khi cần.
Thuộc tính:
Field Name Type
USERID bigint
DISPLAY_NAME nvarchar(100), allow null
USERNAME nvarchar(50)
IMAGE image, allow null
ID bigint
 Bảng SHARE:
Khi một user nào đó gửi dữ liệu tới một người khác thì dữ liệu đó kèm các thông tin liên
quan sẽ được lưu vào bảng này. Các ứng dụng sẽ tự động truy cập vào bảng này để lấy dữ
liệu của user tương ứng.
Thuộc tính:
Field Name Type
USERID bigint
SENDER nvarchar(50)
RECEIVER nvarchar(50)
CONTENT_SENT xml
Trang 59
DATE nvarchar(30)
TIME nvarchar(30)
NOTE nvarchar(MAX), allow null
ID bigint
Trang 60
CHƯƠNG VI: DEMO ỨNG DỤNG
Trang 61
TÀI LIỆU THAM KHẢO
[1] Copyright © 2008 by Chris Haseman. Android Essentials. Appres®
[2] Copyright © 2009 by Mark L.Murphy. Beginning Android. Appress®
[3] Copyright © 2009 by Sayed Y. Hashimi and Satya Komatineni. Pro
Android. Appress ®
[4] Copyright © 2008 by The McGraw-Hill Companies. Android™ A
Programmer’s Guide®
[5] Copyright © 2008 by Ed Burnette. Hello, Android. (Introducing
Google’s Mobile Development Platform)
[6] Copyright © 2009 by W. FRANK ABLESON, CHARLIE COLLINS,
ROBI SEN. Unlocking Android
Trang 62

Android

  • 1.
    BỘ CÔNG THƯƠNG TRƯỜNGĐẠI HỌC CÔNG NGHIỆP TP. HCM KHOA CÔNG NGHỆ THÔNG TIN -----oooooo----- Báo Cáo Đồ Án 2 Tìm Hiểu Hệ Điều Hành Android Và Xây Dựng Ứng Dụng Minh Họa GVHD: Võ SVTH: Trần Minh Nghĩa 09243231 Sengaloun Thammavongsa 09259101 LỚP : DHTH3TLT KHÓA : 3 TP.HCM 03/2013
  • 2.
    LỜI CẢM ƠN Sauquá trình nghiên cứu và tìm hiểu đề tài “Tìm hiểu hệ điều hành Android” đã cơ bản hoàn thành. Để đạt được kết quả này, chúng em đã hết sức nỗ lực đồng thời chúng em đã nhận được rất nhiều sự quan tâm, giúp đỡ và ủng hộ của thầy cô, gia đình và bạn bè. Em xin chân thành cảm ơn các thầy cô trong Khoa Công nghệ Thông Tin cùng các thầy cô giáo trong trường Đại Học Công nghiệp TPHCM đã tận tình giảng dạy, trang bị cho em những kiến thức quý báu trong những năm học tập tại trường. Đặc biệt, em xin chân thành cảm ơn cô ??? đã tận tình hướng dẫn, giúp đỡ, chỉ bảo và đóng góp ý kiến cho chúng em trong suốt thời gian thực hiện đồ án này. Chúng con xin nói lên lòng biết ơn sâu sắc đối với cha mẹ đã chăm sóc, nuôi dạy con nên người và luôn đi bên con trong những lúc khó khăn nhất. Xin cảm ơn các anh chị và bạn bè đã ủng hộ, giúp đỡ và động viên chúng em trong thời gian học tập và nghiên cứu. Mặc dù đã có nhiều cố gắng trong quá trình làm bài, nhưng do thời gian và kinh nghiệm còn hạn chế nên bài làm không thể tránh được thiếu sót, vì vậy em rất mong nhận được sự chỉ bảo của thầy cô và sự đóng góp ý kiến của các bạn để đề tài được hoàn thiện hơn. Em xin được gửi lời cảm ơn tới các thầy cô trong khoa khoa học máy tính trường Đại học Công nghiệp TP.HCM đã tạo điều kiện và mang lại những kiến thức quý báu để em có thể thực hiện đề tài này. Xin cảm ơn cô đã tận tình hướng dẫn và chỉ bảo em trong suốt quá trình làm đồ án chuyên ngành để em có thể hoàn thành tốt đề tài này. Em xin chân thành cảm ơn! Sinh viên thực hiện Trần Minh Nghĩa Trang 2
  • 3.
  • 4.
    NHẬN XÉT CỦAGIÁO VIÊN HƯỚNG DẪN .................................................................................................................................... ..................................................................................................................................... ..................................................................................................................................... ..................................................................................................................................... ..................................................................................................................................... ..................................................................................................................................... ..................................................................................................................................... ..................................................................................................................................... ..................................................................................................................................... ..................................................................................................................................... ..................................................................................................................................... ..................................................................................................................................... ..................................................................................................................................... ..................................................................................................................................... ..................................................................................................................................... ..................................................................................................................................... ..................................................................................................................................... ..................................................................................................................................... Tp. HCM, Ngày....tháng........... năm 2012 Ký tên Võ Thị Trang 4
  • 5.
    NHẬN XÉT CỦAGIÁO VIÊN PHẢN BIỆN .................................................................................................................................... ..................................................................................................................................... ..................................................................................................................................... ..................................................................................................................................... ..................................................................................................................................... ..................................................................................................................................... ..................................................................................................................................... ..................................................................................................................................... ..................................................................................................................................... ..................................................................................................................................... ..................................................................................................................................... ..................................................................................................................................... ..................................................................................................................................... ..................................................................................................................................... ..................................................................................................................................... ..................................................................................................................................... ..................................................................................................................................... ..................................................................................................................................... Tp. HCM, Ngày....tháng........... năm 2012 Ký tên Võ Trang 5
  • 6.
    LỜI NÓI ĐẦU Androidlà một hệ điều hành mã nguồn mở được phát triển dựa trên nhân Linux. Trong một hai năm trở lại đây, sự phát triển của Android đã có những bước phát triển mạnh mẽ và dần chiếm cảm tình của người dùng. Do có lợi thế là được xây dựng theo tiêu chí mở nên việc phát triển ứng dụng trên Android được cho là khá dễ dàng. Tuy nhiên, nguồn tài liệu để lập trình được ứng dụng chạy trên Android khá là rời rạc và chưa có sự sắp xếp và tổ chức tốt. Chính vì thế mà cuốn Phụ lục này được viết ngoài mục đích hỗ trợ cho Khóa luận “Tìm hiểu Hệ điều hành Android và xây dựng ứng dụng minh họa” còn có mục đích cao hơn đó là cung cấp những cái nhìn cơ bản nhất, chung nhất giúp cho người đọc có thể dễ dàng nắm bắt, học hỏi cách thức vận hành cũng như phát triển ứng dụng trên hệ điều hành nhiều tiềm năng này. Do thời gian thực hiện đề tài khá ngắn cho nên việc thiếu sót là một điều không thể tránh khỏi. Nhóm chúng em rất mong được sự góp ý từ Thầy Cô và các Bạn. Nhóm chúng em xin chân thành cảm ơn. Trang 6
  • 7.
    MỤC LỤC LỜI NÓIĐẦU.........................................................................................................6 CHƯƠNG I: TỔNG QUAN VỀ ANDROID.......................................................11 1.Lịch sử hình thành và phát triển Android:.........................................................11 2.Khái niệm hệ điều hành Android:.....................................................................11 3.Các phiên bản Android:....................................................................................12 4.Tính năng của Android:....................................................................................14 5.Kiến trúc Android:............................................................................................14 Hệ điều hành android có 4 tầng từ dưới lên trên là tầng Linux Kernel (Phiên bản 2.6), Tầng Libraries & Android runtime , Tầng Application Framework và trên cùng là tầng Application......................................................................................14 .............................................................................................................................15 5.1 Tầng Linux Kennel:.......................................................................................15 Hệ điều hành android được phát trển dựa trên hạt nhân linux, cụ thể là hạt nhân linux phiên bản 2.6, điều đó được thể hiện ở lớp dưới cùng này. Tất cả mọi hoạt động của điện thoại muốn thi hành được thì đều được thực hiện ở mức cấp thấp ở lớp này bao gồm quản lý bộ nhớ (memory management), giao tiếp với phần cứng (driver model), thực hiện bảo mật (security), quản lý tiến trình (process)...15 Tuy được phát triển dựa vào nhân linux nhưng thực ra nhân linux đã được nâng cấp và sửa đổi rất nhiều để phù hợp với tính chất của những thiết bị cầm tay như hạn chế về bộ vi xử lý, dung lượng bộ nhớ, kích thước màn hình, nhu cần kết nối mạng không dây.......................................................................................15 Tầng này có các thành phần chủ yếu :.................................................................15 Display Driver : Điều khiển việc hiển thị lên màn hình cũng như thu nhận những điều khiển của người dùng lên màn hình (di chuyển, cảm ứng...).............15 Camera Driver : Điều kiển hoạt động của camera, nhận luồng dữ liệu từ camera trả về....................................................................................................................15 Bluetooth Driver : Điều khiển thiết bị phát và thu sóng Bluetooth......................15 USB driver : Quản lý hoạt động của các cổng giao tiếp USB..............................15 Keypad driver : Điều khiển bàn phím..................................................................15 Wifi Driver : Chịu trách nhiệm về việc thu phát sóng wifi.................................16 Audio Driver : điều khiển các bộ thu phát âm thanh, giải mã các tính hiệu dạng audio thành tín hiệu số và ngược lại.....................................................................16 Trang 7
  • 8.
    Binder IPC Driver: Chịu trách nhiệm về việc kết nối và liên lạc với mạng vô tuyến như CDMA, GSM, 3G, 4G, E để đảm bảo những chức năng truyền thông được thực hiện.....................................................................................................16 M-System Driver : Quản lý việc đọc ghi... lên các thiết bị nhớ như thẻ SD, flash .............................................................................................................................16 Power Madagement : Giám sát việc tiêu thụ điện năng.......................................16 5.2 Tầng Library va Android Runtime.................................................................16 5.2.1Library:........................................................................................................16 Thư viện hệ thống (System C library) : thư viện dựa trên chuẩn C, được sử dụng chỉ bởi hệ điều hành.............................................................................................16 Thư viện Media (Media Libraries) : Có nhiều codec để hỗ trợ việc phát và ghi các loại định dạng âm thanh, hình ảnh, video thông dụng....................................16 Thư viện web (LibWebCore) : Đây là thành phần để xem nội dung trên web, được sử dụng để xây dựng phần mềm duyệt web (Android Browse) cũng như để các ứng dụng khác có thể nhúng vào. Nó cực kỳ mạnh, hỗ trợ được nhiều công nghệ mạnh mẽ như HTML5, JavaScript, CSS, DOM, AJAX............................17 Thư viện SQLite : Hệ cơ sở dữ liệu để các ứng dụng có thể sử dụng..................17 ............................................................................................................................17 5.2.2Android Runtime:........................................................................................17 5.3 Tầng Application Framework........................................................................17 Tầng thứ ba là tầng Application Framework. Tầng này được tích hợp sẵn bộ công cụ cơ bản, sử dụng để cung cấp các dịch vụ khác cho các ứng dụng Android. Các nhà phát triển Android có thể sử dụng các dịch vụ cốt lõi để xây dựng một cách sáng tạo và phong phú các ứng dụng Android. Kiến trúc Application Framework được thiết kế giúp đơn giản hóa việc tái sử dụng các thành phần; bất kỳ ứng dụng có thể xuất bản khả năng......................................................................................17 Tầng này xây dựng bộ công cụ - các phần tử ở mức cao để các lập trình viên có thể nhanh chóng xây dựng ứng dụng. Nó được viết bằng Java, có khả năng sử dụng chung để tiết kiệm tài nguyên................................................................17 Đây là một nền tảng mở, điều đó có 2 điều lợi:...................................................17 Với các hãng sản xuất điện thoại : Có thể tùy biến để phù hợp với cấu hình điện thoại mà họ sản xuất cũng như để có nhiều mẫu mã, style hợp thị hiếu người dùng. Vì thế nên tuy cùng chung nền tảng android mà điện thoại của Google có thể khác hẳn với Motorola, HTC, T-Mobile, Samsung.......................................18 Với lập trình viên : Cho phép lập trình viên có thể sử dụng các API ở tầng trên mà không cần phải hiểu rõ cấu trúc bên dưới, tạo điều kiện cho lập trình viên tự do sáng tạo bởi vì chỉ cần quan tâm đến nội dung mà ứng dụng họ làm việc. Một tập hợp API rất hữu ích được xây dựng sẵn như hệ thống định vị, các dịch vụ chạy nền, liên lạc giữa các ứng dụng, các thành phần giao diện cấp cao ......18 Trang 8
  • 9.
    Giới thiệu mộtsố thành phần của phần này :.......................................................18 Activity Manager : Quản lý các chu kỳ sống của một ứng dụng cũng như cung .............................................................................................................................18 cấp công cụ điều khiển các Activity.....................................................................18 Telephony Manager : Cung cấp công cụ để thực hiện việc liên lạc như gọi điện .............................................................................................................................18 thoại.....................................................................................................................18 XMPP Service : Cung cấp công cụ để liên lạc trong thời gian thực.....................18 Location Manager : Cho phép xác định vị trí của điện thoại thoại dựa vào hệ....18 thống định vị toàn cầu GPS và Google Maps.......................................................18 Window Manager : Quản lý việc xây dựng và hiển thị các giao diện người dùng .............................................................................................................................18 cũng như tổ chức quản lý các giao diện giữa các ứng dụng.................................18 Notication Manager : Quản lý việc hiển thị các thông báo (như báo có tin nhắn, .............................................................................................................................18 có e-mail mới..)....................................................................................................18 Resource Manager : Quản lý tài nguyên tĩnh của các ứng dụng bao gồm các file .............................................................................................................................18 hình ảnh, âm thanh, layout, string. (Những thành phần không được viết bởi ngôn .............................................................................................................................18 ngữ lập trình).......................................................................................................18 .............................................................................................................................18 5.4 Tầng Application:..........................................................................................18 Đây là lớp ứng dụng giao tiếp với người dùng, bao gồm các ứng dụng như :......18 Các ứng dụng cơ bản, được cài đặt đi liền với hệ điều hành là gọi điện(phone), quản lý danh bạ(Contacts), duyệt web (Browser), nhắn tin (SMS), lịch làm việc (Calendar), đọc e-mail (Email-Client), bản đồ (Map), quay phim chụp ảnh (camera)...............................................................................................................19 Các ứng dụng được cài thêm như các phần mềm chứng khoán (Stock), các ......19 trò chơi (Game), từ điển.......................................................................................19 Các chương trình có các đặc điểm là :.................................................................19 Viết bằng Java, phần mở rộng là apk...................................................................19 Khi mỗi ứng dụng được chạy, nó có một phiên bản Virtual Machine được dựng lên để phục vụ cho nó. Nó có thể là một Active Program : Chương trình có giao diện với người sử dụng hoặc là một background : chương trình chạy nền hay là dịch vụ. ...............................................................................................................19 Android là hệ điều hành đa nhiệm, điều đó có nghĩa là trong cùng một thời điểm, có thể có nhiều chương trình cùng chạy một lúc, tuy nhiên, với mỗi ứng dụng thì Trang 9
  • 10.
    có duy nhấtmột thực thể (instance) được phép chạy mà thôi. Điều đó có tác dụng hạn chế sự lạm dụng tài nguyên, giúp hệ thống hoạt động tốt hơn.............19 Các ứng dụng được gán số ID của người sử dụng nhằn phân định quyền hạn khi sử dụng tài nguyên, cấu hình phần cứng và hệ thống...........................................19 Android là một hệ điều hành có tính mở, khác với nhiều hệ điều hành di động khác, android cho phép một ứng dụng của bên thứ ba được phép chạy nền. Các ứng dụng đó chỉ có một hạn chế nhỏ đó là nó không được phép sử dung quá 5~10% công suất CPU, điều đó nhằn để tránh độc quyền trong việc sử dụng CPU.....................................................................................................................19 Ứng dụng không có điểm vào cố định, không có phương thức main để bắt đầu..19 CHƯƠNG II: PHÁT TRIỂN ỨNG DỤNG TRÊN ANDROID...........................20 1.Môi trường lập trình Android:..........................................................................20 Trong chương này sẽ giới thiệu các công cụ lập trình cho Android là Eclipse và Android Development Tool plug-in, thông qua Android SDK và công cụ của nó, chạy một ứng dụng Android trên Emulator..........................................................20 1.1 Android SDK:................................................................................................20 Android SDK là công cụ phát triển phần mềm được chính Google xây dựng và phát hành miễn phí đến người lập trình để họ dễ dàng xây dựng và phát triển các ứng dụng chạy được trên hệ điều hành Android..................................................20 1.2 Máy ảo Dalvik...............................................................................................20 1.3 Các gói Java cần thiết:...................................................................................21 2.Các thành phần cơ bản:.....................................................................................22 3.File AndroidMainfest:.......................................................................................22 Broadcast receiver có một hàm cho phép người dùng viết lại là hàm void onCreate(Context curContext, Intent broadcastMsg)........................................31 Khi một tin nhắn phát đi cho người nhận, Android gọi phương thức onReceive và chuyển nó cho đối tượng Intent đang chứa tin nhắn. Broadcast receiver được xem là có hiệu lực chỉ khi nào có đang thực thi phương thức này. Khi phương thức onReceive() kết thúc thì broadcast receiver không còn hiệu lực nữa..........................................................................................................................31 CHƯƠNG IV: CÁC THÀNH PHẦN GIAO DIỆN TRONG ANDROID ........33 Trang 10
  • 11.
    CHƯƠNG I: TỔNGQUAN VỀ ANDROID 1. Lịch sử hình thành và phát triển Android: Tháng 7/2005, Google mua lại công ty phát triển phần mềm điện thoại Android, nhưng chưa công bố sẽ sử dụng cho mục đích gì. Để trả lời cho câu hỏi đó, tháng 11/2007, sau 2 năm phát triển, Google công bố hệ điều hành điện thoại di động mã nguồn mở Android, cùng với sự thành lập “Liên minh di động mở” (Open Handset Alliance) bao gồm hơn 65 nhà sản xuất phần cứng điện thoại lớn trên thế giới như Intel, HTC, China Mobile, T-Mobile,.... Hình 1 - Các thành viên của "Liên minh di động mở" Từ năm 2007, hệ điều hành Android đã trải qua nhiều lần cập nhật, với phiên bản gần đây nhất là Gingerbread 2.3, ra ngày 06/12/2010. Tính đến tháng 6/2010, đã có khoảng 70 mẫu điện thoại di động sử dụng hệ điều hành Android, chưa kể các thiết bị điện tử khác như máy tính bảng (tablet computers), ebook readers, Google TV,... Tính đến thời điểm hiện tại, trên toàn cầu có khoảng 570 triệu thiết bị sử dụng Android. 2. Khái niệm hệ điều hành Android: Android là hệ điều hành mã nguồn mở dựa trên nền tảng Linux được thiết kế chủ yếu cho các thiết bị di động như điện thoại di động, máy tính bảng, … Ban đầu được phát triển bởi Android, Inc, Google ủng hộ về tài chính và sau đó mua lại vào năm 2005. Android đã được công bố năm 2007 cùng với sự thành lập của Open Handset Alliance: Trang 11
  • 12.
    một tập đoàncác công ty phần cứng, phần mềm và viễn thông để phát triển các tiêu chuẩn mở cho các thiết bị di động. Các thiết bị hỗ trợ Android đầu tiên được bán vào tháng 10 năm 2008. Hệ điều hành mã nguồn mở Android được Google phát hành theo Giấy phép Apache. Điều này cho phép hệ điều hành Android có thể được tự do sửa đổi và phân phối bởi các nhà sản xuất thiết bị, nhà cung cấp mạng không dây và các nhà phát triển phần mềm. Ngoài ra Android còn có một cộng đồng nhà phát triển ứng dụng lớn. Họ đã viết nhiều ứng dụng giúp mở rộng các chức năng của thiết bị Android. Các ứng dụng này được viết chủ yếu bằng ngôn ngữ lập trình Java. 3. Các phiên bản Android: • Phiên bản Android 1.0 đầu tiên ra đời ngày 23/9/2008. Điện thoại HTC Dream trở thành thiết bị đầu tiên chạy hệ điều hành Android. Những tính năng có trên phiên bản 1.0 là: − Tích hợp với các dịch vụ của Google. − Trình duyệt web cho phép xem các trang web viết bằng HTML, XHTML theo nhiều thẻ để có thể tải nhiều trang cùng lúc. − Cho phép tải về, cài đặt và cập nhật phần mềm từ Android Market. − Hỗ trợ Wifi, Bluetooth. • Phiên bản Android 1.1 ra đời ngày 9/2/2009 cập nhật lỗi và thêm một số tính năng mới, cập nhật thêm T-Mobile G1. • Phiên bản Android 1.5 ra đời ngày 30/4/2009 có tên là Cupcake bao gồm một số tính năng mới và các cập nhật về giao diện người dùng: − Tải video lên Youtube và ảnh lên Picasa trực tiếp từ điện thoại. − Bàn phím ảo mới với khả năng đoán trước văn bản. − Hỗ trợ Bluetooth A2DP và AVRCP. − Tự động kết nối với một thiết bị Bluetooth trong một khoảng cách nhất định. • Phiên bản Android 1.6 ra đời ngày 15/9/2009 có tên Donut được cập nhật các tính năng mới: − Cập nhật công nghệ hỗ trợ CDMA. − Hỗ trợ độ phân giải màn hình WVGA. Trang 12
  • 13.
    − Tăng tốcđộ tìm kiếm và các ứng dụng camera. − Nâng cấp trải nghiệm Android Market. • Phiên bản Android 2.0 ra đời ngày 26/10/2009 có tên Éclair với những tính năng: − Giao diện trình duyệt mới và hỗ trợ HTML5. − Bluetooth 2.1 − Hình nền động − Thêm nhiều độ phân giải màn hình và kích cỡ màn hình. − Tối ưu hóa tốc độ phần cứng. • Phiên bản Android 2.1 ra đời ngày 12/1/2010 • Phiên bản Android 2.2 ra đời ngày 20/5/2010 có tên là Froyo với những tính năng: − Tối ưu hóa toàn bộ hệ điều hành Android về tốc độ, bộ nhớ và hiệu năng. − Hỗ trợ Adobe Flash 10.1. − Hỗ trợ Hotspot • Phiên bản Android 2.3 ra đời ngày 6/12/2010 có tên Gingerbread với những tính năng: − Giao diện người dùng được cải tiến để đơn giản và nhanh hơn. − Bàn phím mới nhập văn bản nhanh hơn. − Gọi điện thoại internet. • Phiên bản Android 3.0 ra đời ngày 10/5/2011 có tên Honeycomb với những tính năng: − Tối ưu hóa cho máy tính bảng và các thiết bị với kích thước màn hình lớn hơn. − Tùy biến màn hình chủ. − Kết nối Bluetooth. − Hỗ trợ giao thức truyền thông, hình ảnh • Phiên bản Android 4.0 ra đời ngày 19/10/2011 có tên Ice Cream Sandwich với những tính năng: − Kiểu chữ mới Roboto. Trang 13
  • 14.
    − Tính năngmở khóa mới. − Sắp đặt lại các thư mục, các mục yêu thích, ảnh chụp màn hình. − Kéo bỏ các thông báo, nhiệm vụ và thẻ trình duyệt. − Hỗ trợ wifi trực tiếp và Bluetooth HDP. • Phiên bản Android 4.1 ra đời ngày 9/7/2012 có tên Jelly Bean với những tính năng: − Nhanh, mượt hơn, đáp ứng được nhiều hơn. − Thay đổi kích thước ứng dụng Widgets − Cập nhật ứng dụng tốt và nhanh hơn. 4. Tính năng của Android: Android bao gồm các tính năng như: • Khung ứng dụng: cho phép tái sử dụng lại các ứng dụng đã có sẵn. • Máy ảo Dalvik: là máy ảo được tinh chỉnh dành riêng cho thiết bị di động chạy trên nền Android. Các chương trình Java đa phần chạy trên máy ảo Java; trong khi đó, Dalvik là máy ảo dùng để chạy ứng dụng Java trên di động Android. • Trình duyệt web được tích hợp sẵn: được dựa trên bộ mã nguồn mở Webkit. • Hệ thống xử lý đồ họa được tối ưu hóa: gồm thư viện đồ họa 2D, thư viện đồ họa 3D dựa trên nền OpenGL. • SQLite: dùng cho lưu trữ cơ sở dữ liệu cục bộ. • Media: hỗ trợ định dạng các tập tin âm thanh, video, và hình ảnh thông thường như: MPEG4, H.264, MP3, AAC, AMR, JPG, PNG và GIF. • Điện thoại GSM với các chức năng nghe gọi, tin nhắn. • Hỗ trợ hầu hết các phương thức kết nối Bluetooth, EDGE, 3G và wifi. • Hỗ trợ các phần cứng: camera, GPS, la bàn số và cảm nhận gia tốc. • Môi trường phát triển đa dạng: bao gồm thiết bị máy ảo, công cụ để kiểm lỗi, bộ nhớ và công cụ cung cấp thông tin giả lập và plugin cho Eclipse. 5. Kiến trúc Android: Hệ điều hành android có 4 tầng từ dưới lên trên là tầng Linux Kernel (Phiên bản 2.6), Tầng Libraries & Android runtime , Tầng Application Framework và trên cùng là tầng Application. Trang 14
  • 15.
    5.1 Tầng LinuxKennel: Hệ điều hành android được phát trển dựa trên hạt nhân linux, cụ thể là hạt nhân linux phiên bản 2.6, điều đó được thể hiện ở lớp dưới cùng này. Tất cả mọi hoạt động của điện thoại muốn thi hành được thì đều được thực hiện ở mức cấp thấp ở lớp này bao gồm quản lý bộ nhớ (memory management), giao tiếp với phần cứng (driver model), thực hiện bảo mật (security), quản lý tiến trình (process). Linux Kernel là tầng nền tảng, cung cấp các trình điều khiển thiết bị phần cứng, quản lý tiến trình, quản lý tài nguyên, bảo mật, …. Tầng này làm nhiệm vụ như một lớp trung gian kết nối phần cứng thiết bị với phần ứng dụng. Tuy được phát triển dựa vào nhân linux nhưng thực ra nhân linux đã được nâng cấp và sửa đổi rất nhiều để phù hợp với tính chất của những thiết bị cầm tay như hạn chế về bộ vi xử lý, dung lượng bộ nhớ, kích thước màn hình, nhu cần kết nối mạng không dây... Tầng này có các thành phần chủ yếu :  Display Driver : Điều khiển việc hiển thị lên màn hình cũng như thu nhận những điều khiển của người dùng lên màn hình (di chuyển, cảm ứng...)  Camera Driver : Điều kiển hoạt động của camera, nhận luồng dữ liệu từ camera trả về.  Bluetooth Driver : Điều khiển thiết bị phát và thu sóng Bluetooth.  USB driver : Quản lý hoạt động của các cổng giao tiếp USB  Keypad driver : Điều khiển bàn phím Trang 15
  • 16.
     Wifi Driver: Chịu trách nhiệm về việc thu phát sóng wifi  Audio Driver : điều khiển các bộ thu phát âm thanh, giải mã các tính hiệu dạng audio thành tín hiệu số và ngược lại  Binder IPC Driver : Chịu trách nhiệm về việc kết nối và liên lạc với mạng vô tuyến như CDMA, GSM, 3G, 4G, E để đảm bảo những chức năng truyền thông được thực hiện.  M-System Driver : Quản lý việc đọc ghi... lên các thiết bị nhớ như thẻ SD, flash  Power Madagement : Giám sát việc tiêu thụ điện năng. 5.2 Tầng Library va Android Runtime 5.2.1 Library: Library chứa các thư viện gốc của Android, được viết bằng C/C++, giúp cho người phát triển phần mềm có thể phát triển ứng dụng thông qua tầng Application Framework. Một số thư viện quen thuộc: Surface Manager: dùng để quản lý các hình ảnh hiển thị trên màn hình, quản lý sự liền mạch của các lớp đồ họa 2D, 3D. OpenGL | ES: là thư viên đồ họa 3D, dùng để gia tốc phần cứng nếu thiết bị có chip đồ họa 3D hoặc chuyển sang kiểu định dạng có thể hiển thị lên màn hình của hình ảnh 3D. SLG: thư viện đồ họa 2D, dùng khi cần hiển thị các hình ảnh 2D. Media Framework: phát triển dựa trên nền tảng PacketVideo OpenCORE, hỗ trợ bộ giải mã phần cứng, phần mềm; hỗ trợ các định dạng âm thanh, phim phổ biến như MPEG4, H.264, MP3, AAC, AMR, JPG, PNG. FreeType: Hỗ trợ tạo ra hình ảnh và vector font chữ. SSL: thư viện SSL đảm bảo sự riêng tư và toàn vẹn khi truyền dữ liệu giữa máy chủ web và trình duyệt trên thiết bị. SQLite: Là hệ thống quản lý cơ sở dữ liệu cho mỗi ứng dụng của Android. Webkit: Là một trình duyệt web mã nguồn mở được tích hợp sẵn trong Android.  Thư viện hệ thống (System C library) : thư viện dựa trên chuẩn C, được sử dụng chỉ bởi hệ điều hành.  Thư viện Media (Media Libraries) : Có nhiều codec để hỗ trợ việc phát và ghi các loại định dạng âm thanh, hình ảnh, video thông dụng. Trang 16
  • 17.
     Thư việnweb (LibWebCore) : Đây là thành phần để xem nội dung trên web, được sử dụng để xây dựng phần mềm duyệt web (Android Browse) cũng như để các ứng dụng khác có thể nhúng vào. Nó cực kỳ mạnh, hỗ trợ được nhiều công nghệ mạnh mẽ như HTML5, JavaScript, CSS, DOM, AJAX..  Thư viện SQLite : Hệ cơ sở dữ liệu để các ứng dụng có thể sử dụng.  ..... 5.2.2 Android Runtime: Phần này chứa các thư viện mà một chương trình viết bằng ngôn ngữ Java có thể hoạt động. Phần này có 2 bộ phận tương tự như mô hình chạy Java trên máy tính thường. Thứ nhất là các thư viện lõi (Core Library) , chứa các lớp như JAVA IO, Collections, File Access. Thứ hai là một máy ảo java (Dalvik Virtual Machine). Mặc dù cũng được viết từ ngôn ngữ Java nhưng một ứng dụng Java của hệ điều hành android không được chạy bằng JRE của Sun (nay là Oracle) (JVM) mà là chạy bằng máy ảo Dalvik do Google phát triển. Android Runtime bao gồm máy ảo Dalvik và một số thư viện lõi, được thừa kế gần như tất cả các tính năng được cung cấp bởi các thư viện của các ngôn ngữ lập trình Java. Máy ảo Dalvik là một điểm đặc biệt được thiết kế cho nền tảng Android giúp tối ưu hóa cho các thiết bị di động, nơi mà nguồn tài nguyên bị hạn chế - như bộ nhớ thấp, kích thước nhỏ, tốc độ xử lý chậm. Máy ảo Dalvik có khả năng thực hiện các chương trình viết bằng Java. Một công cụ dx được sử dụng để chuyển đổi mã Java thành mã Byte mà máy ảo Dalvik có thể thực thi một cách dễ dàng trên các thiết bị di động. Android hỗ trợ thực hiện nhiều ứng dụng đồng thời trên máy ảo Dalvik. 5.3 Tầng Application Framework Tầng thứ ba là tầng Application Framework. Tầng này được tích hợp sẵn bộ công cụ cơ bản, sử dụng để cung cấp các dịch vụ khác cho các ứng dụng Android. Các nhà phát triển Android có thể sử dụng các dịch vụ cốt lõi để xây dựng một cách sáng tạo và phong phú các ứng dụng Android. Kiến trúc Application Framework được thiết kế giúp đơn giản hóa việc tái sử dụng các thành phần; bất kỳ ứng dụng có thể xuất bản khả năng. Tầng này xây dựng bộ công cụ - các phần tử ở mức cao để các lập trình viên có thể nhanh chóng xây dựng ứng dụng. Nó được viết bằng Java, có khả năng sử dụng chung để tiết kiệm tài nguyên. Đây là một nền tảng mở, điều đó có 2 điều lợi: Trang 17
  • 18.
    • Với cáchãng sản xuất điện thoại : Có thể tùy biến để phù hợp với cấu hình điện thoại mà họ sản xuất cũng như để có nhiều mẫu mã, style hợp thị hiếu người dùng. Vì thế nên tuy cùng chung nền tảng android mà điện thoại của Google có thể khác hẳn với Motorola, HTC, T- Mobile, Samsung... • Với lập trình viên : Cho phép lập trình viên có thể sử dụng các API ở tầng trên mà không cần phải hiểu rõ cấu trúc bên dưới, tạo điều kiện cho lập trình viên tự do sáng tạo bởi vì chỉ cần quan tâm đến nội dung mà ứng dụng họ làm việc. Một tập hợp API rất hữu ích được xây dựng sẵn như hệ thống định vị, các dịch vụ chạy nền, liên lạc giữa các ứng dụng, các thành phần giao diện cấp cao ... Giới thiệu một số thành phần của phần này : • Activity Manager : Quản lý các chu kỳ sống của một ứng dụng cũng như cung • cấp công cụ điều khiển các Activity. • Telephony Manager : Cung cấp công cụ để thực hiện việc liên lạc như gọi điện • thoại • XMPP Service : Cung cấp công cụ để liên lạc trong thời gian thực • Location Manager : Cho phép xác định vị trí của điện thoại thoại dựa vào hệ • thống định vị toàn cầu GPS và Google Maps. • Window Manager : Quản lý việc xây dựng và hiển thị các giao diện người dùng • cũng như tổ chức quản lý các giao diện giữa các ứng dụng. • Notication Manager : Quản lý việc hiển thị các thông báo (như báo có tin nhắn, • có e-mail mới..) • Resource Manager : Quản lý tài nguyên tĩnh của các ứng dụng bao gồm các file • hình ảnh, âm thanh, layout, string. (Những thành phần không được viết bởi ngôn • ngữ lập trình) • ..... 5.4 Tầng Application: Đây là lớp ứng dụng giao tiếp với người dùng, bao gồm các ứng dụng như : Trang 18
  • 19.
    Các ứng dụngcơ bản, được cài đặt đi liền với hệ điều hành là gọi điện(phone), quản lý danh bạ(Contacts), duyệt web (Browser), nhắn tin (SMS), lịch làm việc (Calendar), đọc e-mail (Email-Client), bản đồ (Map), quay phim chụp ảnh (camera)... Các ứng dụng được cài thêm như các phần mềm chứng khoán (Stock), các trò chơi (Game), từ điển... Các chương trình có các đặc điểm là : • Viết bằng Java, phần mở rộng là apk • Khi mỗi ứng dụng được chạy, nó có một phiên bản Virtual Machine được dựng lên để phục vụ cho nó. Nó có thể là một Active Program : Chương trình có giao diện với người sử dụng hoặc là một background : chương trình chạy nền hay là dịch vụ. • Android là hệ điều hành đa nhiệm, điều đó có nghĩa là trong cùng một thời điểm, có thể có nhiều chương trình cùng chạy một lúc, tuy nhiên, với mỗi ứng dụng thì có duy nhất một thực thể (instance) được phép chạy mà thôi. Điều đó có tác dụng hạn chế sự lạm dụng tài nguyên, giúp hệ thống hoạt động tốt hơn. • Các ứng dụng được gán số ID của người sử dụng nhằn phân định quyền hạn khi sử dụng tài nguyên, cấu hình phần cứng và hệ thống. • Android là một hệ điều hành có tính mở, khác với nhiều hệ điều hành di động khác, android cho phép một ứng dụng của bên thứ ba được phép chạy nền. Các ứng dụng đó chỉ có một hạn chế nhỏ đó là nó không được phép sử dung quá 5~10% công suất CPU, điều đó nhằn để tránh độc quyền trong việc sử dụng CPU. • Ứng dụng không có điểm vào cố định, không có phương thức main để bắt đầu. Trang 19
  • 20.
    CHƯƠNG II: PHÁTTRIỂN ỨNG DỤNG TRÊN ANDROID 1. Môi trường lập trình Android: Trong chương này sẽ giới thiệu các công cụ lập trình cho Android là Eclipse và Android Development Tool plug-in, thông qua Android SDK và công cụ của nó, chạy một ứng dụng Android trên Emulator. 1.1 Android SDK: Android SDK là công cụ phát triển phần mềm được chính Google xây dựng và phát hành miễn phí đến người lập trình để họ dễ dàng xây dựng và phát triển các ứng dụng chạy được trên hệ điều hành Android. Android SDK có các đặc tính sau: • Được phát triển và cung cấp miễn phí. • Truy cập đến phần cứng wifi. • GSM, EDGE và tính năng mạng 3G cho phép việc chuyển dữ liệu, gọi điện hay gửi tin SMS trong mạng di động. • Gói API toàn diện cho các dịch vụ nền tảng như GPS. • Truy cập toàn bộ phần cứng điều khiển đa phương tiện như nghe nhạc, ghi âm hay sử dụng microphone và camera. • Chia sẽ dữ liệu trong kho dữ liệu. • Tích hợp trình duyệt dựa trên bộ WebKit. • P2P hỗ trợ sử dụng Goolge Talk. • Hỗ trợ tốt đồ họa 3D nhờ sử dụng OpenGL ES. Android SDK cần phải được cài đặt để xây dựng các ứng dụng Android. Android SDK bao gồm tài liệu tích hợp HTML_base lõi chính của Javadoc để thể hiện các gói và lớp trong Java. 1.2 Máy ảo Dalvik Một trong những thành phần quan trọng của Android là máy ảo Dalvik. Thay vì sử dụng máy ảo Java như trước kia, Android sử dụng máy ảo của riêng nó được thiết kế để bảo đảm rằng đa ứng dụng có thể chạy mượt mà trên một thiết bị di động. Máy ảo Dalvik sử dụng lõi Linux để xử lý các chức năng ở mức thấp bao gồm bảo mật, các tiến trình, các luồng và quản lý vùng nhớ. Nó cũng có thể viết bằng ứng dụng C/C++ để chạy trực tiếp lên lõi Linux bên dưới. Giữa phần cứng và các dịch vụ hệ thống được quản lý bởi máy ảo Dalvik, nó là một thành phần ở giữa. Bằng cách sử dụng máy ảo này để chạy ứng dụng, các nhà phát triển hoàn toàn không phải bận tâm gì về các phần Trang 20
  • 21.
    cứng bên dưới.Khi máy ảo náy chạy nó sẽ tạo ra tập tin có đuôi là .dex, tập tin này được SDK tạo ra bởi sự chuyển đổi từ các lớp biên dịch ngôn ngữ Java. 1.3 Các gói Java cần thiết: • Java.lang: Gói chứa các lớp lõi của Java • Java.io: Xuất nhập • Java.net: Kết nối mạng • Java.util: Chứa các lớp tiện ích • Java.text: Tiện ích xử lý vă bản • Java.math: Các lớp toán học • Javax.net: Các lớp mạng • Javax.security: Lớp liên quan đến bảo mật • Javax.xml: Các lớp liên quan đến DOM-based XML • Org.apache.*: Các lớp liên quan đến HTTP. • Org.xml: Các lớp liên quan đến SAX-based XML Các gói dùng cho lập trình Android: • Android.app: Mô hình truy cập ứng dụng Android • Android.content: Truy xuất dữ liệu trong Android • Android.net: Bao gồm lớp Uri dùng cho việc truy xuất các nội dung khác • Android.graphics: Đồ họa • Android.opengl: Các lớp OpenGL • Android.os: Truy cập ở mức độ hệ thống đến mội trường Android • Android.provider: Các lớp liên quan đến ContentProvider • Android.telephony: Khả năng truy cập Telephony • Android.text: Bố trí văn bản • Android.util: Tập các tiện ích thao tác trên văn bản bao gồm XML • Android.view: Thành phần giao diện người dùng • Android.webkit: Chức năng trình duyệt • Android.widget: Thành phần giao diện người dùng ở mức độ cao hơn Trang 21
  • 22.
    Các gói gầnnhư là lõi của mọi ứng trên Android là Android.app, Android.view và Android.content. 2. Các thành phần cơ bản: • Activities (Android.app.Activity): đây là lớp khởi tạo giao diện ứng dụng nội bộ trên Android tương tự như MIDlet trong J2ME. • Services (Android.app.Service): cung cấp các dịch vụ liên quan đến Client/Service. Một Service sẽ chạy ngầm bên dưới, sau đó các Client sẽ kết nối và truy xuất các hàm trên thông quan lớp Interface. • Broadcast Receiver (Android.content.BroadcastReceiver): đây là một ứng dụng chạy ngầm dùng để đọc và cập nhật thông tin trên giao diện người dùng như cập nhật sự thay đổi giờ, pin... • Content Providers: cung cấp chức năng truy vấn dữ liệu giữa các ứng dụng của Android. 3. File AndroidMainfest: Trong bất kỳ một dự án Android nào khi tạo ra đều có một tập tin AndroidManifest.xml, tập tin này được dùng để định nghĩa các màn hình sử dụng cũng như giao diện ứng dụng. Đồng thời nó cũng chứa thông tin về phiên bản SDK cũng như chương trình chính sẽ chạy đầu tiên. Tập tin này được tự động sinh ra khi tạo một dự án Android. Trong tập tin Manifest bao giờ cũng có 3 thành phần chính đó là: Application, Permission và SDK Version. Dưới đây là nội dung của một tập tin AndroidManifest.xml <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="dtu.k12tpm.pbs.activity" android:versionCode="1" android:versionName="1.0"> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".LoginActivity" android:label="@string/app_name"> Trang 22
  • 23.
    <intent-filter> <action android:name="android.intent.action.MAIN" /> <categoryandroid:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".MainContactListActivity" /> <activity android:name=".RestoreContactActivity" /> </application> <uses-sdk android:minSdkVersion="7" /> <uses-sdk android:minSdkVersion="7" /> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.CALL_PHONE"/> </manifest> • Application Bên trong thẻ <application> chứa các thuộc tính được định nghĩa cho ứng dụng Android như: − Android:icon = “drawable resource”: Ở đây đặt đường dẫn đến tập tin biểu tượng của ứng dụng khi cài đặt. − Android:name = “string”: Thuộc tính này để đặt tên cho ứng dụng Android. Tên này sẽ được hiển thị lên màn hình sau khi cài đặt ứng dụng. − Android:theme = “drawable theme”: Thuộc tính này để đặt giao diện cho ứng dụng. − Ngoài ra còn nhiều thuộc tính khác. • Permission Bao gồm các thuộc tính chỉ định quyền truy xuất và sử dụng tài nguyên của ứng dụng. Khi cần sử dụng một loại tài nguyên nào đó thì trong tập tin Manifest của ứng dụng cần phải khai báo các quyền truy xuất như sau: <uses-permission android:name="android.permission.READ_PHONE_STATE"/> <uses-permission android:name="android.permission.ACCOUNT_MANAGER"/> <uses-permission android:name="android.permission.VIBRATE" /> Trang 23
  • 24.
    <uses-permission android:name="android.permission.CALL_PHONE"/> • SDK Version Thẻxác định phiên bản SDK được khai báo như sau: <uses-sdk android:minSdkVersion="7" /> Ở đây chỉ ra phiên bản SDK nhỏ nhất mà ứng dụng hiện đang sử dụng. CHƯƠNG III: COMPONENTLIFE CYCLE Các thành phần ứng dụng có vòng đời – đó là sự bắt đầu khi Android khởi động thành phần cho đến khi kết thúc ứng dụng khi thực thể ứng dụng bị hủy. Các trạng thái ứng dụng có thể có hiệu lực hay không có hiệu lực; đối với activities, thì có tình trạng visible hoặc invisible. Trong mục này ta nói về vòng đời của activities, services, và broadcast receiver. 1. Vòng đời của Activity: 1.1Activity Stack: Bên trong hệ thống các activity được quản lý như một ngăn xếp các hoạt động. Khi một hoạt động mới được bắt đâu, nó được đặt ở đỉnh của ngăn xếp và trở thành hoạt động đang chạy, hoạt động trước sẽ ở bên dưới hoạt động mới và sẽ không thấy trong suốt quá trình hoạt động mới tồn tại. Nếu người dùng nhấn nút Back thì hoạt động kết tiếp của ngăn xếp sẽ di duyển lên và trở thành hoạt động. Hình: Activity stack 1.2Các trạng thái của chu kì sống: Trang 24
  • 25.
    Một hoạt độngchủ yếu có 3 trạng thái chính sau: Trạng thái hoạt động: khi ứng dụng được chạy lên màn hình – tức là hoạt động đang ở trên đỉnh của ngăn xếp. Người dùng sẽ tương tác trực tiếp đến hoạt động này. Trạng thái tạm dừng: một hoạt động bị tạm dừng là khi hoạt động khác ở phía trên hoạt động bị dừng. Hoạt động ở phía trên có thể trong suốt hoặc chỉ che khuất một phần màn hình, do đó có thể nhìn thấy được các hoạt động tạm dừng ở phía dưới. Một hoạt động bị tạm dừng duy trì tất cả các thông tin, trạng thái và vẫn gắn liền với trình quản lý cửa sổ. Các hoạt động bị tạm dừng có thể bị tắt nếu hệ thống gặp tình trạng bộ nhớ thấp. Trạng thái ngừng hoạt động: là trạng thái hoạt động không được hiển thị cho người sử dụng và người dụng không thể tương tác trực tiếp với nó, nhưng nó vẫn còn duy trì tất cả các trạng thái. Các hoạt động bị ngừng có thể bị tắt nếu hệ thống có nhu cầu sử dùng bộ nhớ cho các hoạt động khác. Hệ thống có thể loại bỏ một hoạt động bị dừng bằng cách gọi phương thức finish() hoặc đơn giản là tắt quá trình xử lý của nó. Khi một hoạt động chuyển đổi từ trạng thái này sang trạng thái khác, hoạt động sẽ gọi các phương thức: Void onCreate( Bundle saveInstanceState) Void onStart() Void onRestart() Void onResume() Void onPause() Void onStop() Void onDestroy() Phương pháp onCreate() phải được thực hiện trong phần khai báo đối tượng. Các phương thức trên có thể được ghi đè các hoạt động khi trạng thái thay đổi. Để thực hiện các thay đổi về dữ liệu và ngăn chặn người dùng tương tác, phương thức onPause() có thể được gọi. Trang 25
  • 26.
    Nếu một Activitybị tạm dừng và dừng hẳn, hệ thống có thể loại bỏ nó ra khỏi bộ nhớ bằng cách gọi hàm finish() hoặc loại bỏ nó ra khỏi tiến trình. Với 7 phương thức định nghĩa cho toàn bộ vòng đời ứng dụng của Activity. Nếu chú ý, ta thấy có những vòng khép kín như sau: • Vòng khép kín toàn bộ của ứng dụng: Activity bắt đầu từ lần gọi hàm đầu tiên onCreate() đến hàm cuối cùng onDestroy(). Một Activity làm tất cả các thiết lập đầu tiên cho chương trình trong hàm onCreate() và giải phóng tất cả các tài nguyên trong hàm onDestroy(). Ví dụ như ứng dụng có 1 luồng chạy ngầm để tải dữ liệu từ máy chủ về thì nó tạo luồng trong hàm onCreate() và sau đó dừng hẵn luồng trong hàm OnDestroy(). • Vòng đời nhìn thấy được bởi người dùng: trong Activity từ hàm onStart() cho đến hàm onStop(). Trong suốt thời gian này, người dùng có thể thấy Activity trên màn hình. Giữa 2 phương thức này, bạn có thể duy trì các tài nguyên mà cần thiết để trình bày Activity cho người dùng. Ví dụ, bạn có thể khai báo BroadcastReceiver trong hàm onStart() để giám sát tự thay đổi ảnh hưởng đến giao diện và giải phóng nó trong hàm onStop() khi người dùng không còn nhìn thấy những gì bạn đang trình bày. Hàm onStart() và onStop() được gọi nhiều lần bởi vì acitivity thay đổi nhiều lần giữa trạng thái nhìn thấy được và ẩn đi đối với người dùng. • Vòng đời chạy ngầm: từ hàm onResume() đến hàm onPause(). Trong suốt thời gian này, Activity chuyển từ trạng thái resume sang pause hay ngược lại. onPause() được gọi khi thiết bị “ngủ” hoặc khi Activity mới được khởi động, hàm onResume() được gọi khi kết quả của một Activity hay một intent mới được đưa ra. Vì thế mã lệnh trong hai phương thức này nên ít thôi. Hình sau mô tả những vòng khép kín và con đường mà activty phải trải qua giữa các trạng thái. Hình ô van thể hiện trạng thái của Activity, hình chữ nhật thể hiện các phương thức của vòng đời ứng dụng khi mà Activity có sự thay đổi trạng thái. Trang 26
  • 27.
    Hình: Vòng đờicủa 1 Ativity 1.3 Các sự kiện trong chu kỳ sống của vòng đời ứng dụng: Nếu một hoạt động được tạm dừng hoặc dừng hẵn, hệ thống có thể bỏ thông tin khác của nó từ vùng nhớ bằng việc gọi hàm finish(), hoặc đơn giản dừng tiến trình của nó. Khi nó được hiển thị lần nữa với người dùng, nó phải được hoàn toàn khởi động lại và phục hồi lại trạng thái trước. Khi một hành động chuyển qua chuyển lại giữa các trạng thái, nó báo việc chuyển đổi bằng cách gọi hàm transition. Hình: Các hàm thực thi Trang 27
  • 28.
    Tất cả cácphương thức là những móc nối mà chúng ta có thể ghi đè để làm tương thích công việc trong ứng dụng khi thay đổi trạng thái. Tất cả các hoạt động phải có onCreate() để khởi tạo ứng dụng. Nhiều hoạt động sẽ thực hiện onPause() để xác nhận việc thay đổi dữ liệu và chuẩn bị dừng hoạt động với người dùng. 1.4 Thời gian sống của ứng dụng: Thời gian sống của một hoạt động diễn ra giữa lần đầu tiên gọi onCreate() đến trạng thái cuối cùng gọi onDestroy(). Một hoạt động khởi tạo toàn bộ trạng thái toàn cục trong onCreate() và giải phóng các tài nguyên đang tồn tại trong onDestroy(). 1.5 Thời gian hiển thị các hoạt động: Visible lifetime của một hoạt động diễn ra giữa lần gọi một onStart() cho đến khi gọi onStop(). Trong suốt khoảng thời gian này người dùng có thể thấy hoạt độn trên màn hình, có nghĩa là nó không bị hoạt động khác phía trên hoặc đang tương tác với người dùng. Giữa hai phương thức người dùng có thể duy trì tài nguyên để hiển thị hoạt động đến người dùng. 1.6 Các hàm thực thi: Phương thức hàm Mô tả Có thể hủy (Killable) Theo sau hàm onCreate() Được gọi khi Activity lần đầu tiên được tạo. Đây là nơi đầu tiên bạn nên làm tất cảcác thiết lập như tạo Views, gắn dữ liệu vào danh sách hay đại loại vậy. Luôn theo sau là hàm onStart(). Không onStart() onRestart() Được gọi sau khi Activity đã bị dừng trước đó và được được khởi động lại. Luôn theo sau hàm onStart(). Không onStart() onStart() Được gọi chỉ trước khi acitivity trở nên nhìn thấy được với người dùng. Luôn theo sau là hàm onResume() nếu Activity chạy ngầm hoặc onStop() nếu nó bị ẩn đi. Không onResume() hoặc onStop() onResume() Chỉ được gọi trước Activity bắt đầu tương tác với người dùng. Tại thời điểm này, Activity nằm trên đầu của ngăn xếp Activity và người dùng chuẩn bị tương tác với chúng. Luôn theo sau là hàm onPause(). Không onPause() onPause() Được gọi khi hệ thống sắp bắt đầu hồi phục lại một Activity khác. Phương thức này được dùng để lưu những dữ Có onResume() hoặc onStop() Trang 28
  • 29.
    liệu mới vừathay đổi, dừng hẳn hiệu ứng động và và dừng hẳn những thứ khác có thể ngốn tài nguyên CPU hay đại loại vậy. Ứng dụng làm bất cứ cái gì để sao cho nó chạy nhanh bởi vì Activity kế tiếp sẽ không hồi phục lại cho đến khi acitvity hiện tại dừng lại. Nó theo sau hàm onResume() nếu Activity hiện tại sắp được thực thi hoặc theo sau là hàm onStop() nếu nó trở nên ẩn đi đối với người dùng. onStop() Được gọi khi người dùng không nhìn thấy được Activity nữa. Điều này có thể xảy ra bởi vì nó đang được hủy hoặc một Activity khác (có thể Activity đang tồn tại hoặc Activity mới) được hồi phục lại và đang đè lên Activity hiện tại. Vừa theo sau là hàm onRestart() nếu Activity đang quay lại để tương tác với người dùng hoặc hàm onDestroy() nếu Activity dự định hủy đi. Có onRestart() hoặc onDestroy onDestroys() Được gọi trước khi Activity bị hủy đi. Hàm này được gọi lần cuối cùng khi mà một ativity đang kết thúc hay hệ thống chỉ đang hủy những thực thể của Activity để tiết kiệm không gian. Có thể phân biệt 2 trạng thái này bằng hàm isFinishing(). Có Không Bảng mô tả lại ý nghĩa các phương thức trong vòng đời của một Activity Ghi chú cột Có thể hủy (Killable): Ý nghĩa của nó là dù muốn dù không thì hệ thống có thể “giết” tiến trình đang giữ Activity tại thời điểm sau khi phương thức kết thúc mà không thực thi dòng mã lệnh cũa một Activity khác. Ba phương thức (onPause(), onStop(), onDestroy()) có giá trị là Có. Bởi vì onPause() là phương thức đầu tiên của ba phương thức, nó là phương thức duy nhất bảo đảm được gọi trước khi tiến trình kết thúc trong khi đó onStop() và onDestroy() thì không. Vì thế, bạn nên dùng onPause() để cập nhật tất cả dữ liệu mới vừa được thay đổi. Còn những phương thức được đánh dấu là Không trong cột Có thể hủy (Killable) bảo đảm tiến trình giữ acitivity khỏi bị “giết” khỏi thời điểm mà chúng được gọi. Mặc dù vậy một ativity trong tình trạng có thể hủy bắt đầu từ khi onPause() đến onResume(). Nó không thể bị hủy cho đến khi hàm onPause() kết thúc. Trang 29
  • 30.
    • Tiết kiệmtình trạng của Activity: Khi hệ thống tắt Activity để bảo toàn bộ nhớ, người dùng mong muốn Activity giữ được trạng thái Activity như lúc trước khi tắt. Để giữ lại trạng thái trước khi Activity bị tắt, bạn nên dùng hàm onSaveInstanceState() cho Activity. Android gọi hàm này trước khi hủy acvitity. Tiếp theo sau đó, để lấy lại trạng thái của Activity thì phải thực thi hàm onRestoreInstanceState() sau hàm onStart() và hàm onCreate() đã chạy trước đó. Vì thế ta có thể vừa tái tạo và lưu vết lại trạng thái Activity. Không giống như hàm onPause() hay những hàm trong vòng đời ứng dụng, hàm onSaveInstanceState() hay hàm onRestoreInstanceState() không phải phương thức vòng đời của ứng dụng và không phải lúc nào cũng được gọi vì không phải lúc nào người dùng cũng muốn lưu vết lại trạng thái của Activity. • Phối hợp các activities: khi một Activity khởi động một Activity khác, cả hai Activity sẽ thay đổi trạng thái của vòng đời của mình. Activity này tạm dừng và có thể dừng hẳn trong khi cái khác thì mới khởi động. Trong trường hợp bạn có thể cần phối hợp các Activity này khi mà 2 Activity cùng nằm trong cùng một tiến trình. 2. Vòng đời Service: Một service có thể dùng trong 2 cách: • Nó có thể được khởi động và được cho phép dùng cho đến khi ai đó dừng hẳn nó hoặc nó tự dừng hẳn. Để khởi động dùng hàm Context.startService() và dừng hẳn bằng hàm Context.stopService() hoặc tự dừng bằng hàm Service.stopSelf() hoặc Service.stopSelfResult(). Chú ý là hàm stopService() chỉ được gọi một lần duy nhất để dừng service trong khi đó gọi hàm startService() bao nhiêu lần tùy thích. • Nó có thể được vận hành bằng mã lệnh dùng lớp interface mà nó đã định nghĩa. Client thiết lập kết nối và dùng kết nối ấy để gọi dịch vụ. Kết nối được thiết lập bằng cách gọi Context.bindService() và được đóng bởi hàm Context.unbindService(). Giống như Activity, service có những phương ứng vòng đời của riêng mình mà có thể thực thi để giám sát sự thay đổi trong trạng thái của nó. Nhưng service có ít hơn và gồm có 3 phương thức public: void onCreate(), void onStart(Intent intent), void onDestroy(). Bằng cách thực thi những phương thức này, bạn có thể giám sát vòng đời của service: • Toàn bộ vòng đời của service xảy ra khi gọi hàm onCreate() và kết thúc khi gọi hàm onDestroy(). Giống như một Activity, một service khởi động trong hàm onCreate() và giải phóng mọi tài nguyên trong hàm onDestroy(). • Vòng đời “có hiệu lực” của service bắt đầu khi gọi hàm onStart(). Và không được kết thúc bằng onStop() vì hàm này không có thực. Phương thức onCreate() và onDestroy() được gọi cho tất cả dịch vụ cho dù service khởi động bằng hàm Context.startService() hay hàm Context.bindService(). Tuy nhiên, onStart() được gọi khi service đã khởi động bằng hàm startService(). Nếu một service cho phép những service khác liên kết với nó thì phải dùng các phương thức sau: IBinder onBind(Intent intent), boolean onUnbind(Intent intent), void onRebind(Intent intent). Hình sau mô tả các phương thức cho service, Mặc dù, hình chia ra 2 loại service dựa trên tiêu chí khởi động bởi hàm startService (0 và hàm bindService(). Cho dù nó khởi Trang 30
  • 31.
    động bằng cáchnào đi chăng nữa, thì nó vẫn cho client kết nối tới nó và bất kì service nào cũng có thể gọi 2 hàm onBind() và onUnbind(). Hình: Vòng đời của 1 Service 3. Vòng đời Broadcast Recievers: Broadcast receiver có một hàm cho phép người dùng viết lại là hàm void onCreate(Context curContext, Intent broadcastMsg). Khi một tin nhắn phát đi cho người nhận, Android gọi phương thức onReceive và chuyển nó cho đối tượng Intent đang chứa tin nhắn. Broadcast receiver được xem là có hiệu lực chỉ khi nào có đang thực thi phương thức này. Khi phương thức onReceive() kết thúc thì broadcast receiver không còn hiệu lực nữa. Một tiến trình với một broadcast receiver thì được bảo vệ khỏi bị “giết”. Nhưng một tiến trình với các thành phần không còn hiệu lực (Activity, service,…) thì bị hệ thống “giết” bất kì lúc nào khi mà bộ nhớ không đủ cho kác tiến trình khác. 4. Life cycles and process Hệ thống Android duy trì một tiến trình ứng dụng càng lâu càng tốt nhưng nó sẽ loại bỏ các tiến trình cũ khi mà bộ nhớ thấp. Để quyết định tiến trình nào được giữ lại, Trang 31
  • 32.
    tiến trình nàobị “giết” đi, Android đặt mỗi tiến trình vào một “hệ thống cấp bậc quan trọng” dựa trên các thành phần đang chạy trên nó và trạng thái của các thành phần đó. Những tiến trình với độ quan trọng thấp bị loại bỏ đi đầu tiên, sau đó tới lượt các tiến trình có độ ưu tiên thấp hơn và cứ như vậy. Có 5 cấp trong hệ thống cấp bậc gồm các cấp bậc sau: • Tiến trình nền: là tiến trình người dùng đang làm việc. Một tiến trình được xem là tiến trình nền nếu có bất kì điều kiện sau đây: • Nó đang chạy một activty mà người dùng đang tương tác. • Giữ một service mà được liên kết với Activity mà người dùng đang tương tác. • Có đối tượng Service mà đang thực thi một trong những phương thức onCreate(), onStart(), onDestroy(). • Có đối tượng BroadcastReceiver mà đang thực thi hàm onReceive(). • Chỉ có một vài tiến trình ngầm sẽ tồn tại tại bất kì thời gian nào. Chúng chỉ bị “giết đi” khi nằm cuối “bảng tổng sắp” nếu bộ nhớ quá thấp đến nỗi chúng không thể tiếp tục chạy được nữa. • Tiến trình nhìn thấy được: là tiến trình không có các thành phần nền nhưng vẫn có thể ảnh hưởng đến những gì mà người dùng thấy trên màn hình. Một tiến trình được xem như là thấy nếu thỏa cả hai điều kiện sau: • Nó giữ một acitivity mà không phải acitivity nền nhưng vẫn nhìn thấy được đối với người dùng. Điều này xảy ra khi Activity hiện tại là một hộp thoại và Activity trước đó có thể nhìn thấy được do hộp thoại không che hết màn hình. • Nó giữ một service mà đang kết nối tới một Activity nhìn thấy được. • Tiến trình dịch vụ: là tiến trình chạy một service mà được bắt đầu bởi hàm startService() mà nó không rơi vào 2 trạng thái trên. Mặc dù tiến trình dịch vụ không liên quan gì tới bất kì cái gì mà người dùng thấy, nhưng nó làm những thứ mà người dùng quan tâm đến chẳng hạn chơi nhạc mp3 ngầm, và vì thế hệ thống giữ cho chúng chạy nếu đủ bộ nhớ để duy trì 2 tiến trình trên. • Tiến trình ngầm: là tiến trình giữ một Activity mà người dùng không nhìn thấy được. Những tiến trình này không ảnh hưởng trực tiếp lên người dùng, nó có thể bị “giết” bất kì lúc nào để dành bộ nhớ cho 3 dạng tiến trình trên. • Tiến trình rỗng là tiến trình không giữ bất cứ một ứng dụng nào cả. Chỉ có một lí do để giữ những tiến trình như vậy là xem nó như là một vùng đệm để cải thiện tốc độ thời gian khởi động vào lần tới khi mà các thành phần cần nó để chạy nhanh hơn. Hệ thống thường “giết” các tiến trình này để mà cân bằng tài nguyên hệ thống giữa vùng đệm tiến trình và vùng đệm lõi bên dưới thiết bị. Android xếp hạng các tiến trình từ cao đến thấp dựa trên mức độ quan trọng của các thành phần hiện đang có hiệu lực trong tiến trình. Thêm vào đó, thứ hạng các tiến trình có thể tăng lên bởi vì các tiến trình khác phụ thuộc vào nó. Một tiến trình mà phục vụ cho tiến trình khác có thể không bao giờ được sắp thấp hơn tiến trình mà nó đang phục vụ. Ví dụ tiến trình A đang phục vụ cho B thì thứ hạng A luôn cao hơn B. Trang 32
  • 33.
    CHƯƠNG IV: CÁCTHÀNH PHẦN GIAO DIỆN TRONG ANDROID 1. View: Trong một ứng dụng Android, giao diện người dùng được xây dựng từ các đối tượng View và ViewGroup. Có nhiều kiểu View và ViewGroup. Mỗi một kiểu là một hậu duệ của class View và tất cả các kiểu đó được gọi là các Widget. Tất cả mọi widget đều có chung các thuộc tính cơ bản như là cách trình bày vị trí, background, kích thước, lề… Tất cả những thuộc tính chung này được thể hiện hết ở trong đối tư ợng View. Trong Android Platform, các screen luôn được bố trí theo một kiểu cấu trúc phân cấp như hình dưới. Một screen là một tập hợp các Layout và các widget được bố trí có thứ tự. Để thể hiện một screen thì trong hàm onCreate của mỗi Activity cần phải được gọi một hàm là setContentView(R.layout.main), hàm này sẽ load giao diện từ file XML lên để phân tích thành mã bytecode. Hình: Cấu trúc một giao diện ứng dụng Android 2. View Group: ViewGroup thực ra chính là View hay nói đúng hơn thì ViewGroup chính là các widget Layout được dùng để bố trí các đối tượng khác trong một screen. Có một s ố loại ViewGroup như sau: 2.1 LinearLayout LinearLayout được dùng để bố trí các thành phần giao diện theo chiều ngang hoặc chiều dọc nhưng trên một line duy nhất mà không có xuống dòng. LinearLayout làm cho các thành phần trong nó không bị phụ thuộc vào kích thước của màn hình. Các thành phần trong LinearLayout được dàn theo những tỷ lệ cân xứng dựa vào các ràng buộc giữa các thành phần. Trang 33
  • 34.
    Hình: Bố trícác widget sử dụng LinearLayout 2.2 FrameLayout FrameLayout được dùng để bố trí các đối tượng theo kiểu giống như là các Layer trong Photoshop. Những đối tư ợng nào thuộc Layer bên dưới thì sẽ bị che khuất bởi các đối tượng thuộc Layer nằm trên. FrameLayer thường được sử dụng khi muốn tạo ra các đối tượng có khung hình bên ngoài chẳng hạn như contact image button. Hình: Bố trí các widget trong FrameLayout 2.3 AbsoluteLayout Layout này được sử dụng để bố trí các widget vào một vị trí bất kì trong layout dựa vào 2 thuộc tính toạ độ x, y. Tuy nhiên, kiểu layout này rất ít khi được dùng bởi vì toạ độ của các đối tượng luôn cố định và sẽ không tự điều chỉnh được tỷ lệ khoảng cách giữa các đối tượng. Khi chuyển ứng dụng sang một màn hình có kích th ước với màn hình thiết kế ban đầu thì vị trí của các đối tượng sẽ không còn được chính xác như ban đầu. 2.4 RetaliveLayout Layout này cho phép bố trí các widget theo một trục đối xứng ngang hoặc dọc. Để đặt được đúng vị trí thì các widget cần được xác định một mối ràng buộc nào đó với các widget khác. Các ràng buộc này là các ràng buộc trái, phải, trên, dưới so với một widget Trang 34
  • 35.
    hoặc so vớilayout parent. Dựa vào những mối ràng buộc đó mà RetaliveLayout cũng không phụ thuộc vào kích thước của screen thiết bị. Ngoài ra, nó còn có ưu điểm là giúp tiết kiệm layout sử dụng nhằm mục đích giảm lượng tài nguyên sử dụng khi load đồng thời, đẩy nhanh quá trình xử lý. Hình: Bố trí widget trong RetaliveLayout 2.5 TableLayout Layout này được sử dụng khi cần thiết kế một table chứa dữ liệu hoặc cần bố trí các widget theo các row và column. Chẳng hạn như, giao diện của một chiếc máy tính đơn giản hoặc một danh sách dữ liệu. Hình: Bố trí widget trong TableLayout 3. Button: Sở dĩ widget button được giới thiệu đầu tiên trong số các widget khác là vì đây là đối tượng có thể nói là được dùng nhiều nhất trong hầu hết các ứng dụng Android. Để thiết kế giao diện với một button ta có 2 cách như sau: • Thiết kế bằng XML: Trang 35
  • 36.
    <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/cmdButton1" android:text="Touch me!" android:onClick="touchMe"/> Thuộc tínhandroid:onClick="touchMe" được dùng để nắm bắt sự kiện click vào button. Khi sự kiện click button xảy ra thì phương thức “touchMe” được khai báo trong thẻ thuộc tính sẽ được gọi. Nếu trường hợp phương thức “touchMe” chưa được khai báo trong file mã nguồn tương ứng thì sẽ phát sinh một exception. Ngược lại, phương thức “touchMe” sẽ nhận được một đối tham biến là đối tượng View nơi đã phát sinh ra sự kiện. Đối tượng View này có thể ép kiểu trực tiếp sang kiểu Button vì thực chất nó là một button. VD: trong file mã nguồn khai báo một hàm như sau: public void touchMe(View v) { Button me = (Button) v; Me.setText(“Touched”); } • Thiết kế bằng code: Thực ra mà nói thì nếu không phải đòi hỏi phải custom lại một widget thì không cần phải sử dụng tới code. Trong một số trường hợp bắt buộc chúng ta phải custom các widget để cho phù hợp với hoàn cảnh. Chẳng hạn như trong game, các menu hay các nút điều khiển,… Để khai báo một Button trong code ta làm như sau: Button cmdButton = new Button(this); cmdButton.setText(“Touch Me!”); cmdButon.setOnClickListener(…); Để custom một widget nào đó ta phải tạo một class kế thừa từ class Widget muốn custom, sau đó sử dụng hàm draw để vẽ lại widget đó như m ột Canvas. VD: canvas.drawPicture(Picture.createFromStream(...)); 4. ImageButton: Cũng tương tự như Button, ImageButton chỉ có thêm một thuộc tính android: src = “@drawable/icon” để thêm hình ảnh vào và không có thẻ text. <ImageButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/cmdButton1" android:src="@drawable/icon" android:onClick="touchMe"/> Hình: ImageButton 5. ImageView: Trang 36
  • 37.
    Được dùng đểthể hiện một hình ảnh. Nó cũng giống như ImageButton, chỉ khác là không có hình dáng của một cái button. Hình: ImageView và ImageButton 6. ListView: Được sử dụng để thể hiện một danh sách các thông tin theo từng cell. Mỗi cell thông thường được load lên từ một file XML đ ã được cố định trên đó số lượng thông tin và loại thông tin cần được thể hiện. Để thể hiện được một list thông tin lên một screen thì cần phải có 3 yếu tố chính: • Data Source: Data Source có thể là một ArrayList, HashMap hoặc bất kỳ một cấu trúc dữ liệu kiểu danh sách nào. • Adapter: Adapter là một class trung gian giúp ánh xạ dữ liệu trong Data Source vào đúng vị trí hiển thị trong ListView. Chẳng hạn, trong Data Source có một trường name và trong ListView cũng có một TextView để thể hiện trường name này. Tuy nhiên, ListView sẽ không thể hiển thị dữ liệu trong Data Source lên được nếu như Adapter không gán dữ liệu vào cho đối tượng hiển thị. • ListView: ListView là đối tượng để hiển thị các thông tin trong Data Source ra một cách trực quan và người dùng có thể thao tác trực tiếp trên đó. Trang 37
  • 38.
    Hình: Minh hoạcho một ListView 7. TextView: TextView ngoài tác dụng là để hiển thị văn bản thì nó còn cho phép định dạng nội dung bằng thẻ html. VD: TextView textView = (TextView)findViewById(R.id.textView); CharSequence styledText = Html.fromHtml("<i>This</i> is some <b>styled</b> <s>text</s>"); textView.setText(styledText); Nội dung TextView cũng có thể được định dạng bằng thẻ html ngay trong XML. 8. EditText: Trong Android đối tượng EditText được sử dụng như một TextField hoặc một TextBox. <EditText android:id="@+id/EditText01" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textStyle="bold" android:textSize="20dip" android:textColor="#000000" android:text="Hello Android!" android:singleLine="true" android:inputType="textCapWords"/> Các thuộc tính cần chú ý sử dụng EditText đó là: • android:inputType = “…” sử dụng để xác định phương thức nhập cho EditText. Chẳng hạn như khi bạn muốn một ô để nhập password hay một ô để nhập Email thì thuộc tính này sẽ làm điều đó. • android:singleLine = “true” EditText của bạn sẽ trở thành một TextField, ngược lại sẽ là TextBox. 9. CheckBox: Nhận 2 giá trị true ho ặc false. Đối tượng CheckBox cho phép chọn nhiều item cùng một lúc. Khai báo: CheckBox cb = new CheckBox(Context …); XML: <CheckBox android:id="@+id/CheckBox01" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Check me" android:checked="true"/> 10. MenuOptions: Có 2 cách tạo một MenuOptions: • Tạo bằng code: public class Main extends Activity { private int searchBtnId = Menu.FIRST; private int scheduleBtnId = Menu.FIRST + 1; Trang 38
  • 39.
    private int playBtnId= Menu.FIRST + 2; private int stopBtnId = Menu.FIRST + 3; private int group1Id = 1; private int group2Id = 2; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.setContentView(R.layout.main); } @Override public boolean onCreateOptionsMenu(Menu menu) { menu.add(group1Id,searchBtnId ,searchBtnId,"Search"); menu.add(group2Id,scheduleBtnId,scheduleBtnId,R.string.schedule); menu.add(group2Id,playBtnId ,playBtnId,"Play"); menu.add(group2Id,stopBtnId ,stopBtnId,R.string.stop); // the following line will hide search // when we turn the 2nd parameter to false menu.setGroupVisible(1, false); return super.onCreateOptionsMenu(menu); } } Hình: Minh hoạ option menu • Tạo bằng XML <?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:icon="@drawable/icon" android:title="Item1" android:orderInCategory="1" android:id="@+id/item1"> <item android:title="Item 2" android:id="@+id/item2" android:orderInCategory="2"> <menu> <item android:id="@+id/item01" android:title="Sub item 1" android:orderInCategory="1/> <item android:title="Sub item 2" android:id="@+id/item02" android:orderInCategory="2"/> Trang 39
  • 40.
    </menu> </item> </menu> public boolean onCreateOptionsMenu(Menumenu) { new MenuInflater( getApplication()).inflate(R.menu.menu_options, menu); return super.onCreateOptionsMenu(menu); } 11. ContextMenu: ContextMenu được sử dụng để hiển thị các tuỳ chọn khi người dùng nhấn dài vào một cell nào đó trong ListView. Để tạo một ContextMenu ta cũng có 2 cách giống như tạo MenuOptions ở trên chỉ khác tên phương thức. Khi nhấn dài vào một cell trong ListView thì phương thức: public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) sẽ được gọi và truy ền vào 3 tham số là:  ContextMenu: đối tượng để add các context menu item  View: Đối tượng nơi mà xảy ra sự kiện  ContextMenuInfo: Cho biết vị trí xảy ra sự kiện trong ListView. Để biết được vị trí xảy ra sự kiện ta làm như sau: AdapterView.AdapterContextMenuInfo info; try { info = (AdapterView.AdapterContextMenuInfo) menuInfo; } catch (ClassCastException e) { return; } info.position Hình: Minh Họa Context Menu 12. Quick Search Box: Trang 40
  • 41.
    Một trong nhữngtính năng mới trong phiên bản Android 1.6 đó là Quick Search Box. Đây là khuôn khổ tìm kiếm mới trên toàn h ệ thống Android, điều này làm cho người dùng có thể nhanh chóng tìm kiếm bất c ứ thứ gì có trên chiếc điện thoại Android của họ và cả các tài nguyên trên web khi họ đang online. Nó tìm kiếm và hiển thị kết quả tìm kiếm ngay khi bạn đang gõ. Nó cũng cung cấp các kết quả từ các gợi ý tìm kiếm web, danh sách doanh nghiệp địa phương, và thông tin khác từ Google, chẳng hạn như báo giá cổ phiếu, thời tiết, và tình trạng chuyến bay. Tất cả điều này có sẵn ngay từ màn hình chủ, bằng cách khai thác trên Quick Search Box (QSB). Hình: Minh họa Quick Search Box 13. Activity và Intend: 13.1 Activity: Activity là một thành chính của một ứng dụng Android, được dùng để hiển thị một màn hình và nắm bắt các hoạt động xảy ra trên màn hình đó. Khi làm việc với Activity cần nắm bắt được một số kiến thức cơ bản như sau:  Chu kỳ sống của một Activity  Tạo menu và dialog  Khởi động một Activity: Để khởi động một Activity ta sử dụng Intend sẽ tìm hiểu kỹ hơn ở phần b. Tuy nhiên, trong phần này tôi sẽ hướng dẫn cách chuy ển giữa các Intend theo 2 loại: • Khai báo tường minh: Cung cấp chính xác thông tin của activity cần gọi b ằng cách truy ền vào tên class của Activity đó VD: Từ Activity A muốn chuy ển qua Activity B ta khai báo một Intend trong Activity A: Intend intend = new Intend(this, B.class); startActivity(intend); • Khai báo không tường minh: Trang 41
  • 42.
    Cung cấp cácthao tác cần làm gì với loại dữ liệu nào, hệ thống sẽ tìm đến activity tương ứng để khởi động. Intent i = new Intent(); i.setAction(Intent.ACTION_VIEW); i.setData(Uri.withAppendedPath( android.provider.Contacts.People.CONTENT_URI, "1)); startActivity(i);  Tính liên lạc giữa 2 activity: Khi chuyển sang một Activity khác ta có th ể gửi kèm dữ liệu trong intend đó như sau: intend.putExtra(“key1”, “value1”); intend.putExtra(“key2”, 23); Bên phía Activity được khởi động hay được chuy ển đế n, có thể lấy dữ liệu được gửi như sau: getIntend().getExtra().getString(“key1”); getIntend().getExtra().getInt(“key2”);  Task: Android là một hệ điều hành đa tiến trình. Khi lập trình trên nền tảng Android thì tiến trình là một vấn đề cần phải được chú ý nhiều nhất. Mặc dù Android hỗ trợ đa tiến trình nhưng trên một thiết bị di động với c ấu hình thấp mà chúng ta quá lạm dụng tiến trình thì sẽ rất tốn bộ xử lý điều này cũng đồng nghĩa với việc bạn đang biến ứng dụng của bạn trở thành một thứ phần mềm tiêu thụ điện năng. 13.2 Intent:  Khái niệm Intent:  Là một cấu trúc dữ liệu mô tả cách thức, đối tượng thực hiện của một Activity  Là cầu nối giữa các Activity: ứng dụng Android thường bao gồm nhiều Activity, mỗi Activity ho ạt động độc lập với nhau và thực hiện những công việc khác nhau. Intent chính là người đưa thư, giúp các Activity có thể triệu gọi cũng như truyền các dữ liệu cần thiết tới một Activity khác. Điều này cũng giống như việc di chuy ển qua lại giữa các Forms trong lập trình Windows Form. Hình: truyền dữ liệu giữa 2 Activity  Dữ liệu Intent:  Intent về cơ bản là một cấu trúc dữ liệu, được mô tả trong lớp android.content.Intent Trang 42
  • 43.
     Các thuộctính của một đối tượng Intend: Thuộc Tính Chính Thuộc Tính Phụ action _ tên (string) của action mà Intent sẽ yêu cầu thực hiện _ có thể là Action được Android định nghĩa sẵn (built-in standard action) hoặc do người lập trình tự định nghĩa category _ thông tin về nhóm action type _ định dạng kiểu dữ liệu (chuẩn MIME) _ thường được tự động xác định data _ dữ liệu mà Activity được gọi sẽ xử lí _ định dạngUri (thong qua hàm Uri.parse(data)) component _ chỉ định cụ thể lớp sẽ thực thi Activity _ khi được xác định, các thuộc tính khác trở thành không bắt buộc (optional) extras _ chứa tất cả các cặp (key, value) do ứng dụng thêm vào để truyền qua Intent (cấu trúc Bundle) http://developer.android.com/reference/android/content/Intent.html Hình: Các thuộc tính của Intent Các Action được định nghĩa sẵn: Dưới đây là những hằng String đã được định nghĩa sẵn trong lớp Intent. Đi kèm với nó là các Activity hay Application được xây dựng sẵn sẽ được triệu gọi mỗi khi Intent tương ứng được gửi (tất nhiên khi được cung cấp đúng data). VD: Gọi tới một số điện thoại: Intent dialIntent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:123456")); startActivity(dialIntent); Hình: Các Action đã được định nghĩa sẵn trong Intent Trang 43
  • 44.
    CHƯƠNG V: PHÂNTÍCH VÀ THIẾT KẾ HỆ THỐNG 1. Đặc tả bài toán: Đối với mọi chiếc điện thoại di động Contact là ứng dụng không thể thiếu, dùng để quản lý danh bạ điện thoại, thông tin của những cá nhân cần liên lạc trong danh bạ. Trong Android trên phiên bản mới nhất hiện nay cũng đã có hỗ trợ ứng dụng Contact với nhiều chức năng cơ bản giống các ứng dụng thông thường khác trên các điện thoại di động. Ngoài ra, còn có một số chức năng nổi trội như:  Hỗ trợ kết nối với ứng dụng Map, có thể định vị người cần liên lạc thông qua địa chỉ được lưu trong Contact.  Cho phép lưu trữ nhiều số điện thoại, email, address của người dùng trong Contact.  Cho phép đồng bộ hoá giữa các contact trong điện thoại và trong tài khoản Gmail và tài khoản trên mạng xã hội facebook. Mặc dù, ứng dụng contact của Android đã cung cấp khá nhiều chức năng nhưng ứng dụng này vẫn còn nhiều hạn chế, đặc biệt thiếu nhiều chức năng cơ bạn như quản lý Group, xác lập lại số điện thoại chính hay Email chính. Ngoài ra, với một số người sử dụng thì thông tin lưu trong Contact cũng rất quan trọng. Đề phòng mất điện thoại hay tránh để người khác truy cập vào những thông tin khác được lưu trong điện thoại hoặc khi bị mất các contact do các tác động ngoại cảnh hoặc khi thay số thuê bao. Do đó, ứng dụng PhoneBookSafeManager phát triển trên nền tảng ứng dụng Contact sẵn có trong Android, sẽ đáp ứng nhu cầu bảo mật thông tin cá nhân được lưu trong Contact, đồng thời cải tiến một vài chức năng khác còn hạn chế của ứng dụng Contact trong Android nhằm giúp cho người dùng có thể yên tâm contact của họ được bảo vệ an toàn. Kết luận: bài toán đặt ra cho chúng ta là: Xây dựng một ứng dụng cho phép người sử dụng điện thoại Android quản lý các contact của họ một cách an toàn, hiệu quả, dễ dàng chia sẽ, dễ dàng quản lý và tìm kiếm. 2. Đặc tả chức năng: 2.1Upload phone book:  Mô tả chức năng: Chức năng upload phone book cho phép người dùng lưu trữ toàn bộ sổ contact của họ vào tài khoản online. Tuy nhiên, một số thông tin ít sử dụng sẽ được lược bỏ bớt nhằm giảm kích thước của nội dung XML khi đóng gói.  Mô tả hoạt động: 1. Đọc tất cả các thông tin trong phone book và lưu vào một list các contacts. 2. Phân tích list các contact đó thành nội dung XML dựa vào kỹ thuật XStream. 3. Kết nối tới webservice và gửi nội dung XML kèm theo các thông tin tài khoản người dùng cần thiết. 4. Webservice lưu nội dung XML vào đúng tài khoản người dùng. 5. Webservice trả về một thông điệp thông báo là đã lưu hoặc nếu không lưu được. Trang 44
  • 45.
    Hình: Quá trìnhupload nội dung XML tới Webserver bằng giao thức SOAP. 2.2Revert phone book:  Mô tả chức năng: Cho phép người dùng có thể lấy lại các bản phone book mà đã từng upload trước đây.  Mô tả hoạt động: 1. Người dùng chọn phiên bản cần upload. 2. Ứng dụng gửi ID của phiên bản và thông tin về tài khoản người dùng tới webservice. 3. Webservice chịu trách nhiệm tìm kiếm dữ liệu tương ứng với ID mà người dùng đã gửi. 4. Ứng dụng nhận dữ liệu trả về từ webservice và phân tích nội dung XML thành một list contact. 5. Cảnh báo người dùng trước khi thay thế phone book. 6. Ghi các dữ liệu trong phiên bản lấy về vào điện thoại. Hình: Mô tả quá trình revert phone book 2.3 Send contact:  Mô tả chức năng: Cho phép người dùng gửi một ho ặc nhiều contact tới một hoặc nhiều người khác cũng có tài khoản của ứng dụng.  Mô tả hoạt động: 1. Chuyển đổi các contact cần gửi thành nội dung XML. 2. Gửi yêu cầu tới webservice kèm theo nội dung XML, thông tin tài khoản và các thông tin cần thiết khác. Webservice gửi nội dung XML vào contact box c ủa người nhận và trả về thông điệp nếu gửi thành công. 2.4 Reveive contact: • Mô tả chức năng: Thông báo tới người dùng nếu có ai đó gửi contact tới tài khoản của họ bằng một thông điệp. Đồng thời, người dùng cũng có thể xem và lưu các contact hoặc gỡ bỏ chúng. Trang 45
  • 46.
    Hình: Quá trìnhgửi và nhận contact 2.5 Export contact tới SD Card: • Mô tả chức năng: Chức năng export to an SD Card cho phép người dùng chia sẻ hoặc backup các contact của họ vào thẻ nhớ dưới dạng XML. Khi người dùng cần chia sẻ họ có thể trao đổi thông qua thẻ nhớ hoặc có thể gửi file XML này đi bất kỳ đâu và người nhận có thể phân tích file XML này thành các contact như cũ. Hình: Quá trình lưu contact xuống SD Card 2.6Import contact từ SD Card: • Mô tả chức năng: Ngược lại với chức năng export to SD Card thì chức năng này được dùng để phân tích ngược lại từ một file XML thành các contact. Hình: Quá trình đọc contact từ SD Card Trang 46
  • 47.
    2.7 Account Manager: 2.7.1Login: • Mô tả chức năng: Chức năng login không phải được thiết kế để bảo vệ hệ thống mà chủ yếu là sử dụng để quản lý người dùng và dữ liệu người dùng trên server. Khi người dùng login thì username and password sẽ được lưu lại để làm chìa khoá liên lạc với server, đảm bảo rằng dữ liệu được an toàn và dễ dàng truy xuất. Hay nói cách khác mỗi username là một định danh giúp server quản lý được dữ liệu của họ. 2.7.2 Change password: • Mô tả chức năng: Chức năng này giúp người dùng quản lý an toàn hơn tài khoản của họ. Để sử dụng được chức năng này bắt buộc người dùng phải đăng nhập vào tài khoản cũ. Sau người dùng touch chọn passowrd mới thì ứng dụng sẽ gửi password mới và các thông tin người dùng lên web service và web service sẽ thực hiện việc hay đổi password. 2.7.3 Restore account: • Mô tả chức năng: Khi quên username hoặc password thì người dùng có thể sử dụng chức năng này để khôi phục lại tài khoản của họ. Ứng dụng sẽ bắt buộc người dùng phải nhập một email dự phòng trong khi tạo tài khoản để ứng dụng có thể gửi tài khoản của họ vào email đó. Dưới đây là qui trình khôi phục tài khoản của người dùng: Hình: Quá trình khôi phục tài khoản người dùng 2.7.4 Create account: Thay vì phải tạo tài khoản trên một trang web, điều này sẽ không đảm bảo an toàn và thực sự là một phiền phức không cần thiết. Do đó, ứng dụng cung cấp chức năng tạo tài khoản ngay trên màn hình đăng nhập của ứng dụng nhằm tạo điều kiện thuận lợi nhất đối Trang 47
  • 48.
    với người dùng.Để tạo tài khoản người dùng cần nhập các thông tin: Username, Password, Confirm password, Email. 3. Các biểu đố hệ thống: 3.1Biểu đồ Usercase: Mô hình usercase dưới đây thể hiện cho số lượng chức của hệ thống mà người dùng có thể tương tác đư ợc trực tiếp. Hình: Sơ đồ Use Case tổng quát 3.1.1 Restore account: Hình: Usercase khôi phục tài khoản 3.1.2 Export Contact vào SD Card: Hình: Usercase Export contact từ sd card 3.1.3 Import Contact từ SD Card: Trang 48
  • 49.
    Hình: Usercase Importcontact từ sd card 3.1.4 Login: Hình: Usercase chức năng Login 3.2 Biểu đồ lớp: 3.2.1 Biểu đồ lớp giữa các thành phần giao diện: 3.2.2 Biểu đồ lớp Contact: Trang 49
  • 50.
    3.2.3 Biểu đồlớp ContactProvider: 3.2.4 Class Webservice: 3.3Biểu đồ tuần tự: 3.3.1 Login: Trang 50
  • 51.
    Bước 1: Ngườidùng nhập username, password và nhấn nút login Bước 2: Chức năng Login thực hiện triệu gọi hàm CheckLogin trên webservice và truyền các tham số username, password vào. Bước 3: Hàm CheckLogin truy vấn vào CSDL để kiểm tra username và password có tồn tại hay không. Bước 4, 5, 6: Trả về kết quả valid, invalid hoặc exception do lỗi kết nối. 3.3.2 Create new account: Bước 1: Người dùng nh ập username, password, confirm password, email. Bước 2: Kiểm tra thông tin nhập vào có hợp lệ hay không. Bước 3: Triệu gọi hàm tạo tài khoản trên web service. Đồng thời, gửi lên các tham số tương ứng. Bước 4: Hàm tạo tài khoản trên web service sẽ thực hiện lệnh SQL để insert thông tin tài kho ản mới vào. Bước 5, 6: Trả về kết quả của quá trình tạo tài khoản cho người dùng bằng một message. 3.3.3 Restore account: Trang 51
  • 52.
    Bước 1: Ngườidùng nhập địa chỉ email dự phòng đã được nhập trong quá trình tạo tài khoản trước đây. Bước 2: Kiểm tra biểu thức email có chính xác hay không. Bước này nhằm mục đích giảm thời gian kiểm tra trên server nếu như email không chính xác. Bước 3: Triệu gọi từ xa hàm RestoreAccount trên web service. Bước 4: Thực hiện truy vấn để lấy về thông tin tài kho ản trong CSDL. Bước 5, 6: Trả thông tin tài khoản về Client. Bước 7: Client sẽ thực hiện gửi thông tin tài khoản vào email dự phòng của người dùng. Người dùng sẽ truy cập email dự phòng của họ để xem lại thông tin tài khoản và có thể đăng nhập lại để đổi thông tin tài khoản. 3.3.4 Upload phone book: Bước 1, 2: Đọc tất cả các Contact trong phone book và lưu vào một list Bước 3: Chuy ển đổi Contact list thành XML Trang 52
  • 53.
    Bước 4, 5:Triệu gọi hàm BackupConatct trên Webservice và truy ền vào các tham số là các thông tin upload, UserID, hàm này sẽ thực hiện chèn dữ liệu vào CSDL tương ứng với tài kho ản của người dùng. Bước 6, 7: Trả về kết qu ả là đ ã upload thành công hay không. 3.3.5 Revert phone book: Bước 1, 2: Đọc tất cả các Contact trong phone book và lưu vào một list Bước 3: Chuy ển đổi Contact list thành XML Bước 4, 5: Triệu gọi hàm BackupConatct trên Webservice và truy ền vào các tham số là các thông tin upload, UserID, hàm này sẽ thực hiện chèn dữ liệu vào CSDL tương ứng với tài kho ản của người dùng. Bước 6, 7: Trả về kết qu ả là đ ã upload thành công hay không. 3.3.6 Export Contact to SD Card: 3.3.7 Import Contact from SD Card: Trang 53
  • 54.
    Bước 1, 2:Đọc file từ SD Card. Bước 3, 4: Convert nội dung XML đ ã được đọc từ file thành Contact list và ghi các Contact đó vào phone book trong điện thoại Android. 3.3.8 Send Contact: Biểu đồ sequence send Contact thể hiện ở mức hệ thống quá trình gửi các Contact tới một tài khoản nào đó cũng được quản lý bởi h ệ thống. Để tiết kiệm bộ nhớ, khi hiển thị một Contact list nào đó thì chỉ những thông tin cần hiển thị được load vào bộ nhớ còn những thông tin khác thì không được load. Vì vậy, để gửi các Contact tới một người dùng nào đó ứng dụng sẽ thực hiện qua các bước như biểu đồ được mô tả chi tiết sau: Trang 54
  • 55.
    Bước 1, 2,3, 4: Đọc các thông tin đầy đủ của các Contact đã được chọn và trả về một Contact list. Bước 5, 6: Convert Contact list thành nội dung XML và triệu gọi từ xa hàm SendContact từ web service. Đồng thời truy ền vào các tham số là nội dung cần gửi và các thông tin cần thiết như ngư ời gửi, người nhận, ngày gửi, … Bước 7: Add nội dung gửi và các thông tin gửi vào một table. Từ table này tất cả các người dùng sẽ truy cập vào và lấy các dữ liệu của họ. Bước 8, 9: Trả về một thông điệp thông báo cho người dùng biết là đ ã gửi được hay chưa cũng như các trường hợp lỗi. 3.4Biểu đồ hoạt động: 3.4.1 Change password: 3.4.2 Export Contact to SD Card: Trang 55
  • 56.
    3.4.3 Import Contactfrom SD Card 3.4.4 Upload phone book: Trang 56
  • 57.
    3.4.5 Send Contact: 3.4.6Revert phone book: Trang 57
  • 58.
    4. Cơ sởdữ liệu Web Service:  Bảng ACCOUNTS: Được dùng để lưu trữ thông tin tài khoản người dùng. Thuộc tính của các field như sau: Trang 58
  • 59.
    Field Name Type USERNAMEnvarchar(50) PASSWORD nvarchar(50) EMAIL nvarchar(100) USERID bigint, primary key  Bảng BACKUP_CONTACT: Được dùng để lưu trữ các phiên bản phone book của người dung Thuộc tính: Field Name Type CONTENT_BACKUP xml USERID bigint NOTE nvarchar(MAX), allow null DATE nvarchar(30) TIME nvarchar(30) VERSION_ID bigint, primary key  Bảng MYUSERNAME: Được dùng để lưu trữ tên tài kho ản của những người bạn có sử dụng hệ thống phone book safe. Cũng giống như khi chat yahoo hoặc skype thì đều có một contact list nhằm giúp bạn dễ dàng quản lý và tìm kiếm khi cần. Thuộc tính: Field Name Type USERID bigint DISPLAY_NAME nvarchar(100), allow null USERNAME nvarchar(50) IMAGE image, allow null ID bigint  Bảng SHARE: Khi một user nào đó gửi dữ liệu tới một người khác thì dữ liệu đó kèm các thông tin liên quan sẽ được lưu vào bảng này. Các ứng dụng sẽ tự động truy cập vào bảng này để lấy dữ liệu của user tương ứng. Thuộc tính: Field Name Type USERID bigint SENDER nvarchar(50) RECEIVER nvarchar(50) CONTENT_SENT xml Trang 59
  • 60.
    DATE nvarchar(30) TIME nvarchar(30) NOTEnvarchar(MAX), allow null ID bigint Trang 60
  • 61.
    CHƯƠNG VI: DEMOỨNG DỤNG Trang 61
  • 62.
    TÀI LIỆU THAMKHẢO [1] Copyright © 2008 by Chris Haseman. Android Essentials. Appres® [2] Copyright © 2009 by Mark L.Murphy. Beginning Android. Appress® [3] Copyright © 2009 by Sayed Y. Hashimi and Satya Komatineni. Pro Android. Appress ® [4] Copyright © 2008 by The McGraw-Hill Companies. Android™ A Programmer’s Guide® [5] Copyright © 2008 by Ed Burnette. Hello, Android. (Introducing Google’s Mobile Development Platform) [6] Copyright © 2009 by W. FRANK ABLESON, CHARLIE COLLINS, ROBI SEN. Unlocking Android Trang 62