Đại học Công Nghệ - Hutech
ĐỒ ÁN CƠ SỞ
Hệ điều hành Android và xây dựng
ứng dụng Quản lí chi tiêu
Môn : Đồ án cơ sở
1|Page
Đại học Công Nghệ - Hutech
Lời nói đầu
Android là một trong những hệ điều hành mã nguồn mở lớn nhất dành
cho các thiết bị di động hiện nay. Qua các năm từ những ngày ra mắt phiên bản
đầu tiên, Android dần trở nên vô cùng mạnh mẽ và chiếm lấy lòng tin và sự
đón nhận của cộng đồng người dùng cũng như các hãng sản xuất điện tử lớn
trên thế giới. Tiềm năng cũng như sự phát triển vượt bậc của hệ điều hành này
chắc chắn sẽ còn tiến xa và cao hơn nữa trên thị phần hệ điều hành di động.
Đồ án này bao gồm 4 phần chính tương ứng với 4 chương : Tổng quan về
Android, Kiến trúc Hệ điều hành, Cấu trúc cơ bản của ứng dụng, Lập trình trên
nền tảng Android.
Đồ án chắc chắn sẽ còn nhiều thiếu sót, mong Giảng viên hỗ trợ sẽ thông
cảm và góp ý cho chúng em. Chúng em xin chân thành cảm ơn.
TP.Hồ Chí Minh, tháng 5 năm 2016
Nhóm sinh viên thực hiện
Đặng Tấn Tiến
Nguyễn Bảo Ngọc Bảo
Mục Lục
2|Page
Đại học Công Nghệ - Hutech
Chương 1 : Tổng Quan Android
1.1 Sơ lược về hệ điều hành android
Android là một hệ điều hành dựa trên nền tảng Linux được thiết kế dành cho
các thiết bị di động có màn hình cảm ứng như điện thoại thông minh và máy tính
bảng. Ban đầu, Android được phát triển bởi Tổng công ty Android, với sự hỗ trợ tài
chính từ Googlevà sau này được chính Google mua lại vào năm 2005. Android ra mắt
vào năm 2007 cùng với tuyên bố thành
lập Liên minh thiết bị cầm tay mở: một
hiệp hội gồm các công ty phần cứng, phần
mềm, và viễn thông với mục tiêu đẩy mạnh
các tiêu chuẩn mở cho các thiết bị di
động. Chiếc điện thoại đầu tiên chạy
Android được bán vào tháng 10 năm 2008.
Android có mã nguồn mở và Google
phát hành mã nguồn theo Giấy phép
Apache. Chính mã nguồn mở cùng với một giấy phép không có nhiều ràng buộc đã
cho phép các nhà phát triển thiết bị, mạng di động và các lập trình viên nhiệt huyết
được điều chỉnh và phân phối Android một cách tự do. Ngoài ra, Android còn có một
cộng đồng lập trình viên đông đảo chuyên viết các ứng dụng để mở rộng chức năng
của thiết bị, bằng một loại ngôn ngữ lập trình Java có sửa đổi. Vào tháng 10 năm
2012, có khoảng 700.000 ứng dụng trên Android, và số lượt tải ứng dụng từ Google
Play, cửa hàng ứng dụng chính của Android, ước tính khoảng 25 tỷ lượt.
Những yếu tố này đã giúp Android trở thành nền tảng điện thoại thông minh
phổ biến nhất thế giới, vượt qua Symbian vào quý 4 năm 2010 và được các công ty
công nghệ lựa chọn khi họ cần một hệ điều hành không nặng nề, có khả năng tinh
chỉnh, và giá rẻ chạy trên các thiết bị công nghệ cao thay vì tạo dựng từ đầu. Kết quả
là mặc dù được thiết kế để chạy trên điện thoại và máy tính bảng, Android đã xuất
hiện trên TV, máy chơi game và các thiết bị điện tử khác. Bản chất mở của Android
3|Page
Đại học Công Nghệ - Hutech
cũng khích lệ một đội ngũ đông đảo lập trình viên và những người đam mê sử dụng
mã nguồn mở để tạo ra những dự án do cộng đồng quản lý. Những dự án này bổ
sung các tính năng cao cấp cho những người dùng thích tìm tòi hoặc đưa Android
vào các thiết bị ban đầu chạy hệ điều hành khác.
Android chiếm 75% thị phần điện thoại thông minh trên toàn thế giới vào thời
điểm quý 3 năm 2012, với tổng cộng 500 triệu thiết bị đã được kích hoạt và 1,3 triệu
lượt kích hoạt mỗi ngày. Sự thành công của hệ điều hành cũng khiến nó trở thành
mục tiêu trong các vụ kiện liên quan đến bằng phát minh, góp mặt trong cái gọi là
"cuộc chiến điện thoại thông minh" giữa các công ty công nghệ.
1.2 Lịch sử
Tổng công ty Android (Android, Inc.) được thành lập tại Palo Alto,
California vào tháng 10 năm 2003 bởi Andy Rubin (đồng sáng lập công ty
Danger), Rich Miner (đồng sáng lập Tổng công ty Viễn thông Wildfire), Nick Sears
(từng là Phó giám đốc T-Mobile), và Chris White (trưởng thiết kế và giao diện
tại WebTV) để phát triển, theo lời của Rubin, "các thiết bị di động thông minh hơn có
thể biết được vị trí và sở thích của người dùng". DÙ những người thành lập và nhân
viên đều là những người có tiếng tăm, Tổng công ty Android hoạt động một cách âm
thầm, chỉ tiết lộ rằng họ đang làm phần mềm dành cho điện thoại di động. Trong
năm đó, Rubin hết kinh phí. Steve Perlman, một người bạn thân của Rubin, mang cho
ông 10.000 USD tiền mặt nhưng từ chối tham gia vào công ty.
Google mua lại Tổng công ty Android vào ngày 17 tháng 8 năm 2005, biến nó
thành một bộ phận trực thuộc Google. Những nhân viên của chủ chốt của Tổng công
ty Android, gồm Rubin, Miner và White, vẫn tiếp tục ở lại công ty làm việc sau
thương vụ này. Vào thời điểm đó không có nhiều thông tin về Tổng công ty, nhưng
nhiều người đồn đoán rằng Google dự tính tham gia thị trường điện thoại di
động sau bước đi này. Tại Google, nhóm do Rubin đứng đầu đã phát triển một nền
tảng thiết bị di động phát triển trên nềnnhân Linux. Google quảng bá nền tảng này
cho các nhà sản xuất điện thoại và các nhà mạng với lời hứa sẽ cung cấp một hệ
thống uyển chuyển và có khả năng nâng cấp. Google đã liên hệ với hàng loạt hãng
phần cứng cũng như đối tác phần mềm, bắn tin cho các nhà mạng rằng họ sẵn sàng
hợp tác với các cấp độ khác nhau.
Ngày càng nhiều suy đoán rằng Google sẽ tham gia thị trường điện thoại di
động xuất hiện trong tháng 12 năm 2006. Tin tức của BBC và Nhật báo phố Wall chú
thích rằng Google muốn đưa công nghệ tìm kiếm và các ứng dụng của họ vào điện
thoại di động và họ đang nỗ lực làm việc để thực hiện điều này. Các phương tiện
truyền thông truyền thống lẫn online cũng viết về tin đồn rằng Google đang phát
triển một thiết bị cầm tay mang thương hiệu Google. Một vài tờ báo còn nói rằng
4|Page
Đại học Công Nghệ - Hutech
trong khi Google vẫn đang thực hiện những bản mô tả kỹ thuật chi tiết, họ đã trình
diễn sản phẩm mẫu cho các nhà sản xuất điện thoại di động và nhà mạng. Tháng 9
năm 2007, InformationWeek đăng tải một nghiên cứu của Evalueserve cho biết
Google đã nộp một số đơn xin cấp bằng sáng chế trong lĩnh vực điện thoại di động.
Ngày 5 tháng 11 năm 2007, Liên minh thiết bị cầm tay mở (Open Handset
Alliance), một hiệp hội bao gồm nhiều công ty trong đó có Texas Instruments, Tập
đoàn Broadcom,Google, HTC, Intel, LG, Tập đoàn Marvell
Technology, Motorola, Nvidia, Qualcomm, Samsung Electronics, Sprint Nextel và TMobile được thành lập với mục đích phát triển cáctiêu chuẩn mở cho thiết bị di
động. Cùng ngày, Android cũng được ra mắt với vai trò là sản phẩm đầu tiên của Liên
minh, một nền tảng thiết bị di động được xây dựng trênnhân Linux phiên bản
2.6. Chiếc điện thoại chạy Android đầu tiên được bán ra là HTC Dream, phát hành
ngày 22 tháng 10 năm 2008. Biểu trưng của hệ điều hành Android mới là một con
rôbốt màu xanh lá cây do hãng thiết kế Irina Blok tại California vẽ.
Từ năm 2008, Android đã trải qua nhiều lần cập nhật để dần dần cải tiến hệ
điều hành, bổ sung các tính năng mới và sửa các lỗi trong những lần phát hành
trước. Mỗi bản nâng cấp được đặt tên lần lượt theo thứ tự bảng chữ cái, theo tên
của một món ăn tráng miệng; ví dụ như phiên bản 1.5 Cupcake (bánh bông lan nhỏ
có kem) tiếp nối bằng phiên bản 1.6 Donut (bánh vòng). Phiên bản mới nhất hiện nay
là 5.0 Lollipop. Vào năm 2010, Google ra mắt loạt thiết bị Nexus—một dòng sản
phẩm bao gồm điện thoại thông minh và máy tính bảng chạy hệ điều hành Android,
do các đối tác phần cứng sản xuất. HTC đã hợp tác với Google trong chiếc điện thoại
thông minh Nexus đầu tiên, Nexus One. Kể từ đó nhiều thiết bị mới hơn đã gia nhập
vào dòng sản phẩm này, như điện thoại Nexus 4 và máy tính bảng Nexus 10, lần lượt
do LG và Samsung sản xuất. Google xem điện thoại và máy tính bảng Nexus là những
thiết bị Android chủ lực của mình, với những tính năng phần cứng và phần mềm mới
nhất của Android
1.3 Các phiên bản android
Lịch sử phiên bản của hệ điều hành di động Android bắt đầu với bản
Android beta vào tháng 11 2007. Phiên bản thương mại đầu tiên, Android 1.0, được
phát hành vào tháng 9 2008. Android đang được phát triển bởiGoogle và Open
Handset Alliance (OHA), và đã có một số bản cập nhật cho hệ điều hành này kể từ khi
5|Page
Đại học Công Nghệ - Hutech
ra mắt.
Từ tháng 4 2009, phiên bản Android được phát triển dưới tên mã là chủ đề
bánh kẹo và phát hành theo thứ tự bảng chữ cái: Cupcake (1.5), Donut (1.6), Eclair
(2.0–2.1), Froyo (2.2–2.2.3), Gingerbread (2.3–2.3.7), Honeycomb (3.0–3.2.6), Ice
Cream Sandwich (4.0–4.0.4), Jelly Bean (4.1–4.3), KitKat (4.4), Lollipop (5.0-5.1.1).
Vào 3 tháng 9 2013, Google công bố rằng 1 tỉ thiết bị đã được kích hoạt hiện sử dụng
Android OS trên toàn cầu. Bản cập nhật Android gần đây nhất là KitKat 4.4, nó được
phát hành bản thương mại trên thiết bị 22 tháng 11 2013, thông qua cập nhật OTA
1.4 Mô tả
1.4.1 Giao diện
Giao diện người dùng của Android dựa trên nguyên tắc tác động trực tiếp, sử
dụng cảm ứng chạm tương tự như những động tác ngoài đời thực như vuốt,
chạm, kéo giãn và thu lại để xử lý các đối tượng trên màn hình. Sự phản ứng với
tác động của người dùng diễn ra gần như ngay lập tức, nhằm tạo ra giao diện
cảm ứng mượt mà, thường dùng tính năng rung của thiết bị để tạo phản hồi
rung cho người dùng. Những thiết bị phần cứng bên trong như gia tốc kế, con
quay hồi chuyển và cảm biến khoảng cách được một số ứng dụng sử dụng để
phản hồi một số hành động khác của người dùng, ví dụ như điều chỉnh màn
6|Page
Đại học Công Nghệ - Hutech
hình từ chế độ hiển thị dọc sang chế độ hiển thị ngang tùy theo vị trí của thiết
bị, hoặc cho phép người dùng lái xe đua bằng xoay thiết bị, giống như đang điều
khiển vô-lăng.
Các thiết bị Android sau khi khởi động sẽ hiển thị màn hình chính, điểm khởi
đầu với các thông tin chính trên thiết bị, tương tự như khái niệm desktop (bàn
làm việc) trên máy tính để bàn. Màn hính chính Android thường gồm nhiều biểu
tượng (icon) và tiện ích (widget); biểu tượng ứng dụng sẽ mở ứng dụng tương
ứng, còn tiện ích hiển thị những nội dung sống động, cập nhật tự động như dự
báo thời tiết, hộp thư của người dùng, hoặc những mẩu tin thời sự ngay trên
màn hình chính. Màn hình chính có thể gồm nhiều trang xem được bằng cách
vuốt ra trước hoặc sau, mặc dù giao diện màn hình chính của Android có thể tùy
chỉnh ở mức cao, cho phép người dùng tự do sắp đặt hình dáng cũng như hành
vi của thiết bị theo sở thích. Những ứng dụng do các hãng thứ ba có trên Google
Play và các kho ứng dụng khác còn cho phép người dùng thay đổi "chủ đề" của
màn hình chính, thậm chí bắt chước hình dáng của hệ điều hành khác
nhưWindows Phone chẳng hạn. Phần lớn những nhà sản xuất, và một số nhà
mạng, thực hiện thay đổi hình dáng và hành vi của các thiết bị Android của họ
để phân biệt với các hãng cạnh tranh.
Ở phía trên cùng màn hình là thanh trạng thái, hiển thị thông tin về thiết bị và
tình trạng kết nối. Thanh trạng thái này có thể "kéo" xuống để xem màn hình
thông báo gồm thông tin quan trọng hoặc cập nhật của các ứng dụng, như email
hay tin nhắn SMS mới nhận, mà không làm gián đoạn hoặc khiến người dùng
cảm thấy bất tiện. Trong các phiên bản đời đầu, người dùng có thể nhấn vào
thông báo để mở ra ứng dụng tương ứng, về sau này các thông tin cập nhật được
bổ sung theoe tính năng, như có khả năng lập tức gọi ngược lại khi có cuộc gọi
nhỡ mà không cần phải mở ứng dụng gọi điện ra. Thông báo sẽ luôn nằm đó
cho đến khi người dùng đã đọc hoặc xóa nó đi.
Giao diện chính
Android 6.0
7|Page
Đại học Công Nghệ - Hutech
1.4.2 Ứng dụng
Android có lượng ứng dụng của
bên thứ ba ngày càng nhiều, được
chọn lọc và đặt trên một cửa hàng
ứng dụng như Google
Play hayAmazon Appstore để người
dùng lấy về, hoặc bằng cách tải xuống
rồi cài đặt tập tin APK từ trang web
khác. Các ứng dụng trên Cửa hàng
Play cho phép người dùng duyệt, tải
về và cập nhật các ứng dụng do
Google và các nhà phát triển thứ ba
phát hành. Cửa hàng Play được cài đặt
sẵn trên các thiết bị thỏa mãn điều
kiện tương thích của Google. Ứng
dụng sẽ tự động lọc ra một danh sách các ứng dụng tương thích với thiết bị của
người dùng, và nhà phát triển có thể giới hạn ứng dụng của họ chỉ dành cho những
nhà mạng cố định hoặc những quốc gia cố định vì lý do kinh doanh. Nếu người dùng
mua một ứng dụng mà họ cảm thấy không thích, họ được hoàn trả tiền sau 15 phút
kể từ lúc tải về, và một vài nhà mạng còn có khả năng mua giúp các ứng dụng trên
Google Play, sau đó tính tiền vào trong hóa đơn sử dụng hàng tháng của người
dùng. Đến tháng 9 năm 2012, có hơn 675.000 ứng dụng dành cho Android, và số
lượng ứng dụng tải về từ Cửa hàng Play ước tính đạt 25 tỷ.
Các ứng dụng cho Android được phát triển bằng ngôn ngữ Java sử dụng Bộ
phát triển phần mềm Android (SDK). SDK bao gồm một bộ đầy đủ các công cụ dùng
để phát triển,[47]gồm có công cụ gỡ lỗi, thư viện phần mềm, bộ giả lập điện thoại dựa
trên QEMU, tài liệu hướng dẫn, mã nguồn mẫu, và hướng dẫn từng bước. Môi
trường phát triển tích hợp(IDE) được hỗ trợ chính thức là Eclipse sử dụng phần bổ
sung Android Development Tools (ADT). Các công cụ phát triển khác cũng có sẵn,
gồm có Bộ phát triển gốc dành cho các ứng dụng hoặc phần mở rộng viết bằng C
hoặc C++, Google App Inventor, một môi trường đồ họa cho những nhà lập trình mới
bắt đầu, và nhiều nền tảng ứng dụng web di động đa nền tảng phong phú.
Để vượt qua những hạn chế khi tiếp cận các dịch vụ của Google do sự Kiểm
duyệt Internet tại Cộng hòa Nhân dân Trung Hoa, các thiết bị Android bán tại Trung
Quốc lục địa thường được điều chỉnh chỉ được sử dụng dịch vụ đã được duyệt.
8|Page
Đại học Công Nghệ - Hutech
1.6 Thị phần
Công ty nghiên cứu thị trường Canalys đã ước tính trong quý 2 năm 2009
rằng Android có 2,8% thị phần điện thoại thông minh được bán ra toàn cầu. Đến quý
4 năm 2010 con số này tăng lên 33% thị phần, trở thành nền tảng điện thoại thông
minh bán chạy hàng đầu. Đến quý 3 năm 2011 Gartner ước tính rằng hơn một nửa
(52,5%) thị trường điện thoại thông minh thuộc về Android. Đến quý 3 năm 2012
Android đã có 75% thị phần điện thoại thông minh toàn cầu theo nghiên cứu của
hãng IDC.
Vào tháng 7 năm 2011, Google nói rằng có 550.000 thiết bị Android mới được
kích hoạt mỗi ngày, đỉnh điểm là 400.000 máy một ngày vào tháng 5, và có hơn 100
triệu thiết bị đã được kích hoạt với mức tăng 4,4% mỗi tuần. Vào tháng 9 năm 2012,
500 triệu thiết bị đã được kích hoạt với 1,3 triệu lượt kích hoạt mỗi ngày.
Thị phần của Android có khác nhau theo khu vực. Vào tháng 7 năm 2012, thị phần
Android tại Mỹ là 52%, nhưng lên tới 90% tại Trung Quốc.
1.7 Tỉ lệ sử dụng các phiên bản Android
Trong bản báo cáo mới nhất của Google, số lượng thiết bị chạy hệ điều
hành Android 6.0 Marshmallow tăng gấp đôi, từ 2,3% hồi tháng trước lên
9|Page
Đại học Công Nghệ - Hutech
thành 4,6% tính đến hết ngày 4/4/2016. Android 5.0 Lollipop vẫn là hệ điều
hành nắm tỉ trọng cao nhất với 35,8%, giảm 0,3% so với báo cáo trước đó;
xếp ngay phía sau là Android 4.4 KitKat với 33,4% thị phần.
Con số này cho thấy ngày càng có nhiều người dùng sử dụng các thiết
bị chạy hệ điều hành Android mới nhất của Google. Nguyên nhân là do thời
điểm đầu năm các nhà sản xuất liên tục phát hành các thiết bị mới, trong khi
nhiều công ty cũng tập trung phát hành bản update phần mềm cho các thiết bị
cũ.
Trước đó, trong bản báo cáo hồi tháng trước thì thị phần của Android
6.0 Marshmallow cũng tăng gần gấp đôi lên thành 2,3% và sau một tháng thì
số lượng thiết bị chạy Android mới tiếp tục tăng gấp đôi lên thành 4,6%. Đây
là một tín hiệu rất khả quan đối với người dùng, mặc dù con số này vẫn còn
chiếm tỉ trọng rất ít.
1.8 Tình trạng ăn cắp bản quyền sử dụng
Đã có những lo ngại về việc các ứng dụng trả tiền của Android quá dễ bị ăn
cắp. Trong một cuộc phỏng vấn vào tháng 5 năm 2012 với Eurogamer, nhà phát
triển Football Manager nói rằng tỷ lệ người chơi ăn cắp so với người chơi trả tiền là
9:1 với trò chơi Football Manager Handheld. Tuy nhiên, không phải tất cả các lập
trình viên đều cho rằng tình trạng ăn cắp là một vấn đề; ví dụ như vào tháng 7 năm
2012 các lập trình viên của trò chơi Wind-up Knight nói rằng mức độ ăn cắp trò chơi
của họ chỉ khoảng 12%, và phần lớn sản phẩm ăn cắp đến từ Trung Quốc, nơi người
ta không thể mua ứng dụng từ Google Play.
10 | P a g e
Đại học Công Nghệ - Hutech
Vào năm 2010, Google phát hành một công cụ để xác nhận việc mua bán để
sử dụng trong các ứng dụng, nhưng các lập trình viên than phiền rằng như vậy là
chưa đủ và quá dễ để bẻ khóa. Google trả lời rằng công cụ, đặc biệt là bản phát hành
đầu tiên, chỉ có ý định làm nền tảng mẫu cho lập trình viên điều chỉnh và xây dựng
theo yêu cầu, chứ không phải một giải pháp bảo mật hoàn chỉnh. Vào năm 2012
Google phát hành một tính năng trong Android 4.1 để mã hóa các ứng dụng trả tiền
chỉ hoạt động trên thiết bị đã mua ứng dụng đó, nhưng tính năng này đã bị hoãn do
vấn đề về kỹ thuật.
1.9 Bản quyền và bằng phát minh
Cả Android và nhà sản xuất điện thoại Android đều bị dính líu đến nhiều vụ
kiện tụng về bằng phát minh. Ngày 12 tháng năm 2010, Oracle kiện Google với cáo
buộc vi phạm bản quyền và bằng phát minh liên quan đến ngôn ngữ lập
trình Java. Oracle ban đầu muốn được đền bù thiệt hại 6,1 tỷ đô la Mỹ, nhưng bị tòa
án
liên bang Mỹ khước từ mức giá này và
yêu cầu
Oracle xem xét lại. Để đáp lại, Google đã đưa ra
nhiều lý lẽ để bảo vệ, tuyên bố ngược lại
là Android không hề vi phạm bằng phát
minh hay bản quyền của Oracle, và
rằng bằng phát minh của Oracle là
vô hiệu, cùng một số lời bào chữa
khác. Google nói rằng Android dựa
trên Apache Harmony, một hiện thực phòng sạchcủa
thư viện lớp Java (tức là xem hoạt
động của thư viện, rồi lập trình lại
bắt chước hoạt động đó nhưng không tham khảo hoặc lấy lại mã nguồn của thư viện
gốc), rồi sau đó độc lập phát triển ra máy ảo đặt tên là Dalvik. Vào tháng 5 năm 2012
bồi thẩm đoàn của vụ án tuyên rằng Google không vi phạm bằng phát minh của
Oracle, và sau đó thẩm phán tuyên rằng cấu trúc của Java API do Google sử dụng
không đủ để được giữ bản quyền.
Ngoài vụ kiện trực tiếp chống lại Google, có nhiều cuộc chiến tranh thế
mạng khác nhau gián tiếp chống lại Android bằng cách nhắm vào các nhà sản xuất
thiết bị Android, nhằm làm nản lòng những nhà sản xuất muốn sử dụng nền tảng này
do sự tăng chi phí để đưa thiết bị Android ra thị trường. Cả Apple và Microsoft đều
đã kiện một số nhà sản xuất vì vi phạm bằng sáng chế, với cuộc chiến pháp lý chống
Samsung dằng dai của Apple là vụ nổi bật nhất. Vào tháng 10 năm 2011 Microsoft nói
rằng họ đã ký một số thỏa thuận cấp phép với 10 nhà sản xuất thiết bị Android,
11 | P a g e
Đại học Công Nghệ - Hutech
những hãng sản xuất 55% lợi nhuận toàn cầu của Android. Những công ty này có
cả Samsung lẫn HTC.[157] Vụ dàn xếp bằng phát minh của Samsung với Microsoft có
một thỏa thuận rằng Samsung sẽ cung cấp thêm nguồn lực để phát triển và tiếp thị
điện thoại chạy hệ điều hành Windows Phonecủa Microsoft.
Google đã bày tỏ công khai sự bất mãn của họ đối với hệ thống bằng phát
minh tại Mỹ, buộc tội Apple, Oracle và Microsoft cố tình dìm Android thông qua các
vụ kiện, thay vì phải sáng tạo và cạnh tranh bằng các sản phẩm và dịch vụ tốt
hơn. Vào năm 2011-12, Google mua lại Motorola Mobility với giá 12,5 tỷ đô la Mỹ,
một hành động được xem là phương cách để bảo vệ Android, vì Motorola Mobility
nắm giữ hơn 17.000 bằng phát minh. Tháng 12 năm 2011 Google mua lại hơn một
nghìn bằng sáng chế từ IBM.
1.10 Máy ảo Dalvik
Dalvik là máy ảo giúp các ứng dụng java chạy được trên các thiết bị động
Android.
Nó chạy các ứng dụng đã được chuyển đổi thành một
file thực
thi Dalvik (dex). Định dạng phù hợp cho các hệ thống
mà
thường bị hạn chế về bộ nhớ và tốc độ xử lý.
Dalvik đã
được thiết kế và viết bởi Dan Bornstein, người đã
đặt tên cho
nó sau khi đến thăm một ngôi làng đánh cá nhỏ có
tên là Dalvík
ở đảo Eyjafjörður, nơi mà một số tổ tiên của ông
sinh sống. Từ
góc nhìn của một nhà phát triển, Dalvik trông giống
như
máy ảo Java (Java Virtual Machine) nhưng thực tế thì
hoàn toàn khác. Khi nhà phát triển viết một ứng dụng
dành cho Android, anh ta thực hiện các đoạn mã
trong môi trường Java. Sau đó, nó sẽ được biên
dịch sang các bytecode của Java, tuy nhiên để thực thi được ứng dụng này trên
Android thì nhà phát triển phải thực thi một công cụ có tên là dx. Đây là công cụ
dùng để chuyển đổi bytecode sang một dạng gọi là dex bytecode. "Dex" là từ viết tắt
của "Dalvik executable" đóng vai trò như cơ chế ảo thực thi các ứng dụng Android.
1.11 Kiến trúc
1.11.1 Tầng ứng dụng
12 | P a g e
Đại học Công Nghệ - Hutech
Android được tích hợp sẵn một số ứng dụng cần thiết cơ bản như: contacts,
browser, camera, Phone,… Tất cả các ứng dụng chạy trên hệ điều hành Android đều
được viết bằng Java
1.11.2 Application framework
Bằng cách cung cấp một nền tảng phát triển mở, Android cung cấp cho các
nhà phát triển khả năng xây dựng các ứng dụng cực kỳ phong phú và sáng tạo. Nhà
phát triển được tự do tận dụng các thiết bị phần cứng, thông tin địa điểm truy cập,
các dịch vụ chạy nền, thiết lập hệ thống báo động, thêm các thông báo để các thanh
trạng thái, và nhiều, nhiều hơn nữa. Nhà phát triển có thể truy cập vào các API cùng
một khuôn khổ được sử dụng bởi các ứng dụng lõi. Các kiến trúc ứng dụng được
thiết kế để đơn giản hóa việc sử dụng lại các thành phần; bất kỳ ứng dụng có thể xuất
bản khả năng của mình và ứng dụng nào khác sau đó có thể sử dụng những khả năng
(có thể hạn chế bảo mật được thực thi bởi khuôn khổ). Cơ chế này cho phép các
thành phần tương tự sẽ được thay thế bởi người sử dụng. Cơ bản tất cả các ứng
dụng là một bộ các dịch vụ và các hệ thống, bao gồm:
• Một tập hợp rất nhiều các View có khả năng kế thừa lẫn nhau dùng để thiết
kế phần giao diện ứng dụng như: gridview, tableview, linearlayout,…
• Một “Content Provider” cho phép các ứng dụng có thể truy xuất dữ liệu từ
các ứng dụng khác (chẳng hạn như Contacts) hoặc là chia sẻ dữ liệu giữa các ứng
dụng đó.
• Một “Resource Manager” cung cấp truy xuất tới các tài nguyên không phải là
mã nguồn, chẳng hạn như: localized strings, graphics, and layout files.
• Một “Notifycation Manager” cho phép tất cả các ứng dụng hiển thị các
custom alerts trong status bar.
• Activity Maanager được dùng để quản lý chu trình sống của ứng dụng và
điều hướng các activity.
1.11.3 Library
Android bao gồm một tập hợp các thư viên C/C++ được sử dụng bởi nhiều
thành phần khác nhau trong hệ thống Android. Điều này được thể hiện thông qua
nền tảng ứng dụng Android. Một số các thư viện cơ bản được liệt kê dưới đây:
• System C library: a BSD-derived implementation of the standard C system
library (libc), tuned for embedded Linux-based devices.
13 | P a g e
Đại học Công Nghệ - Hutech
• Media Libraries - based on PacketVideo's OpenCORE; the libraries support
playback and recording of many popular audio and video formats, as well as static
image files, including MPEG4, H.264, MP3, AAC, AMR, JPG, and PNG
• Surface Manager – Quản lý việc truy xuất vào hệ thống hiển thị
• LibWebCore - a modern web browser engine which powers both the
Android browser and an embeddable web view.
• SGL - the underlying 2D graphics engine.
• 3D libraries - an implementation based on OpenGL ES 1.0 APIs; the libraries
use either hardware 3D acceleration (where available) or the included, highly
optimized 3D software rasterizer.
• FreeType - bitmap and vector font rendering. SQLite - a powerful and
lightweight relational database engine available to all applications.
1.11.4 Android Runtime
Android bao gồm một tập hợp các thư viện cơ bản mà cung cấp hầu hết các
chức năng có sẵn trong các thư viện lõi của ngôn ngữ lập trình Java. Tất cả các ứng
dụng Android đều chạy trong tiến trình riêng. Máy ảo Dalvik đã được viết để cho một
thiết bị có thể chạy nhiều máy ảo hiệu quả. Các VM Dalvik thực thi các tập tin thực
thi Dalvik (dex). Định dạng được tối ưu hóa cho bộ nhớ tối thiểu. VM là dựa trên
register-based, và chạy các lớp đã được biên dịch bởi một trình biên dịch Java để
chuyển đổi thành các định dạng dex. Các VM Dalvik dựa vào nhân Linux cho các chức
năng cơ bản như luồng và quản lý bộ nhớ thấp.
1.11.5 Linux kernel
Android dựa trên Linux phiên bản 2.6 cho hệ thống dịch vụ cốt lõi như
security, memory management, process management, network stack, and driver
model. Kernel Linux hoạt động như một lớp trừu tượng hóa giữa phần cứng và phần
còn lại của phần mềm stack.
JNI: Java Native Interface (Tương tự khái niệm Application Programming
Interface).
Java Native Interface: là một bộ framework cho phép mã lệnh viết bằng Java
chạy trên máy ảo java có thể gọi hoặc được gọi bởi một ứng dụng viết bằng native
code (Ứng dụng được viết cho một phần cứng cụ thể và trên một hệ điều hành cụ
thể) hoặc những bộ thư viện viết bằng C, C++ hoặc Assembly.
14 | P a g e
Đại học Công Nghệ - Hutech
Bằng cách sử dụng JNI, Android cho phép các ứng dụng chạy trên máy ảo
Dalvik có thể sử dụng những phương thức được viết bằng các ngôn ngữ cấp thấp
như: C, C++, Assembly. Qua đó các nhà phát triển ứng dụng có thể xây dựng ứng
dụng dựa trên các bộ thư viện viết bằng C, C++, Assembly nhằm tăng tốc độ thực thi
của ứng dụng hoặc sử dụng những tính năng mức thấp mà ngôn ngữ Java không hổ
trợ. Tuy nhiên người phát triển ứng dụng cần phải cân nhắc sự gia tăng độ phức tạp
của ứng dụng khi quyết định sử dụng các bộ thư viện này.
1.12 Cấu trúc cơ bản ứng dụng Android
Cách thành phần của một ứng dụng Android là các khối thiết yếu dùng để
ghép thành một ứng dụng Android. Mỗi thành phần là một góc nhìn khác nhau tạo
thành một ứng dụng Android đầy đủ. Không phải bất kì ứng dụng nào cũng có đầy đủ
các thành phần dưới đây, việc có hay không có một thành phần nào tùy thuộc vào
mỗi ứng dụng. Một số thành phần sẽ có quan hệ phụ thuộc lẫn nhau. Mỗi thành
phần có một vai trò khác nhau giúp định nghĩa một ứng dụng Android đầy đủ. Mỗi
loại có một mục đích khác nhau và có một vòng đời khác nhau giúp định nghĩa cách
mà một thành phần được tạo ra và được hủy khác nhau:
15 | P a g e
Đại học Công Nghệ - Hutech
1.12.1 Activity
Định nghĩa
Là thành phần tối quan trọng của bất kỳ một ứng dụng Android nào. Thuật
ngữ Activity chỉ một việc mà người dùng có thể thực hiện trong một ứng dụng
Android. Do gần như mọi activity đều tương tác với người dùng, lớp Activity đảm
nhận việc tạo ra một cửa sổ (window) để người lập trình đặt lên đó một giao diện UI
với setContentView(View). Một activity có thể mang nhiều dạng khác nhau: Một cửa
sổ toàn màn hình (full screen window), một cửa sổ floating (với windowsIsFloating)
hay nằm lồng bên trong 1 activity khác (với ActivityGroup).
Có 2 phương thức mà gần như mọi lớp con của Activity đều phải hiện thực:
onCreate(Bundle) - Nơi khởi tạo activity. Quan trọng hơn, đây chính người lập
trình gọi setContentView(int) kèm theo layout để thể hiện UI của riêng mình. Đồng
thời còn có findViewById(int) giúp gọi các widget (buttons, text boxes, labels,..) để
dùng trong UI.
onPause() - Nơi giải quyết sự kiện người dùng rời khỏi activity. Mọi dữ liệu
được người dùng tạo ra tới thời điểm này cần phải được lưu vào ContentProvider
Để có thể sử dụng Context.startActivity(), mọi lớp activity đều phải được khai
báo với tag <activity> trong file AndroidManifest.xml.
16 | P a g e
Đại học Công Nghệ - Hutech
Vòng đời của một activity
Các activity được quản lí dưới dạng các activity stack - First-In-Last-Out: Khi
một activity mới được khởi tạo, nó sẽ được đưa lên trên cùng stack, các activity khác
muốn chạy trên nền (foreground) trở lại thì cần phải chờ tới khi Activity mới này kết
thúc.
Một Activity có 4 trạng thái:
Active hay Running: Khi một activity đang chạy trên màn hình.
Paused: Khi một activity vẫn đang chạy trên màn hình nhưng đang bị
một activity trong suốt (transparent) hay không chiếm toàn màn hình hiển thị
phía trên. Tuy vẫn lưu trữ dữ liệu, nhưng các paused activity này sẽ bị hệ
thống bắt chấm dứt khi đang thiếu bộ nhớ trầm trọng.
Stopped: Khi 1 activity bị che khuất hoàn toàn bởi 1 activity khác.Tuy
vẫn lưu trữ dữ liệu, nhưng các stopped activity này sẽ thường bị hệ thống bắt
chấm dứt để dành chỗ cho các tiến trình khác Killed hay Shut down: Khi 1
activity đang paused hay stopped, hệ thống sẽ xóa activity ấy ra khỏi bộ nhớ.
Dựa vào lược đồ trên, thấy được có 3 vòng lặp quan trọng sau:
Vòng đời toàn diện (Entire Lifetime): Diễn ra từ lần gọi onCreate(Bundle) đầu
tiên và kéo dài tới lần gọi onDestroy() cuối cùng.
Vòng đời thấy được (Visible Lifetime): Diễn ra từ khi gọi onStart() và kéo dài
tới khi gọionStop(). Ở vòng đời này, activity được hiển thị trên màn hinh nhưng có
thế không tương tác với người dùng ở trên nền. Các phương thức onStart(0 và
onStop() có thể được gọi nhiều lần.
Vòng đời trên nền (Foreground Lifetime): Diễn ra từ khi gọi onResume(0 và
kéo dài tới khi gọi onPause(). Ở vòng đời này, activity nằm trên mọi activity khác và
tương tác được với người dùng. 1 activity có thể liên tục thay đổi giữa 2 trạng thái
paused và resumed, chẳng hạn khi thiết bị sleep hay 1 intent mới được đưa tới.
public class Activity extends ApplicationContext {
protected void onCreate(Bundle savedInstanceState);
17 | P a g e
Đại học Công Nghệ - Hutech
//Gọi khi mới tạo activity để setup các view, binding dữ liệu,...
//Kèm theo sau luôn là onStart().
protected void onRestart();
//Gọi sau khi activity bị stopped và trước khi được khởi động lại.
//Kèm theo sau luôn là onStart().
protected void onStart();
//Gọi khi activity hiện lên trước mắt người dùng.
//Kèm theo sau là onResume() nếu activity hiện lên nền hay onStop(0 nếu bị ẩn
đi.
protected void onResume();
//Gọi khi activity bắt đầu tương tác với người dùng và đang trên cùng của activity
stack.
//Kèm theo sau luôn là onPause().
protected void onPause();
//Gọi khi hệ thống sắp khởi động lại 1 activity khác trướcđó.
//kèotheo sau là onresume nếu activity trở lại trên cùng hay onStop() nếu bị ẩn
đi.
protected void onStop();
//Gọi khi activity không còn hiển thị trước người dùng
//Kèm theo sau là onRestart() nếu activity hiện lên trở lại hay onDestroy nếu sắp
xoá activity đi.
protected void onDestroy();
18 | P a g e
Đại học Công Nghệ - Hutech
//Gọi ngay trước khi kết thúc activity, xảy ra khi hàm finish() được gọi hoặc khi hệ
thống yêu cầu buộc phải kết thúc.
}
1.12.2 AndroidManifest.xml
Trước khi hệ điều hành Android có thể khởi động một thành phần
(Activity, Services, Broadcast receiver) thì hệ thống phải biết thành phần này
có tồn tại hay không bằng cách đọc file androidmanifest.xml của ứng dụng. Mỗi
ứng dụng phải khai báo mọi thành phần (Activity, Service,
Broadcast receiver) trong file này và phải đặt ở thư mục gốc của ứng dụng.
Mỗi file manifest có những khai báo:
-
Định danh xác định các quyền của người sử dụng như truy xuất internet,
truy xuất danh
Xác định phiên bản API tối thiểu mà ứng dụng có thể thực thi. Phiên bản
API này tương ứng với các phiên bản của hệ điều hành Android.
Các tính năng phần cứng cần thiết cho ứng dụng như GPS, camera,
Bluetooth…
Các bộ API liên kết sử dụng trong ứng dụng (VD: Google map…).
Một file AndroidManifest.xml (do Eclipse tự tạo, khi lập trình tùy theo tình
huống ta thêm vào các tính năng) có cấu trúc như sau:
Trong đó
manifest là thẻ
chính. Thẻ gốc
này sẽ có ít nhất
một thể con là
application với
các thuộc tính
xác định icon
của ứng dụng,
tên ứng dụng… .
19 | P a g e
Đại học Công Nghệ - Hutech
Trong thẻ application sẽ đặt các khai báo các thành phần tồn tại trong ứng
dụng bằng cách sử dụng các thẻ:
<activity>: Khai báo một Activity.
<service>: Khai báo một service.
<receiver>: Khai báo một Broadcast reciever.
: Khai báo một Content Provider.
<supports-screens>: Khai báo loại màn hình mà ứng dụng hổ trợ.
<uses-configuration>: Khai báo phần cứng nhập liệu cần thiết cho ứng dụng.
<uses-feature>: Các tính năng phần cứng cần thiết cho ứng dụng.
<uses-sdk>: Phiên bản API tối thiểu.
1.12.3 Intent
Khi Tim Berners phát minh ra giao thức Hypertext Transfer Protocol (HTTP),
ông cũng đã phát minh ra một định dạng URLs chuẩn. Định dạng này là một hệ thống
các động từ đi kèm các địa chỉ. Địa chỉ sẽ xác định nguồn tài nguyên như Web page,
hình ảnh hay các server-side program. Động từ sẽ xác định cần phải làm cái gì với
nguồn tài nguyên đó: GET để nhận dữ liệu về, POST để đưa dữ liệu cho nó để thực
thi một công việc nào đó. Khái niệmIntent cũng tương tự, Intent là một mô tả trừu
tượng của một hành động được thực thi. Nó đại diện cho một hành động đi kèm với
một ngữ cảnh xác định. Với Intent thì có nhiều hành động và nhiều component (Một
thể hiện của một class java dùng để thực thi các hành động được đặc tả trong Intent)
dành cho Intent của Android hơn là so với HTTP verbs (POST, GET) và nguồn tài
nguyên (hình ảnh, web page) của giao thức HTTP, tuy nhiên khái niệm vẫn tương tự
nhau.
Intent được sử dụng với phương thức startActivity() để mở một Activity, và
dùng với broadcastIntent để gởi nó đến bất kì BroadcastReceiver liên quan nào, và
dùng với startService(Intent), bindService(Intent, ServiceConnection, int) để giao tiếp
với các Service chạy dưới nền.
Intent cung cấp một chức năng cho phép kết nối hai chương trình khác nhau
trong quá trình thực thi (runtime) (Cung cấp khả năng cho phép hai chương trình
20 | P a g e
Đại học Công Nghệ - Hutech
khác nhau giao tiếp với nhau). Chức năng quan trọng và được sử dụng nhiều nhất
của một Intent là mở một Activity, nơi mà nó có thểđược dùng như một vật kết nối
các Activity lại với nhau (Truyền thông tin giữa hai Activity khác nhau).
Thành phần chính của Intent bao gồm:
Action: Xác định hành động sẽ được thực thi, các hành động này có thể là:
ACTION_VIEW, ACTION_EDIT, ACTION_MAIN…
Data: Các dữ liệu được sử dụng để hành động (Action) thao tác trên nó, như
bản ghi về một người nào đó trong cơ sở dữ liệu chứa các contact của thiết bị.
Ví dụ về thành phần action/data:
ACTION_VIEW content://contacts/people/1 – hiển thị thông tin liên lạc của người có
mã là “1”.
ACTION_DIAL content://contacts/people/1 – gọi điện cho người có mã là “1”.
ACTION_DIAL tel:123 – gọi đến số điện thoại “123”
Ngoài ra, Intent còn có các thuộc tính phụ sau:
Category: thông tin chi tiết về hành động được thực thi, ví dụ
như CATEGORY_LAUNCHER có nghĩa là nó sẽ xuất hiện trong Launcher như ứng dụng
có mức level cao (top-level application), trong khiCATEGORY_ALTERNATIVE chứa
thông tin danh sách các hành động thay thế mà người dùng có thể thực thi trên phần
dữ liệu mà Intent cung cấp.
Type: Chỉ định 1 kiểudữ liệu chính xác (kiểu MIME) được mang bởi intent.
Thường thì type được suy ra từ chính dữ liệu. Bằng cách thiết lập thuộc tính type,
bạn có thể vô hiệu hóa sự phỏng đoán kiểu dữ liệu và chỉ định rỏ một kiểu chính xác.
Component: Chỉ định rõ tên của lớp thành phần (Một thể hiện của một class
java dùng để thực thi các hành động được đặc tả trong Intent) sử dụng cho Intent .
Thông thường thì nó được xác định bằng cách tìm kiếm thông tin trong Intent (Các
thông tin như Action, data/type, và category) và nối chúngvới các component (Một
thể hiện của một Class java dùng để thực thi các hành động được đặc tả trong Intent)
có thể đáp ứng được các yêu cầu sử lý của Intent.
Extracts: là một đối tượng Bundle dùng để chứa các thông tin kèm theo được
dùng để cung cấp thông tin cần thiết cho component. Ví dụ: Nếu có một Intent đặc tả
hành động send email thì những thông tin cần chứa trong đối tượng Bundle là
subject, body…
Intent có 2 dạng chính sau:
21 | P a g e
Đại học Công Nghệ - Hutech
Explicit Intents: Xác định rỏ một component (Một thể hiện của một class java
dùng để thực thi các hành động được đặc tả trong Intent) (thông qua phương thức
setComponent(ComponentName) hoặc setClass(Context, Class)) cung cấp lớp sẽ
thực thi các hành động được đặc tả trong Intent. Thông thường thì những Intent này
không chứa bất kỳ thông tin nào khác (như category, type) mà đơn giản chỉ là cách
để ứng dụng mở các Activitykhác bên trong một Activity.
Implicit Intents: Không chỉ định một component nào cả, thay vào đó, chúng sẽ
chứa đủ thông tin để hệ thống có thể xác định component có sẵn nào là tốt nhất để
thực thi hiệu quả cho Intent đó.
Khi sử dụng Implicit intents, do tính chất chuyên quyền của loại Intent này,ta
cần phải biết phải làm gì với nó. Công việc này được đảm nhiệm bởi tiến trình
của Intent resolution, nó giúp chỉ định Intent đến một Actvity,
BroadcastReceiver, hoặc Service (hoặc thỉnh thoảng có thểlà 2 hay nhiều hơn một
activity/receiver) để có thể xử lý các hành động được đặc tả trong Intent.
Bất cứ thành phần nào (Activity, BroadcastReceiver, Service) khi muốn sử
dụng trong ứng dụng đều phải được đăng kí trong file AndroidManifest.xml. Trong
đó cầnđịnh nghĩa một thẻ <intent-fillter> cung cấp các thông tin để hệ thống có thể
xác định được cái mà các component này (Activity, BroadcastReceiver, Service) có
thể xử lý được (những action mà component này có thể thực hiện được).
Intent Fillter là bản đặc tả có cấu trúc của các giá trị của Intent dùng để xác
định component phù hợp để thực hiệncác hành động được đặc tả trong Intent.
Một Intent Fillter nối các hành động, categories và dữ liệu (hoặc thông qua type hoặc
sheme) trong Intent. Intent Fillter được khai báo trong AndroidManifest.xml và sử
dụng thẻ intent-fillter.
Một Intent Fillter có các thành phần chính sau:
Action: Tên hành động mà component có thể thực thi.
Type:Kiểu hành động mà component có thể thực thi.
Category: Phân nhóm các hành động.
Đối với những dữ liệu không phải là nội dung cụ thể (VD: URI) thì việc xem xét
lựa chọn Intent phù hợp sẽ dựa vào lược đồ(Scheme) của dữ liệu được cung cấp (VD:
http:// mailto: …)
Luật xác định component phù hợp Intent
Để xác định một thành phần là phù hợp với một Intent hệ thống sẽ tiến hành
xem xét từ trên xuống.
22 | P a g e
Đại học Công Nghệ - Hutech
Trước tiên khi một Intent được gọi, Android sẽ tìm kiếm những component
(Activity, BroadcastReceiver, Service) có action-name phù hợp với Intent.
Nếu có component phù hợp Android sẽmở component đó lên để thực thi các
hành động theo yêu cầu.
Nếu có nhiều hơn 1 component có action-name phù hợp thì Android sẽ yêu
cầu người dùng chọn component phù hợp.
Ngược lại nếu không có component nào phù hợp Android sẽ tiến hành xem
xét kiểu dự liệu của Intent cung cấp xem có component nào có đủ năng lực để sử lý
kiểu dữ liệu đó không. Nếu khôngđược Android sẽ tiến hành xem xét scheme của dữ
liệu đó để tìm kiếm component phù hợp. Nếu vẫn không tìm được component phù
hợp Android sẽ tiến hành xem xét các component có chung Category với Intent để
xác định component.
1.12.4 Service
Một service là một thành phần của ứng dụng, thể hiện mong muốn ứng dụng
thực hiện các hành động trong khi không tương tác với người dùng hoặc cung cấp
chức năng cho các ứng dụng khác sử dụng. Nói một cách đơn giản, service là các tác
vụ (task) chạy ngầm dưới hệ thống nhằm thực hiện một nhiệm vụ nào đó. Mỗi class
Service phải chứa thẻ <service> được khai báo trong file AndroidManifext.xml.
Services có thể được bắt đầu bởi Context.startService() và Context.bindservice()
Cũng như các đối tượng của ứng dụng khác, services chạy trên luồng (Thread)
của tiến trình chính. Có nghĩa là nếu service của bạn dự định chạy các hành vi có
23 | P a g e
Đại học Công Nghệ - Hutech
cường độ lớn hoặc các hành vi có thể gây nghẽn mạch, nó sẽ tự sinh ra luồng
(Thread) của chính nó để làm thực hiện các tác vụ được đặc tả trong Service.
Cần lưu ý:
Service không phải là một tiến trình độc lập. Đối tượng Service không chạy
trên tiến trình (process) của riêng nó (trừ khi có một yêu cầu đặt biệt), Service chạy
trên tiến trình của chương trình.
Service không phải là một luồng (thread).
Đặc trưng cơ bản
Là một chức năng để ứng dụng thông báo với hệ thống về việc mà nó muốn
thực hiện ở phía dưới nền (ngay cả khi người dùng không tương tác trực tiếp tới ứng
dụng). Điều này tương ứng với việc gọi phương thức Context.startservice(), nó sẽ yêu
cầu hệ thống lên lịch cho service để chạy cho đến khi bị chính service hay người nào
đó dừng nó lại.
Là một chức năng cho phép ứng dụng để cung cấp các chức năng của nó cho
các ứng dụng khác. Điều đó tương ứng với việc gọi Context.bindService(), cho phép
một long-standing connection được tạo ra để service có thể tương tác với nó.
Khi một Service được tạo ra, việc hệ thống cần làm là tạo ra thành phần và gọi
hàm onCreate() và bất kỳ lệnh callback thích hợp nào trên luồng chình. Nó phụ thuộc
vào Service thi hành hành vi thích hợp nào, chẳng hạn tạo luồng thứ hai để thực hiện
tiến trình.
Vòng đời của 1 Service
Có 2 lý do để một service được chạy bởi hệ thống. Bằng cách gọi phương thức
Context.startService() và Context.bindService(). Nếu người dùng gọi phương thức
Context.startService() thì hệ thống sẽ nhận về một đối tượng service (tạo mới nó và
gọi hàm onCreate() nếu cần thiết) và sau đó lại gọi phương thức
onStartCommand(Intent, int ,int) với các biến được cung cấp bởi client. Service mới
được tạo ra này sẽ chạy cho tới khi có lệnh gọi phương thức Context.stopService()
hoặc stopSelf(). Dù cho một service có được start bao nhiêu lần đi nữa thì nó sẽ bị tắt
ngay khi phương thức Context.stopService() hoặc phương thức stopSelf() được
gọi.Service có thể dùng phương thức stopSelf(int) để đảm bảo rằng service sẽ không
được tắt cho đến khi Intent đã khởi tạo nó được xử lý.
24 | P a g e
Đại học Công Nghệ - Hutech
1.12.5 BroadcastReceiver
Là lớp nhận về các intents được gửi bởi sendBroadcast(). Có thể tạo instance
cho lớp này bằng 2 cách: hoặcvới Context.registerReceiver() hay thông qua tag
<receiver> trong file AndroidManifest.xml.
Có hai lớp broadcast quan trọng cần xét đến:
Broadcasts bình thường (Normal broadcasts): Được gửi bởi
context.sendBroadcast tới các receivers hoàn toàn không theo 1 trật tự nào, dẫn tới
đôi khi tồn tại cùng 1 lúc nhiều receivers khác nhau. Tuy nhanh nhưng không thể trao
đổi kết quả nhận về giữa cac1 receivers với nhau.
Broadcasts có thứ tự (Ordered broadcasts) - Được gửi bởi
Context.sendOrderedBroadcast() tới từng receiver một. Như vậy, kết quả nhận về
của 1 receiver có thể trở thành input của 1 receiver khác, hay có thể ngay lập tức
dừng việc broadcast tới các receiver khác. Trật tự chạy các receivers được quyết định
bởi thuộc tính android:priority trong intent-filter tương ứng.
1.12.6 Content Provider
Là nơi lưu trữ và cung cấp cách truy cập dữ liệu do các ứng dụng tạo nên. Đây
là cách duy nhất mà các ứng dụng có thể chia sẻ dữ liệu của nhau.
Android cung cấp sẵn content providers cho 1 số kiểu dữ liệu thông dụng như
âm thanh, video, thông tin sổ điện thoại,... (Xem thêm trong gói android.provider).
Người lập trình cũng có thể tự tạo ra các class con (subclass) của Content Provider để
lưu trữ kiểu dữ liệu của riêng mình.
Cách thức hoạt động
Mọi content provider, tuy có thể khác nhau về cách thức lưu trữ dữ liệu, đều
sử dụng chung 1 interface để tìm và trả về dữ liệu, bao gồm việc thêm, bớt và sửa dữ
liệu. Việc này được thực hiện thông qua các đối tượng ContentResolver khi gọi
getContentResolver()
ContentResolver cr = getContentResolver();
Mô hình dữ liệu
Content providers sử dụng dữ liệu dưới dạng 1 table đơn giản, trong đó mỗi hàng là
1 record và mỗi cột là dữ liệu của 1 kiểu nhất định.
25 | P a g e