nghiên cưú và phát triển android os

63
Thực tập cơ sở về Android Nguy n Vương Quy n Page 1 ĐẠI HỌC BÁCH KHOA HÀ NỘI VIỆN CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG Thực tập cơ sở Đề tài số 1:tìm hiểu về Android và lập trình ứng dụng Giáo viên hướng dẫn:thầy Hoàng Anh Việt Sinh viên làm: em Nguyễn Vương Quyền Lớp :cnpm k53 Generated by Foxit PDF Creator © Foxit Software http://www.foxitsoftware.com For evaluation only.

Upload: qnv96

Post on 27-Jul-2015

128 views

Category:

Education


5 download

TRANSCRIPT

Page 1: Nghiên cưú và phát triển Android OS

ThựctậpcơsởvềAndroid

N g u y ễ n V ư ơ n g Q u y ề n

Page 1

ĐẠI HỌC BÁCH KHOA HÀ NỘI VIỆN CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG

Thưctapcơsơ

Đề tài số 1:tìm hiểu về Android và lập trình ứng dụng

Giáo viên hướng dẫn:thầy Hoàng Anh Việt

Sinh viên làm: em Nguyễn Vương Quyền Lớp:cnpm k53

Generated by Foxit PDF Creator © Foxit Softwarehttp://www.foxitsoftware.com For evaluation only.

Page 2: Nghiên cưú và phát triển Android OS

ThựctậpcơsởvềAndroid

N g u y ễ n V ư ơ n g Q u y ề n

Page 2

Mục lục Lời nói đầuPhần I:nghiên cứu tổng quan và kiến trúc Android

1.1.Giới thiệu hệ điều hành Android Tổng quan về Android Lịch sử phát triển của Android Các phiên bản Android So sánh Android và các hệ điều hành chạy trên các smartphone khác

1.2.Kiến trúc Android Hệ thống tệp tin Các tầng kiến trúc

Phần II:các công cụ lập trình Android Giới thiệu về các công cụ và nền tảng phát triển ứng dụng cho Android Lập trình Android với Eclipse Lập trình Android với Netbean

Phần III:xây dựng các ứng dụng cụ thể Cyclelive Đồhọa2DtrongAndroid ChươngtrìnhAndroidtranslator

PhầnIV.TổngkếtvàđánhgiáTàiliệuthamkhảochính

Generated by Foxit PDF Creator © Foxit Softwarehttp://www.foxitsoftware.com For evaluation only.

Page 3: Nghiên cưú và phát triển Android OS

ThựctậpcơsởvềAndroid

N g u y ễ n V ư ơ n g Q u y ề n

Page 3

Lời nói đầu Trong thời đại công nghệ thong tin ngày càng phát triển thì những thiết bị di động thông minh có sự hỗ

trợ của hệ điều hành đang ngày càng phổ biến và thông dụng.Chúng dần tỏ ra ưu việt hơn so với máy

tính truyền thống không chỉ bởi hỗ trợ nhiều tính năng mạnh mẽ không hề thua kém các dòng máy tính

thường thấy mà còn bởi giá thành cũng ngày càng hạ xuống phù hợp với mọi tầng lớp người dùng nhờ

sự tiến bộ vượt bậc của công nghệ tiên tiến.Tất nhiên để làm được điều đó thì những thiết bị này không

thể thiếu một hệ điều hành thông minh điều khiển mọi hoạt động trong nó như trên một chiếc máy tính

thông thường.Trong đó phải kể đến là hệ điều hành Android mới xuất hiện dựa trên nền tảng mã nguồn

mở Linux do Google phát triển. Cùng với sự phong phú về chủng loại, cấu hình và giá thành, điện thoại

Android đã trở nên phổ biến và xâm nhập ngày càng sâu rộng tới người sử dụng trên thế giới. Có lẽ điều

giúp cho điện thoại Android phát triển nhanh chính là có một hệ điều hành được người dùng ưa chuộng

nhất. Khi mới bắt đầu sử dụng hệ điều hành này mọi người thường thấy rất khó khăn nhưng chỉ cần bỏ

chút thời gian mày mò là họ có thể quen và thấy thích hệ điều hành này. Sở dĩ Android được người dùng

ưa chuộng nhất có lẽ vì chúng được tạo nên từ nền tảng nguồn mở nên cho phép người dùng có thể tùy

biến nhiều trên đó. Mặt khác, với Android thiết bị người dùng không đòi hỏi phải có một cầu hình tối

thiểu nào cả. Chúng có thể hoạt động trên mọi cấu hình, máy có hỗ trợ cảm ứng hay không, cũng như

tương thích với mọi nhà sản xuất thiết bị phần cứng .

Về khả năng tuy biến: Giao diện người dùng của hệ điều hành Android không hoàn toàn khác biệt hẳn so

với giao diện iOS (Apple). Thay vì chấp nhận một kích thước cố định cho mọi thiết bị, Google cho phép

các nhà sản xuất và người dùng có thể thay đổi giao diện người dùng Android phù hợp với nội dung trên

đó. Người dùng có cả giao diện Android và giao diện tùy biến của nhà sản xuất. Ngay cả với giao diện

người dùng bắt đầu sử dụng cũng có nhiều ứng dụng của các bên thứ ba cho phép người dùng tùy biến

trên giao diện gốc. Người dùng có thể sử dụng các tựa đề sống động giống như giao diện Windows

Phone 7 nếu thích. Điều này chính là một trong những sự khác biệt cốt yếu giữa iOS và Android.

Giống như iOS của Apple, Android có nhiều màn hình Home mà người dùng có thể lướt qua. Giao diện

mặc định có 5 màn hình Home, HTC Sence có 7 màn hình Home, Samsung Touch UI có tới 9 màn hình

Home. Người dùng có thể di chuyển các biểu tượng trên các màn hình Home đó và đặt chúng trong các

thư mục nếu thích. Google có một vùng (dock) để chứa đựng 3-4 biểu tượng. Các Dock này có thể tùy

biến như giao diện Touchwiz của Samsung hoặc cố định như Sense của HTC.

Nhưng Android bổ sung thêm một số yếu tố mà trong giao diện người dùng của iOS không có. Ngoài

màn hình Home, người dùng có một ứng dụng Application Launcher để hiển thị tất cả các ứng dụng cài

đặt trên thiết bị. Ở trên cùng giao diện người dùng Android là thanh thông báo. Thanh này dùng để

thông báo cập nhật, theo dõi quá trình tải về và cài đặt,… Người dùng có thể kéo thanh thông báo này

xuống để biết nhiều thông tin hơn là chỉ có các widget.

Điểm khác biệt thứ hai giữa iOS và Android là trên Android, Widget là một thành phần của giao diện đồ

họa không thể thiếu của người dùng. Chúng hiển thị thông tin mà người dùng có thể thay đổi, tương tự

như một cửa sổ. Chúng rất hữu ích vì có thể cung cấp cho người dùng nhiều thông tin hơn và thiết lập

cấu hình truy cập nhanh mà không phải mở ứng dụng. Với iOS, để truy cập thông tin, người dùng cần di

Generated by Foxit PDF Creator © Foxit Softwarehttp://www.foxitsoftware.com For evaluation only.

Page 4: Nghiên cưú và phát triển Android OS

ThựctậpcơsởvềAndroid

N g u y ễ n V ư ơ n g Q u y ề n

Page 4

chuyển trên màn hình Home và kích mở ứng dụng đó. Với Android, thông tin có thể hiển thị trực tiếp

trên một trong các màn hình Home khác nhau.

Dễ sử dụng: so với hệ điều hành Symbian hay Windows Phone , giao diện Android của Google rất thân

thiện với người dùng. Về mặt trực giác, chúng không chỉ bóng bẩy như iOS của Apple mà còn rất gần gũi

với người dùng,tạo cho người dùng khả năng sáng tạo, tùy biến sắp đặt theo ý thức để có thể sử dụng

dễ dàng nhất và tùy chọn nhưng gì cần thiết để sử dụng thiết bị thông minh hơn, cũng như tiết kiệm pin.

Vì những điểm mạnh trên của hệ điều hành Android nên em xin chọn đề tài nghiên cứu về hệ điều hành

Android trong đợt thực tập cơ sở này.

Generated by Foxit PDF Creator © Foxit Softwarehttp://www.foxitsoftware.com For evaluation only.

Page 5: Nghiên cưú và phát triển Android OS

ThựctậpcơsởvềAndroid

N g u y ễ n V ư ơ n g Q u y ề n

Page 5

I.Tổng quan về kiến trúc Android

1.1.Giới thiệu hệ điều hành Anndroid:

1.1.1.Tổng quan chung về Android:

Android là một hệ điều hành di động dựa trên nền tảng linux phiên bản 2.6 dành cho các dòng điện

thoại SmartPhone và nhiều thiết bị di động khác như máy tính bảng,… Đầu tiên được ra đời bởi công ty

liên hợp Android, sau đó được Google mua lại và phát triển từ năm 2005 và trở thành một hệ điều hành

di động mã nguồn mở,miễn phí, mạnh mẽ và được ưa chuộng cao trên thế giới.

Hệ điều hành Android là một hệ điều hành rất mạnh, có tính bảo mật cao, hỗ trợ được nhiều công nghệ

tiên tiến như 3G, GPS, EDGE, Wifi... tương thích với nhiều phần cứng, hỗ trợ nhiều loại bộ nhập dữ liệu

như keyboard, touch và trackball. Android là hệ điều hành di động có khả năng kết nối cao với các mạng

không dây, hỗ trợ công nghệ OpenGL nên có khả năng giải trí với multimedia,animation cũng như trình

diễn các khả năng đồ họa cực tốt,là tiền đề để phát triển các ứng dụng có giao diện phức tạp chẳng hạn

như là các trò chơi,nghe nhạc,...Đặc biệt là có nhiều API hữu ích cho các nhà phát triển phần mềm, nhà

phát triển ROM có thể xây dựng nên nhiều ứng dụng, hệ thống khác nhau.

Android còn là một hệ điều hành đa nhiệm một người dùng. Tính đa nhiệm cho phép cùng một thời

gian, người dùng có thể chạy được nhiều nhiều ứng dụng để làm được nhiều việc khác nhau. Tuy nhiên,

mỗi ứng dụng trên Android thì chỉ được phép chạy với một thực thể mà thôi.

Android liên tục được phát triển, mỗi bản cập nhật từ Google là mỗi lần Android được tối ưu hóa để

hoạt động tốt hơn, nhanh và ổn định hơn, hỗ trợ thêm công nghệ mới. Chẳng hạn như theo một đánh

giá thì android phiên bản 2.2 hoạt động nhanh hơn bản 2.1 tới 450%. Hiện nay, phiên bản 2.3 phát hành

ngày 6/12/2010 và vào tháng 1-2011,tại triển lãm Điện tử tiêu dùng lớn nhất thế giới diễn ra hằng năm

tại Las Vegas (Hoa Kỳ) là Consumer Electronics Show(CES),Google đã trình làng Android 3.0 (tên mã

Honeycomb) đi kèm với máy tính bảng Xoom của Motorola là phiên bản mới nhất của Android và đang

tiếp tục được phát triển.

Năm 2008, hệ điều hành Android đã chính thức mở toàn bộ mã nguồn, điều đó cho phép các hãng

điện thoại có thể đem mã nguồn về tùy chỉnh, thiết kế lại sao cho phù hợp với mỗi mẫu mã điện thoại

của họ và điều quan trọng nữa là hệ điều hành mở này hoàn toàn miễn phí, không phải trả tiền nên giúp

họ tiết kiệm khá lớn chi phí phát triển hệ điều hành. Những điều đó là cực kỳ tốt không chỉ đối với các

hãng sản xuất điện thoại nhỏ mà ngay cả với những hãng lớn như kỳ tốt không chỉ đối với các hãng sản

xuất điện thoại nhỏ mà ngay cả với những hãng lớn như Samsung, HTC,Motorola,...

Với Google, vì Android hoàn toàn miễn phí, Google không thu tiền từ những hãng sản xuất điện thoại,

tuy không trực tiếp hưởng lợi từ Android nhưng bù lại, những dịch vụ của hãng như Google Search,

Google Maps,... nhờ có Android mà có thể dễ dàng xâm nhập nhanh vào thị trường di động vì mỗi chiếc

điện thoại được sản xuất ra đều được tích hợp hàng loạt dịch vụ của Google. Từ đó hãng có thể thu

được nguồn tài chính, chủ yếu là từ các nguồn quảng cáo trên các dịch vụ đó và tiến tới phát triển thị

phần quảng cáo mạnh mẽ hơn để cạnh tranh với nhiều hãng khác (quảng cáo đang do Yahoo! dẫn đầu).

Generated by Foxit PDF Creator © Foxit Softwarehttp://www.foxitsoftware.com For evaluation only.

Page 6: Nghiên cưú và phát triển Android OS

ThựctậpcơsởvềAndroid

N g u y ễ n V ư ơ n g Q u y ề n

Page 6

Với các nhà phát triển ứng dụng (developers), việc hệ điều hành Android được sử dụng phổ biến đồng

nghĩa với việc họ có thể thoải mái phát triển ứng dụng trên nền Android với sự tin tưởng là ứng dụng đó

sẽ có thể chạy được ngay trên nhiều dòng điện thoại của các hãng khác nhau. Họ ít phải quan tâm là

đang phát triển cho điện thoại nào, phiên bản bao nhiêu vì nền tảng Android là chung cho nhiều dòng

máy, máy ảo Java đã chịu trách nhiệm thực thi những ứng dụng phù hợp với mỗi dòng điện thoại mà nó

đang chạy. Tất cả các chương trình ứng dụng được viết bằng ngôn ngữ Java kết hợp với XML nên có khả

năng khả chuyển cao.

Một số hãng sản xuất điện thoại có sử dụng hệ điều hành Android tiêu biểu :

HTC với các dòng Desire HD, Evo 4G, DROID ERIS, Desire Z, Hero, Desire, Tattoo, Wildfire, Droid

Incredible, Legend, Magic, Google Nexus One, Dream, Aria, Paradise .

LG với các dòng GT540 Optimus, Optimus Chic E720, Optimus One P500, GW620, Optimus Z,

Optimus Q, KH5200 Andro-1, GW880, C710Aloha .

MOTOROLA với các dòng MILESTONE 2, BACKFLIP, Droid XTreme, MT710 ZHILING, MILESTONE,

XT720 MOTOROI, A1680, XT800 ZHISHANG, DEFY, CHARM, XT806,máy tính bảng Xoom,...

SAMSUNG với các dòng máy I9000 Galaxy S, Galaxy Tab, Epic 4G, i5510, I5500 Galaxy 5, I7500

Galaxy, I5800 Galaxy 3, M110S Galaxy S, I6500U Galaxy, Galaxy Q, I5700 Galaxy Spica, I8520

Galaxy Beam, I909 Galaxy S .

SONY : XPERIA X10, XPERIA X10 mini, XPERIA X8

ACER với các dòng máy beTouch T500, Liquid E, Stream, Liquid, beTouch E110, beTouch E130,

beTouch E400, beTouch E120, Liquid Metal,…

Ngoài ra còn nhiều hãng điện thoại vừa và nhỏ khác nữa cũng sử dụng hệ điều hành Android

trong sản phẩm của mình…

1.1.2.Lịch sử phát triển Android:

Tháng 7 năm 2005, Google mua lại Android, Inc., một công ty nhỏ mới thành lập có trụ sở ở Palo Alto, California, Mỹ. Những nhà đồng sáng lập của Android chuyển sang làm việc tại Google gồm có Andy Rubin (đồng sáng lập công ty Danger), Rich Miner (đồng sáng lập công ty Wildfire Communications), Nick Sears (từng là phó chủ tịch của T-Mobile), và Chris White (trưởng nhóm thiết kế và phát triển giao diện tại WebTV). Khi đó, có rất ít thông tin về các công việc của Android, ngoại trừ việc họ đang phát triển phần mềm cho điện thoại di động. Điều này tạo những tin đồn về việc Google có ý định bước vào thị trường điện thoại di động.

Tại Google, nhóm do Rubin đứng đầu đã phát triển một nền tảng thiết bị di động dựa trên hạt nhân Linux, được họ tiếp thị đến các nhà sản xuất thiết bị cầm tay và các nhà mạng trên những tiền đề về việc cung cấp một hệ thống mềm dẻo, có khả năng nâng cấp mở rộng cao.Một số nguồn tin cho biết trước đó Google đã lên danh sách các thành phần phần cứng và các đối tác phần mềm, đồng thời ra hiệu với các nhà mạng rằng họ sẵn sàng hợp tác ở nhiều 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

Generated by Foxit PDF Creator © Foxit Softwarehttp://www.foxitsoftware.com For evaluation only.

Page 7: Nghiên cưú và phát triển Android OS

ThựctậpcơsởvềAndroid

N g u y ễ n V ư ơ n g Q u y ề n

Page 7

làm việc để thực hiện điều này. Các phương tiện truyền thông in và online cũng sớm có bài viết về những tin đồn cho rằng Google đang phát triển một thiết bị cầm tay mang thương hiệu Google. Và lại càng có nhiều suy đoán sau bài viết về việc Google đang định nghĩa các đặc tả công nghệ và trình diễn các mẫu thử với 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.

Liên minh thiết bị cầm tay mở rộng:

Ngày 5 tháng 11 năm 2007, Liên minh thiết bị cầm tay mở rộng (Open Handset Alliance), một

côngxoocxiom 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à T-Mobile được thành lập với mục đích phát triển các tiêu chuẩn

mở cho thiết bị di động.

Ngày 9 tháng 12 năm 2008, thêm 14 thành viên mới gia nhập dự án Android được công bố, gồm

có ARM Holdings, Atheros Communications, Asustek Computer Inc, Garmin Ltd, Softbank, Sony

Ericsson, Toshiba Corp, và Vodafone Group Plc.

Giấy phép:

Trừ những giai đoạn cập nhật ngắn, Android đã lưu hành với mã nguồn mở kể từ ngày 21

tháng 10 năm 2008. Google đã mở toàn bộ mã nguồn (bao gồm cả các ngăn xếp mang và

điện thoại) theo giấy phép Apache.

Với giấy phép Apache, các nhà cung cấp có thể thêm những mở rộng thương mại mà không

cần chuyển chúng thành mã nguồn mở(theo Wikipedia).

1.1.3.Các phiên bản Android:

Android đã trải qua một số các cập nhật kể từ lần đầu phát hành. Những cập nhật này nhìn

chung có nhiệm vụ vá các lỗ hổng và thêm các tính năng mới vào hệ điều hành.

1.5 (Cupcake) Based on Linux Kernel 2.6.27 :

Ngày 30 tháng 4 năm 2009, bản cập nhật 1.5 chính thức (Cupcake) cho Android được phát hành. Trong đó 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 (UI):

Khả năng ghi lại và xem video thông qua chế độ máy ghi hình (camcorder)

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

Generated by Foxit PDF Creator © Foxit Softwarehttp://www.foxitsoftware.com For evaluation only.

Page 8: Nghiên cưú và phát triển Android OS

ThựctậpcơsởvềAndroid

N g u y ễ n V ư ơ n g Q u y ề n

Page 8

Khả năng tự động kết nối với một thiết bị Bluetooth trong một khoảng cách nhất định

Các widget và thư mục (folder) mới có thể chuyển đến the Home screens

Chuyển tiếp màn hình động

1.6 (Donut) Based on Linux Kernel 2.6.29

Ngày 15/9/2009, Phiên bản hệ điều hành Android 1.6 (Donut) và SDK được chính thức phát hành. Phiên bản được bổ sung thêm 1 vài tính năng như:

Cải thiện giao diện và tính năng Android Market Cải thiện và làm mới giao diện ứng dụng camera, camcorder, và

galary. Gallery hỗ trợ người dùng xóa cùng lúc nhiều ảnh. Hỗ trợ tìm kiếm bằng giọng nói Voice Search, giúp người dùng

thao tác nhanh đến các ứng dụng hỗ trợ tìm kiếm , gọi điện , danh bạ ...

Nâng cấp tính năng tìm kiếm searching bookmarks, history, contacts, và từ web thông qua màn hình home.

Hỗ trợ cao nghệ CDMA/EVDO, 802.1x, VPNs, gestures, và text-to-speech .

Hỗ trợ màn hình WVGA . Tăng tốc tìm kiếm và ứng dụng Camera.

2.0/2.1 (Eclair) Based on Linux Kernel 2.6.29

Ngày 26/10/2009, phiên bản hệ điều hành Android 2.0 (Eclair) và SDK chính thức được phát hành với nhiều tính năng mới như :

Tăng tốc phần cứng Hỗ trợ nhiều màn hình home và độ phân giải khác nhau Thay đổi giao diện. Trình duyệt webm mới Browser UI và hỗ trợ HTML5. Giao diện contact lists (danh bạ) mới . Hiển thị hình nền tỉ lệ trắng đen tốt hơn. Cải thiện Google Maps 3.1.2 Hỗ trợ Microsoft Exchange. Hỗ trợ đèn flash cho Camera Hỗ trợ Digital Zoom MotionEvent quản lý và hỗ trợ tốt hơn cho multi-touch . Cải thiện bàn phím. Hỗ trợ Bluetooth 2.1 Thêm ứng dụng Live Wallpapers

Android 2.0.1 SDK chính thức ra mắt ngày 3/12/2009.

Generated by Foxit PDF Creator © Foxit Softwarehttp://www.foxitsoftware.com For evaluation only.

Page 9: Nghiên cưú và phát triển Android OS

ThựctậpcơsởvềAndroid

N g u y ễ n V ư ơ n g Q u y ề n

Page 9

Android 2.1 SDK chính thức ra mắt ngày 12/1/2010.

2.2 (Froyo) Based on Linux Kernel 2.6.32:

Ngày 20 tháng 5 năm 2010, bản SDK 2.2 (Froyo) đã được phát hành. Các thay đổi bao gồm:

Tối ưu hóa toàn bộ hệ điều hành Android về tốc độ, bộ nhớ và hiệu năng

Tăng tốc với bộ thư viện JIT mới. Tích hợp công nghệ Chrome's V8 JavaScript vào trình duyệt web của

Android. Cải thiện hỗ trợ Microsoft Exchange support (security policies, auto-

discovery, GAL look-up, calendar synchronization, remote wipe) Cải thiện và tăng tốc khởi động các ứng dụng. Hỗ trợ USB tethering và WiFi hotspot . Nâng cấp Android Market , hỗ trợ tự động nâng cấp phần mềm. Chuyển đổi nhanh giữa các bàn phím ảo và các bộ từ điển. Hỗ trợ Voice dialing và chia sẽ danh bạ qua Bluetooth Hỗ trợ upload file qua trình duyệt. Hỗ trợ cài phần mềm vào thẻ nhớ. Hỗ trợ lướt web , xem video và chơi game flash với Adobe Flash 10.1.

Gingerbread, Based on Linux Kernel 2.6.33 or 34:

Các tính năng mới bao gồm: Hỗ trợ phát lại video Webm Cải thiện chức năng Copy-paste

Android 3.0(tên mã Honeycomb)

Ra mắt 1-2011,chạy trên máy tính bảng Xoom của Motorola,các tính năng mới: Theo thẻ chứ không theo cửa sổ Trên các smartphone, trình duyệt của Android cho phép bạn lựa chọn giữa các website trên các cửa sổ khác biệt bằng các chuyển đổi thông qua việc nhấp vào một nút và tiếp cận các cửa sổ. Điều này phù hợp cho smartphone, bởi vì các thẻ (tab) sẽ bị kích cỡ màn hình của thiết bị hạn chế. Nhưng với máy tính bảng, tính năng “cửa sổ” lại trở thành một sự khó chịu lớn nhất. Vì thế trình duyệt của Honeycomb sẽ hỗ trợ duyệt web thẻ, nghĩ là sẽ giống với trải nghiệm web trên máy vi tính hơn smartphone. Gmail tiện lợi hơn với 2 cột và “Thanh hành động” Không giống các phiên bản Gmail trên các smartphone nền tảng Android chỉ hiển thị đơn giản một cột dài, phiên bản Honeycomb sẽ chia thành 2 cột để bạn có thể quản lý và di chuyển thư từ. Thay vì phải click vào các cửa sổ riêng

Generated by Foxit PDF Creator © Foxit Softwarehttp://www.foxitsoftware.com For evaluation only.

Page 10: Nghiên cưú và phát triển Android OS

ThựctậpcơsởvềAndroid

N g u y ễ n V ư ơ n g Q u y ề n

Page 10

biệt để theo dõi thư đã gửi hay đã xóa, bạn có thể vào các thư mục trên thông qua cột bên trái. Nhưng phần thú vị nhất của việc nâng cấp Gmail đó là “Thanh hành động” (Action Bar). Theo Google, Thanh hành động “luôn hiển thị khi một ứng dụng đang mở, dù nội dung, theme hay tính năng khác bị quản lý bởi các ứng dụng chứ không phải là hệ thống. Trong trường hợp của Gmail, Thanh hành động sẽ được ưu tiên để có thể di chuyển thư tín từ thư mục này đến thư mục khác. Hỗ trợ đồ họa 3D Andy Rubin (Phó chủ tịch Kỹ thuật Google, phụ trách Android) đã cho thấy khả năng tích hợp đồ họa 3D của Honeycomb vào cuối năm trước bằng việc trình diễn bản mẫu máy tính bảng Android của Motorola có khả năng hỗ trợ phiên bản Google Maps 3D, hiển thị các ngôi nhà và cao ốc. Hiện Google đã cung cấp thêm nhiều thông tin về cơ chế đồ họa 3D của HĐH này – Renderscript - được miêu tả là “một ý tưởng về cách tạo nên hiệu ứng 3D cao cấp cho các ứng dụng, hình nền, carousel v.v..” Theo Google, Renderscript bao gồm API cho đồ họa 3D có thể cung cấp một “nền tảng ngôn ngữ đổ bóng (shader) độc lập” có thế giúp các nhà phát triển kiến lập nhiều hình dáng và kết cấu thực tế hơn trên sản phẩm 3D của họ. Thêm các tính năng hỗ trợ doanh nghiệp. Android đã có bản cập nhật quan trọng đầu tiên cho doanh nghiệp vào mùa hè trước, khi Android 2.2 tiếp cận thị trường. Trong số đó là việc Froyo giúp bộ phận Tin học có khả năng xóa hoặc tăng cường bảo mật cho các mật khẩu, cùng với đó là việc người dùng doanh nghiệp có thể nhận được sự hỗ trợ của Exchange Calendars và tự động tìm kiếm để đồng bộ hóa tài khoản Exchange một cách dễ nhất. Google cho biết Honeycomb sẽ thêm vào tính năng cho doanh nghiệp bằng các cho phép các nhà phát triển ứng dụng mảng này có thể hỗ trợ cho “các chính sách mới, bao gồm cả chính sách mã hóa lưu trữ, mật khẩu có thời hạn, lịch sử mật khẩu và việc yêu cầu mật khẩu chứa nhiều dạng ký tự.” Thiết kế lại bàn phím, thêm Cut và Paste Cuối cùng thì Google cũng thiết kế lại bàn phím trên Android lớn hơn bằng việc thêm vào “đổ bóng và đổi vị trí” các phím cho phù hợp với việc gõ bằng cả bàn tay chứ không phải một hai ngón. Không chỉ vậy, nó còn có phím Tab, giúp bạn không phải nhấn space nhiều lần để tạo thụt đầu dòng đầu mỗi đoạn. Việc nhấn và giữ các phím xác định sẽ mở một menu để bạn có thể thêm vào các ký tự đặc biệt. Ví như, nếu bạn giữ phím “e”, bạn có thể lựa chọn các ký tự "é," "ë," hay "ê” để thêm vào. Dù đó là một tính năng khá hữu ích, nhưng bạn cũng nên nhớ là đừng để tay lên một điểm qua lâu, nếu không muốn văn

Generated by Foxit PDF Creator © Foxit Softwarehttp://www.foxitsoftware.com For evaluation only.

Page 11: Nghiên cưú và phát triển Android OS

ThựctậpcơsởvềAndroid

N g u y ễ n V ư ơ n g Q u y ề n

Page 11

bản trang trọng của bạn sở hữu vài ba ký tự lạ hoắc. Thêm vào đó, Google cũng thay đổi tính năng cắt&dán của máy tính bảng và cho phép người dùng “nhanh chóng chọn một từ bằng cách nhấn và giữ sau đó chỉnh khu vực cần chọn bằng cách kéo một mũi tên tới vị trí khác.” Thanh hành động đề cập ở trên cũng có thể giúp người dùng có lựa chọn cắt, sao chép và dán nhanh. (nguồn:Wikipedia và Internet)

1.1.4.So sánh Android với các hệ điều hành khác:

1) So sánh hệ điều hành Android với các hệ điều hành di động khác.

Giống nhau : Đều là hệ điều hành di động nên mang đầy đủ bản chất của hệ điều hành di động nói

chung. (Đã đề cập ở trên)

Khác nhau :

Android là hệ điều hành mã nguồn mở và miễn phí trong khi các hệ điều hành di động còn lại

đều là nguồn đóng và có phí (khi một hãng thứ hai sử dụng).

Android được phát triển từ nhân linux do đó nó có thể chạy tốt trên nhiều dòng điện thoại

khác nhau. Có độ tương thích cao với các loại phần cứng khác nhau nhiều hơn so với các hệ

điều hành di động còn lại.

Các ứng dụng chạy trên android được viết bằng Java trong khi đó, ứng dụng trên các hệ điều

hành khác chủ yếu là viết bằng C/C++/Object C. Ngay cả Symbian có hỗ trợ Java thì cũng khác so

với Android, trong khi hệ điều hành Android sử dụng máy ảo Java là Dalvik VM do chính Google

phát triển thì Symbian lại sử áydụng máy ảo Java là J2ME của Sun.

2)Về lĩnh vực máy tính bảng,Android cũng đang phát triển không ngừng lớn mạnh,sánh ngang cùng với

iPad của Apple ra đời trước đó và nhiều hãng sản xuất máy tính bảng khác như BlackBerry,…

1.2.Kiến trúc của Android:

1.2.1.Phân tầng Android:

Hệ điều hành Android có 4 tầng từ dưới lên trên là tầng hạt nhân Linux (Phiên bản 2.6), tầng Libraries &

Android runtime , tầng Application Framework và trên cùng là tầng Application(như hình 1.1).

Generated by Foxit PDF Creator © Foxit Softwarehttp://www.foxitsoftware.com For evaluation only.

Page 12: Nghiên cưú và phát triển Android OS

ThựctậpcơsởvềAndroid

N g u y ễ n V ư ơ n g Q u y ề n

Page 12

Hình 1.1:phân tầng kiến trúc Android

1. Tầng hạt nhân Linux (Linux Kernel layer)

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).

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 yếu phần chủ:

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

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.

2. Tầng Library và android runtime

Phần này có 2 thành phần là phần Library và Android Runtime

a. Phần Libraries. Phần này có nhiều thư viện được viết bằng C/C++ để các phần mềm có thể

sử dụng, các thư viện đó được tập hợp thành một số nhóm như :

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.

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.

….

Generated by Foxit PDF Creator © Foxit Softwarehttp://www.foxitsoftware.com For evaluation only.

Page 13: Nghiên cưú và phát triển Android OS

ThựctậpcơsởvềAndroid

N g u y ễ n V ư ơ n g Q u y ề n

Page 13

b. Phần 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.

3. Tầng Application Framework.

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:

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).

Generated by Foxit PDF Creator © Foxit Softwarehttp://www.foxitsoftware.com For evaluation only.

Page 14: Nghiên cưú và phát triển Android OS

ThựctậpcơsởvềAndroid

N g u y ễ n V ư ơ n g Q u y ề n

Page 14

….

4). Tầng Application : Ðây là lớp ứng dụng giao tiếp với nguời dùng, bao gồm các ứng dụng như :

Các ứng dụng cơ bản, đuợ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 dồ (Map), quay phim chụp ảnh (camera)...

Các ứng dụng đuợc cài thêm nhu 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.

1.2.2.Hệ thống tệp tin trên Android:

Hệ thống quản lý tập tin trong android là được phát triển từ linux nên có nhiều đặc điểm giống

với hệ thống quản lý tập tin trên linux. Đó là những đặc điểm về quy tắc đặt tên file, đường dẫn

thư mục, hệ thống cây thư mục, những thư mục đặc trưng, hệ thống quyền hạn của file đối với

người/ nhóm sử dụng trên hệ thống. Cũng giống như linux, trên android có thể thực thi nhiều

lệnh liên quan đến hệ thống file như chmod, chown, chgrp... để chỉnh sửa thuộc tính, hệ thống

quyền hạn trên file.

a. Tổng quan về hệ thống file trên Android :

Trong Android, các file duợc tổ chức thành các thu mục, theo mô hình phân cấp. Tham chiếu dến một file bằng tên và duờng dẫn. Các câu lệnh thao tác file cho phép thực hiện các chức nang nhu dịch chuyển, sao chép toàn bộ thu mục cùng với các thu mục con chứa trong nó.

Generated by Foxit PDF Creator © Foxit Softwarehttp://www.foxitsoftware.com For evaluation only.

Page 15: Nghiên cưú và phát triển Android OS

ThựctậpcơsởvềAndroid

N g u y ễ n V ư ơ n g Q u y ề n

Page 15

Có thể sử dụng các ký tự, dấu gạch duới, chữ số, dấu chấm và dấu phảy dể dặt tên file. Không duợc bắt dầu một tên file bằng dấu chấm hay chữ số. Những ký tự khác nhu ‘/’, ‘?’, ‘*’, là ký tự dặc biệt duợc dành riêng cho hệ thống. Chiều dài của tên file có thể tới 256 ký tự. Trong hệ diều hành Android có sự phân biệt tên file chữ hoa và chữ thuờng, diều dó có nghia là trong cùng 1 thu mục có thể tồn tại những file có tên là File, FILE, file.. và chúng là những file khác nhau..

Tất cả các file trong Android có chung cấu trúc vật lý là chuỗi các byte (byte stream).

Cấu trúc thống nhất này cho phép Android áp dụng khái niệm file cho mọi thành phần

dữ liệu trong hệ thống. Thư mục cũng nhu các thiết bị duợc xem nhu file. Chính việc

xem mọi thứ nhu các file cho phép Android quản lý và chuyển dổi dữ liệu một cách dễ

dàng. Một thu mục chứa các thông tin về thư mục, đuợc tổ chức theo một định dạng đặc biệt. Các thành phần đuợc xem nhu các file, chúng đuợc phân biệt dựa trên kiểu file: ordinary file, directory file, character device file, và block device file.

b. Các kiểu file trên android:

- Trong nhiều hệ điều hành như window, người ta phân biệt rõ file (tập tin) và folder

(hay directory : thư mục) là 2 thành phần khác hẳn nhau. Tuy nhiên trên hệ điều hành

Android (cũng như Linux) thì coi directory cũng là file và nó là một loại file đặc biệt. Thực

tế còn một số loại file nữa có thể liệt kê theo bảng sau(như hình 1.2) :

Chữ cái biểu diễn Kiểu file

D thư mục (directory)

b file kiểu khối (block-type special file)

C file kiểu ký tự (character-type special file)

L liên kết tượng trưng (symbolic link)

P file đường ống (pipe)

S Socket

- file bình thường (regular file)

Hình 1.2: Bảng liệt kê một số kiểu file trong Linux

c. Tổ chức quyền sở hữu và quyền hạn trên file:

Tương tự trên hệ thống linux, trên hệ điều hành android, một file có thể liên kết với một

người sử dụng và một nhóm người sử dụng. Sự liên kết đó là một tập hợp các quyền

hạn truy cập bao gồm quyền được phép đọc (read), được phép ghi (write) và được

phép thực thi (execute).

Cụ thể như sau: Một file sẻ có những quyền hạn tương ứng với 9 ký tự theo mẫu sau :

với 3 ký tự “r,w,x” nghĩa là có quyền tương ứng với ký tự viết tắt đó,” –“ nghĩa là không

có quyền hạn đó(hình 1.3):

Generated by Foxit PDF Creator © Foxit Softwarehttp://www.foxitsoftware.com For evaluation only.

Page 16: Nghiên cưú và phát triển Android OS

ThựctậpcơsởvềAndroid

N g u y ễ n V ư ơ n g Q u y ề n

Page 16

Hình 1.3:một số quyền làm việc với file

3 ký tự đầu tiên là quyền hạn chủ nhân file

3 ký tự giữa là quyền hạn của nhóm tài khoản sở hữu file

3 ký tự cuối là quyền hạn của những người không thuộc nhóm sở hữu file.

Ví dụ : Một file có dãy ký tự biểu diễn quyền hạn là rwxr-xr—thì điều đó có nghĩa là:

3 ký tự đầu là “rwx” : chủ nhân có thể đọc, ghi và thực thi file

3 ký tự tiếp theo là “r-x” thì nhóm tài khoản sở hữu file có quyền đọc và thực thi file

chứ không có quyền ghi, chỉnh sửa file.

3 ký tự cuối là “r—“ nghĩa là những người không sở hữu file chỉ được phép đọc mà

không thể chỉnh sửa hay thực thi file.

Trên hệ thống Android, để biết xem được quyền hạn đó, ta có thể sử dụng câu lệnh là:ls

–l–d.

Ví dụ : ls -l -d /mnt/sdcard/Bachkhoa để xem quyền hạn của file

/mnt/sdcard/Bachkhoa thì có thể trả về kết quả như sau :

d---rwxr-x system sdcard_rw 2010-12-29 21:00 Bachkhoa

Thì những thông tin có thể lấy về là :

Ký tự dầu tiên là chữ d : vậy file dó có kiểu là thu mục hay là file bao hàm

Chuỗi ghi quyền hạn là “---rwxr-x” thì có nghĩa:

o “---“:nguời sở hữu không đuợc phép đọc, ghi, thực thi file

o “rwx”: nhóm tài khoản sử hữu đuợc phép đọc, ghi, thực thi file

o “r-x” : những nguời không sở hữu file duợc phép đọc và thực thi file nhưng không đuợc phép chỉnh sửa hay ghi lên file.

Chuỗi miêu tả file : sdcard_rw nghia là dây thuộc thiết bị thẻ nhớ sd, dọc và ghi duợc.

Bachkhoa : tên của file. 2011-03-11 21:00 :thời gian chỉnh sửa lần cuối.

Ngoài ra có 2 lệnh khác cũng hữu dụng là lệnh chown để thay đổi quyền sở hữu file,

lệnh chmod để thay đổi quyền hạn liên quan đến file và lệnh chgrp để thay đổi nhóm

người sở hữu file.

d. Cây thư mục trên hệ điều hành Android:

Generated by Foxit PDF Creator © Foxit Softwarehttp://www.foxitsoftware.com For evaluation only.

Page 17: Nghiên cưú và phát triển Android OS

ThựctậpcơsởvềAndroid

N g u y ễ n V ư ơ n g Q u y ề n

Page 17

Thư mục (hay có thể gọi là file) root là thư mục gốc của tất cả các file thư mục còn lại. Dưới nó

có chứa một số file thư mục hệ thống. Mỗi thư mục (trừ thư mục root) đều có một thư mục cha

chứa nó, bản thân nó cũng có thể có nhiều file thư mục con. Cấu trúc đó có thể mô tả bằng một

cây thư mục có dạng như sau (hình 1.4):

Hình 1.4:cấu trúc một cây thư mục đơn giản Giới thiệu một vài thu mục tiêu biểu :

/(root) : Là thu mục gốc,là thu mục duy nhất không có thu mục cha / mnt : thu mục chứa thiết bị luu dộng (removeable) /system : chứa những thành phần co bản nhất của hệ thống /ect : chứa những file cấu hình của hệ thống, nó cực kỳ quan trọng vì sự hoạt dộng của

hệ thống dều bị chi phối ở những file cấu hình này. /system/lost+found : chứa những tập tin bị mất lúc khởi dộng máy /system/font : chứa những font chữ hiển thị duợc /system/lib : chứa các thu viện dể các phần mềm hoạt dộng (các phần mềm viết bằng

ngôn ngữ java) /system/app : chứa các file apk của phần mềm. (Các file cài dặt ứng dụng, kiểu nhu MSI

trong window hay dev trong Linux) /system/bin : chứa các chuong trình nội trú của hệ thống. ....

II.Các công cụ lập trình Android:

2.1.Giới thiệu về các công cụ lập trình Android:

Như đã nói ở phần trước,hệ điều hành Andoird đặc biệt là có nhiều API hữu ích cho các nhà phát triển

phần mềm, nhà phát triển ROM có thể xây dựng nên nhiều ứng dụng, hệ thống khác nhau.Mặt

khác,Android còn là hệ điều hành mã nguồn mở nên hoàn toàn miễn phí nên các nhà phát triển ứng

dụng (developers) có thể thoải mái phát triển ứng dụng trên nền Android mà không phải lo lắng về vấn

đề bản quyền(những điều khoản ràng buộc chặt chẽ,hạn chế một số quyền,thủ tục đăng kí phức tạp,…)

như trong một số hệ điều hành di động khác như iOS của Apple,Symbian của Nokia,…Ngoài ra việc hệ

cache mnt system etc var

lost+found framework

lib font bin app

/(root)

Generated by Foxit PDF Creator © Foxit Softwarehttp://www.foxitsoftware.com For evaluation only.

Page 18: Nghiên cưú và phát triển Android OS

ThựctậpcơsởvềAndroid

N g u y ễ n V ư ơ n g Q u y ề n

Page 18

điều hành Android dựa trên nền tảng Linux và được sử dụng ngày càng phổ biến(theo thống kê thì

Android đang là hệ điều hành được ưa chuộng nhất tại Mĩ trên các thiết bị di động) đồng nghĩa với việc

giới lập trình viên có thể với sự tin tưởng là ứng dụng được viết ra sẽ có thể chạy được ngay trên nhiều

dòng di động của các hãng khác nhau. Họ ít phải quan tâm là đang phát triển cho loại di động nào, phiên

bản bao nhiêu vì nền tảng Android là chung cho nhiều dòng máy, máy ảo Java đã chịu trách nhiệm thực

thi những ứng dụng phù hợp với mỗi dòng di động mà nó đang chạy. Tất cả các chương trình ứng dụng

được viết bằng ngôn ngữ Java kết hợp với XML nên có khả năng khả chuyển cao.Vì vậy có khá nhiều

công cụ phát triển ứng dụng cho Android.Trong phần này em xin giới thiệu hai công cụ mã nguồn mở

trong số các công cụ phổ biến nhất là Eclipse và Netbean.Đầu tiên là với Eclipse.

2.2.Lập trình Android với Eclipse:

2.2.1.Cài đặt các công cụ cần thiết để lập trình Android trên Eclipse:

Đầu tiên để phát triển ứng dụng cho Android,ta cần phải cài đặt môi trường phát triển cho nó trên máy

tính,và Google android SDK là thứ đầu tiên phải có,nhưng nếu chỉ có mỗi bộ android SDK thôi thì chưa

đủ mà cần có thêm một môi trường phát triển tích hợp(IDE) mà cụ thể ở đây là eclipse và một môi

trường java(nền tảng ứng dụng của Android là dựa trên java).

a.Các quá trình cài đặt và cấu hình Eclipse:

Bước 1:sau khi download về android SDK ta sẽ giải nén vào một thư mục nào đấy(ví dụ

c:\android) rồi chạy file SDK Manager.exe để tải về các gói và công cụ cần thiết cho việc lập

trình(hình 1):

Bước 2:tiếp theo là tích hợp Android SDK vào eclipse: khởi chạy Eclipse, vào Help -> Install new

softwares. Chọn Add, gõ vào ô Name tên tùy ý và tại ô Location gõ vào địa chỉ để tải về

ADT: http://dl-ssl.google.com/android/eclipse/.Dưới đây là hình ảnh một số bước(hình 2 và hình

3):

Bước 3:tiếp tục là cấu hình Android: mở Eclipse window preferences Android trong

mục SDK location chọn Browse đưa đường dẫn đến thư mục SDK(thư mục mà ta mới

download về và giải nén c:\android) bấm apply.

Bước 4:tạo một điện thoại ảo (AVD)

Mở eclipse window Android SDK and AVD manager ở cái cửa sổ mới đó,ta sẽ

chọn mục Virtual devices bấm nút New…

Mục Name: đây là mục đặt tên cho AVD,ta có thể sử dụng các kí tự “A->Z”,”a->z”,chữ số

nhưng sao cho dễ nhớ và tiện dụng nhất.

Mục target: dựa trên các nền tảng Android,từ Android 1.0 cho đến Android 2.2,ví dụ

như:Android 1.0 -> target:1,Android 1.1 -> target :2,Android 2.2 -> target :8

Sdcard size: là kích cỡ thẻ nhớ ảo cho Android (tùy chọn).

Sau đó bấm Create AVD.

Generated by Foxit PDF Creator © Foxit Softwarehttp://www.foxitsoftware.com For evaluation only.

Page 19: Nghiên cưú và phát triển Android OS

ThựctậpcơsởvềAndroid

N g u y ễ n V ư ơ n g Q u y ề n

Page 19

Hoặc ta cũng có thể tạo AVD theo cách khác sử dụng command prompt:chuyển làm việc vào thư

mục tools của Android SDK,tại đây gõ lệnh: android create avd --target 8 --name my_avd với my_avd là

tên máy ảo avd.

Hình 2.1.1:chọn một số gói ứng dụng cần thiết

Hình 2.1.2:tích hợp android SDK vào eclipse

Cuối cùng là tạo một project:

Đầu tiên vào Eclipse->File > New > Project>Android>Android Project gồm có:

-Project name:tên dự án trên eclipse

-Build Target: chọn phiên bản android và API tùy chọn.

-Application name:tên ứng dụng tùy chọn sẽ được xuất hiện.

-Package name: android yêu cầu phải cho package vào các thư mục vì thế khi điền tên package phải

điền tên theo kiểu phân cấp như folder1.folder2....NamePackage(như ở ví dụ này là myApp.vidu 1)và

android cũng không chấp nhận tên package đứng 1 mình, cái này để quản lý dễ hơn khi số lượng ứng

dụng nhiều. Khi vào thư mục chứa android data ,Eclipse sẽ tạo sẵn một thư mục là myApp .

Generated by Foxit PDF Creator © Foxit Softwarehttp://www.foxitsoftware.com For evaluation only.

Page 20: Nghiên cưú và phát triển Android OS

ThựctậpcơsởvềAndroid

N g u y ễ n V ư ơ n g Q u y ề n

Page 20

-Create Activity:nếu được điền,android sẽ tạo một Activity bắt đầu khởi động đầu tiên trong ứng dụng.

-Min SDK Version:chỉ ra ứng dụng sẽ được xây dựng trên nền tảng nào,ví dụ:android 8

hình 2.1.3:điền url kho lưu trữ của Google

b.Sau khi đã cấu hình xong eclipse và cho chạy thử ta sẽ thấy trình giả lập Android (emulator) cho

ta kết quả như thế này(hình 2.1.4):

Hình 2.1.4:emulator

2.2.2.Các thành phần trong ứng dụng Android:

Các thành phần của một ứng dụng của Android chia làm sáu loại bao gồm:

Generated by Foxit PDF Creator © Foxit Softwarehttp://www.foxitsoftware.com For evaluation only.

Page 21: Nghiên cưú và phát triển Android OS

ThựctậpcơsởvềAndroid

N g u y ễ n V ư ơ n g Q u y ề n

Page 21

1.Activity: một cách đơn giản thì Activity là nền của một ứng dụng. Một Activity đại diện cho một giao

diện người sử dụng trực quan, ở đó người dùng có thể thực hiện những gì họ muốn làm. Ví dụ một

activity thể hiện một màn hình ở đó có danh bạ của người sử dụng, người sử dụng có thể lựa chọn danh

bạ hiển thị số điện thoại hoặc hiển thị ảnh và chú thích của từng contact. Một chương trình nhắn tin

SMS có thể bao gồm các activity là : một activity thể hiện một danh sách các số liên lạc (có thể gửi được

tin nhắn) , một activity thể hiện một trang để người dùng viết tin nhắn và lựa chọn gửi đến một danh bạ

nào đó, và một activity khác lại cho phép xem lại các tin đã gửi hoặc chỉnh sửa chúng. Mặc dù tất cả các

activity kết hợp lại mới tạo nên ứng dụng có giao diện cho người sử dụng, nhưng mỗi activity vẫn hoạt

động độc lập với những cái còn lại. Mỗi activity là một lớp con của lớp cơ sở Activity.

Vì một ứng dụng có thể bao gồm một hoặc nhiều activity và do đó có bao nhiêu activity, mỗi activity

hoạt động ra sao, giao diện trông thế nào là do ứng dụng quyết định và thiết kế. Thông thường thì có

một activity được đánh dấu là activty đầu tiên, và người dùng có thể thấy nó ngay khi ứng dụng được

khởi chạy. Mỗi một activity thì có một cửa sổ làm việc để sử dụng và thực thi trên đó. Thông thường mỗi

cửa sổ này đều lấp đầy màn hình. Nhưng cũng có khi nó nhỏ hơn và chèn ngay trên một cửa sổ làm việc

khác.

Những nội dung trực quan ở mỗi cửa sổ làm việc được cung cấp bởi một hệ thống các view, những đối

tượng được thừa kế từ lớp cơ sở View. Mỗi một view thì điều khiển một khu vực có dạng hình chữ nhật

đặc biệt bên trong cửa sổ. Mỗi lớp cha, parent views, bao gồm và tổ chức những tập hợp cho các lớp

con của nó. Những view là nút lá (không có con) thực thi trên khu vực mà chúng điều khiển và trả lời các

kích hoạt do người dùng tác động vào khu vực nó kiểm soát. Do đó có thể nói, mỗi view là nơi mà

activity tương tác với người sử dụng. Ví dụ, một view có thể hiển thị một ảnh mà khi người sử dụng click

vào cái ảnh đó sẽ có một lệnh được thực thi. Android có sẵn một số view cho ta sử dụng như là button

(nút), text field (trường văn bản), scroll bar (thanh cuộn) , menu item, check box (hộp check),…

Một view được đặt vào bên trong một cửa sổ của activity bởi method Activity.setContentView(). Object

ContentView là object gốc của cây phân cấp view. (tìm hiểu thêm ở phần user interface). Khi khởi động

một ứng dụng Android nào đó thì bao giờ cũng có một main Activity được gọi, hiển thị màn hình giao

diện của ứng dụng cho phép người dùng tương tác.

2.Service: thành phần chạy ẩn trong Android. Một service thì không có giao diện trực quan, nhưng nó có

thể chạy ngầm định trên thiết bị và không giới hạn thời gian hoạt động. Ví dụ như một service giúp thiết

bị có thể chơi nhạc ngoài desktop trong khi người sử dụng đang làm công việc khác, hay nó có thể tải dữ

liệu trên mạng về máy, hoặc tính toán công việc nào đó và sẵn sàng cung cấp kết quả khi có một activity

cần đến nó. Mỗi service thì được thừa kế từ lớp cơ sở là Service.

Ví dụ như trình chơi nhạc từ một play list. Trình chơi nhạc chắc chắn có một hoặc nhiều hơn một

activity có khả năng để người sử dụng chọn bài hát và bắt đầu chơi chúng. Tuy nhiên người sử dụng

mong muốn khi thoát khỏi trình chơi nhạc, nhạc vẫn được chơi bình thường, và activity thì không có khả

năng thực hiện điều đó vì nó không giao tiếp với người dùng nữa. Để giữ cho nhạc vẫn tiếp tục được

chơi thì activity của trình chơi nhạc gọi một service đến và chạy nó ở dạng ngầm định. Hệ thống sẽ tiếp

tục chạy service này ngay cả khi activity thoát ra ngoài (không còn trên màn hình nữa).

Generated by Foxit PDF Creator © Foxit Softwarehttp://www.foxitsoftware.com For evaluation only.

Page 22: Nghiên cưú và phát triển Android OS

ThựctậpcơsởvềAndroid

N g u y ễ n V ư ơ n g Q u y ề n

Page 22

Hoàn toàn có thể kết nối tới một service đang chạy hoặc nếu chúng chưa bắt đầu chạy thì có thể khiến

chúng chạy. Khi đã kết nối với service, bạn có thể giao tiếp với nó thông qua một giao diện mà service

hiển thị. Ví dụ với service chơi nhạc thì, người sử dụng có thể play, stop, pause, next, rewind hoặc chơi

lại từ đầu.

Giống như activity và các thành phần khác, service chạy trên luồng xử lý chính của ứng dụng. Do đó

chúng không thể ngăn chặn các thành phần khác, hay can thiệp vào giao diện của người dùng. Chúng

thường sinh ra một luồng mới cho các nhiệm vụ bị chi phối thời gian thực hiện. Service sử dụng để cập

nhật dữ liệu, đưa ra các cảnh báo (notifications) và không bao giờ hiển thị cho người dùng thấy.

Vòng đời của Service:

-Khi có một context nào đó gọi startService() để bắt đầu service mong muốn. Nếu service đó chưa được

tạo thì sẽ gọi phương thức onCreate() rồi gọi tiếp onStart() và khi đó service chạy nền bên dưới.

-Nếu sau đó lại có một context muốn bắt đầu service này mà service đã đang chạy, chỉ có phương thức

onStart() của service được gọi.

-Dù service có được gọi bắt đầu bao nhiêu lần thì cũng chỉ có một thể hiện của service và chỉ cần gọi

stopService() một lần để kết thúc service.

Hình 2.1.5:Lifecycle-startService

Lifecycle – bindService():thông thường,vòng đời của service khi có client kết nối từ đầu như sau:

– Cũng bắt đầu bằng phương thức onCreate() rồi đến onBind() và service chạy nền.

– Khi không còn client kết nối tới thì service gọi phương thức onUnbind() rồi onDestroy().

Generated by Foxit PDF Creator © Foxit Softwarehttp://www.foxitsoftware.com For evaluation only.

Page 23: Nghiên cưú và phát triển Android OS

ThựctậpcơsởvềAndroid

N g u y ễ n V ư ơ n g Q u y ề n

Page 23

Hình 2.1.6:Lifecycle-bindService

Có một số trường hợp không thông thường, ví dụ như:

Có một context khởi động (start) một service, sau đó có một số client kết nối (bind) tới service

Có nhiều client cùng lúc kết nối (bind) tới service

Một activity vừa gọi startService() vừa gọi bindService()

Sử dụng service:

• Dùng trong các ứng dụng nghe nhạc.

• Dùng để xử lý các thao tác mất thời gian và không nhất thiết phải hiển thị lên activity (download,

upload…)

• Đôi khi cần một ứng dụng vận hành liên tục để xử lý những việc mong muốn mà không làm

phiền người dùng service.

• Làm những thao tác tính toán, xử lý đều đặn nào đó và kết quả khi nào người dùng cần thì mới

xem

• …

3.Content Provider: kho dữ liệu chia sẻ. Một content provider tạo ra tập hợp các dữ liệu đặc biệt của

ứng dụng này mà các ứng dụng khác có thể dùng chung. Dữ liệu này có thể được lưu ở file hệ thống,

trong hệ cơ sở dữ liệu SQLite hoặc trong bất cứ chỗ nào lưu trữ được trên thiết bị . Và cũng như những

thành phần khác thì content provider được kế thừa từ lớp ContentProvider, cài đặt các phương thức

mặc định, cho phép các ứng dụng khác có thể gọi nó ra, lưu trữ dữ liệu của nó. Tuy nhiên các ứng dụng

không thể gọi trực tiếp các phương này. Chúng gọi các phương thức này gián tiếp qua việc gọi một đối

tượng ContenResolve.Hơn thế chúng dùng content resolver và gọi những phương thức đó. Một content

resolver có thể giao tiếp đến nhiều content provider; nó cộng tác với các provider để quản lý bất kỳ giao

tiếp bên trong liên quan ,chúng dựa vào nhau để thực thi các tiến trình xử lý thông tin phức tạp. Content

Provider được sử dụng để quản lý và chia sẻ dữ liệu giữa các ứng dụng.

Generated by Foxit PDF Creator © Foxit Softwarehttp://www.foxitsoftware.com For evaluation only.

Page 24: Nghiên cưú và phát triển Android OS

ThựctậpcơsởvềAndroid

N g u y ễ n V ư ơ n g Q u y ề n

Page 24

Mỗi ứng dụng Android chạy trên process của nó. Bất cứ lúc nào nó cũng quản lý được các thành phần

của nó:

Android phải đảm bảo các process thành phẩn phải đang chạy

Khởi tạo nếu cần thiết

Một trường hợp tương thích của cái thành phần là có giá trị, đang khởi tạo trường hợp nếu cần

thiết.

4.Intent: nền tảng để truyền tải các thông báo. Intent được sử dụng để gửi các thông báo đi nhằm khởi

tạo một Activity hay Service để thực hiện công việc người sử dụng mong muốn. VD: khi mở 1 trang web,

ta gửi một intent đi để tạo một activity mới hiển thị trang web đó.Mô hình Intent:

Hình 2.1.7:Intent

trong mô hình trên Activity B chỉ trả về kết quả khi cần thiết. VD : giả sử Activity A nhắc người dùng chọn

ảnh profile ; Activity B liệt kê các ảnh trong thẻ nhớ sdcard và cho phép người dùng chọn ảnh.

-Intent về cơ bản là một cấu trúc dữ liệu, được mô tả trong lớp android.content.Intent, các thuộc tính

của một đối tượng Intent được miêu tả trong bảng sau:

Hình 2.1.8

5.Broadcast Receiver: thành phần thu nhận các Intent bên ngoài gửi tới. Một bộ broadcast receiver là 1

thành phần không làm gì cả nhưng lại nhận và tương tác với các thông báo được đưa ra. Nhiều bộ phát

(broadcast) hình thành trong code của hệ điều hành – ví dụ, thông báo rằng timezone đã được thay đổi,

rằng pin yếu, hoặc thông báo người dùng vừa đổi ngôn ngữ hiển thị. Một ứng dụng cũng có thể bắt đầu

phát thông báo – ví dụ, để cho các ứng dụng khác biết dữ liệu trên mạng đã được tải về thiết bị và sẵn

sàng sử dụng. Một ứng dụng cũng có thể không có bất kì bộ thu phát nào nếu chúng không cần trả lời

các thông báo từ thiết bị hay ứng dụng khác. Tất cả các bộ thu phát thì kế thừa từ lớp cơ sở

BroadcastReceiver. Có 2 cách thu-phát đó là:

Generated by Foxit PDF Creator © Foxit Softwarehttp://www.foxitsoftware.com For evaluation only.

Page 25: Nghiên cưú và phát triển Android OS

ThựctậpcơsởvềAndroid

N g u y ễ n V ư ơ n g Q u y ề n

Page 25

Không có thứ tự: receiver nào đủ điều kiện thì nhận hết, không phân biệt và cũng tách rời nhau.

Có thứ tự: receiver nào đăng ký ưu tiên hơn thì nhận trước, và có thể truyền thêm thông tin xử

lý cho các receiver sau.

Vòng đời của BroadcastReceiver bản chất chỉ có duy nhất một phương thức onReceive():

Khi có sự kiện mà BroadcastReceiver đã đăng ký nhận được phát đi, thì phương thức

onReceive() của BroadcastReceiver đó sẽ được gọi.

Sau khi thực thi xong phương thức này, vòng đời của Receiver sẽ kết thúc.

Các bộ thu phát thì không có giao diện sử dụng, tuy nhiên chúng có thể khởi động một ứng dụng khi trả

lời thông tin mà chúng nhận được. Hoặc chúng có thể sử dụng NotificationManager để cảnh báo cho

người sử dụng biết. Các thông báo có thể gây chú ý tới người dùng theo những cách khác nhau – ví dụ

như nháy đèn màn hình, rung, chơi nhạc,… Thông thường thì chúng tạo ra 1 thông báo “cứng” trên màn

hình hiện thời của thiết bị, để người dùng có thể thấy và đọc những thông báo đó. VD: ta viết một

chương trình thay thế cho phần gọi điện mặc định của Android, khi đó bạn cần một BroadcastReceiver

để nhận biết các Intent là các cuộc gọi tới. Một số broadcast thông dụng:

Báo hệ thống khởi động xong

Báo pin có sự thay đổi

Báo có package mới cài vào hoặc xóa đi

Báo tắt máy

Báo cắm sạc, rút sạc…

Thông báo tin nhắn tới

Thông báo cắm, rút thẻ nhớ

Thông báo có cuộc gọi đi

Ngoài ra ta cũng thể định nghĩa broadcast cho riêng mình (mục tiêu chính của việc này giúp có thể liên

lạc giữa các ứng dụng ta viết hoặc thông báo một sự kiện liên quan đến ứng dụng của bạn với các ứng

dụng khác)

6.Notification: đưa ra các cảnh báo mà không làm cho các Activity phải ngừng hoạt động.Ví dụ như:

trong những trường hợp ta muốn hiện một thông báo về một sự kiện nào đó cho người dùng mà không

muốn ảnh hưởng đến công việc của họ hoặc không chắc họ có đang cầm điện thoại (tin nhắn, cuộc gọi,

email…) hay như ta muốn hiển thị thông tin một việc nào đó đang xảy ra trên điện thoại và mong muốn

người dùng biết (đang nghe nhạc, đang trong cuộc gọi, thiếu thẻ nhớ,…).

Activity, Service, Broadcast Receiver và Content Provider mới là những thành phần chính cấu thành nên

ứng dụng Android, bắt buộc phải khai báo trong AndroidManifest .

2.2.3.Quản lí tiến trình(process):

Như em đã trình bày ở phần I,Android có cơ chế quản lý các process theo chế độ ưu tiên. Các process có

độ ưu tiên thấp sẽ bị Android giải phóng mà không hề cảnh báo nhằm đảm bảo tài nguyên.

Generated by Foxit PDF Creator © Foxit Softwarehttp://www.foxitsoftware.com For evaluation only.

Page 26: Nghiên cưú và phát triển Android OS

ThựctậpcơsởvềAndroid

N g u y ễ n V ư ơ n g Q u y ề n

Page 26

1.Foreground process: là process của ứng dụng hiện thời đang được người dùng tương tác.

2.Visible process: là process của ứng dụng mà activity đang hiển thị đối với người dùng (phương thức

onPaused() của activity được gọi).

3.Service process: là Service đang chạy.

4.Background process: là process của ứng dụng mà các activity của nó ko hiển thị với người dùng

(phương thức onStoped() của activity được gọi).

5.Empty process: process không có bất cứ 1 thành phần nào hoạt động.

Theo chế độ ưu tiên thì khi cần tài nguyên, Android sẽ tự động hủy các process, trước tiên là các empty

process (các process không hoạt động hoặc bị corrupted).

2.2.4. Vòng đời của Activity trong Android:

Như em đã giới thiệu ở trên , Actitvity là thành phần quan trọng nhất và đóng vai trò chính trong xây

dựng ứng dụng Android. Hệ điều hành Android quản lý Activity theo dạng stack: khi một Activity mới

được khởi tạo, nó sẽ được xếp lên đầu của stack và trở thành activity thực thi, các Activity trước đó sẽ bị

tạm dừng và chỉ hoạt động trở lại khi Activity mới được giải phóng.

Activity bao gồm 4 trạng thái là:

- active (running): Activity đang hiển thị trên màn hình (foreground).

- paused: Activity vẫn hiển thị (visible) nhưng không thể tương tác (lost focus). Ví dụ: một activity mới

xuất hiện hiển thị giao diện đè lên trên activity cũ, nhưng giao diện này nhỏ hơn giao diện của activity

cũ, do đó ta vẫn thấy được 1 phần giao diện của activity cũ nhưng lại không thể tương tác với nó.

- stop: Activity bị thay thế hoàn toàn bởi Activity mới sẽ tiến đến trạng thái stop

- killed: Khi hệ thống bị thiếu bộ nhớ, nó sẽ giải phóng các tiến trình theo nguyên tắc ưu tiên. Các

Activity ở trạng thái stop hoặc paused cũng có thể bị giải phóng và khi nó được hiển thị lại thì các

Activity này phải khởi động lại hoàn toàn và phục hồi lại trạng thái trước đó.

Biểu đồ miêu tả trạng thái Activity:

Generated by Foxit PDF Creator © Foxit Softwarehttp://www.foxitsoftware.com For evaluation only.

Page 27: Nghiên cưú và phát triển Android OS

ThựctậpcơsởvềAndroid

N g u y ễ n V ư ơ n g Q u y ề n

Page 27

Hình 2.1.9:trạng thái activity(vòng đời ứng dụng)

Các giai đoạn trong biểu đồ trạng thái trên:

Entire lifetime: từ phương thức onCreate( ) cho tới onDestroy( )

Visible liftetime: từ phương thức onStart( ) cho tới onStop( )

Foreground lifetime: từ phương thức onResume( ) cho tới onPause( )

Khi xây dựng một activity ta cần xây dựng các thành phần sau:

1.Tạo Menu:

• Nhấp chuột phải vào một dòng trống trong Activity:

o Chọn Source Override/Implement methods chọn onCreateOptionsMenu và

onOptionsItemSelected

o Trong onCreateOptionsMenu, thêm đoạn code: menu.add(0, 111, 0, "Item1");

o Trong onOptionsItemSelected, thêm xử lý dạng:

switch (item.getItemId()) {

case 111:

//statements

break;

}

Generated by Foxit PDF Creator © Foxit Softwarehttp://www.foxitsoftware.com For evaluation only.

Page 28: Nghiên cưú và phát triển Android OS

ThựctậpcơsởvềAndroid

N g u y ễ n V ư ơ n g Q u y ề n

Page 28

2.Khởi động activity:

Không tường minh: đoạn code bên dưới sẽ khởi động một activity nào đó đang có khả năng xem ảnh.

Intent intent = new Intent(Intent.ACTION_VIEW);

intent.setData(MediaStore.Images.Media.EXTERNAL_CONTENT_URI);

startActivity(intent);

Với cách khởi động activity không tường minh, ta sẽ cần sử dụng Intent-filter. Intent-filter sẽ giúp một

activity (chung hơn là một thành phần ứng dụng) đăng ký với hệ thống là nó có thể làm được thao tác

gì, trong nhóm nào, với loại dữ liệu nào. Như vậy khi intent và intent-filter khớp nhau, activity sẽ được

hệ thống khởi động.

3. Liên lạc giữa 2 activity:

Khi khởi động một activity, ta có thể gửi kèm dữ liệu trong intent như ví dụ sau:

intent.putExtra("value1", new String("Hello world"));

intent.putExtra(“value2", new Long(100));

Bên phía activity được khởi động, có thể lấy dữ liệu được gửi như sau:

getIntent().getExtras().getString("value1");

getIntent().getExtras().getLong("value2");

Có thể khởi động một activity với một yêu cầu nào đó và activity kia khi làm xong công việc sẽ trả lại kết

quả cho activity trước. Ví dụ activity A yêu cầu một activity làm giúp việc chụp ảnh, activity B đáp ứng

được việc này, sau khi user chụp ảnh xong sẽ trả lại file ảnh cho activity A.

2.2.5. XML trong Android:

Không giống như lập trình java thông thường, lập trình android ngoài các lớp được viết trong file *.java

mà còn sử dụng XML để thiết kế giao diện cho ứng dụng. Tất nhiên ta hoàn toàn có thể thiết kế một giao

diện như ý muốn mà không cần tới bất cứ dòng XML nào, nhưng sử dụng XML sẽ đơn giản công việc đi

rất nhiều. Đồng thời sử dụng XML sẽ giúp việc chỉnh sửa ứng dụng sau này trở nên dễ dàng.

Về nguyên tắc, khi lập trình ứng dụng ta thiết kế giao diện bằng XML và cài đặt các xử lý khi tương tác

với giao diện trong code.

2.2.6.Xây dựng chương trình đầu tiên:

2.2.6.1.Phần này em sẽ trình bày một ví dụ điển hình với mọi nền tảng ứng dụng là chương trình in ra

màn hình dòng chữ “Hello world!”:

Generated by Foxit PDF Creator © Foxit Softwarehttp://www.foxitsoftware.com For evaluation only.

Page 29: Nghiên cưú và phát triển Android OS

ThựctậpcơsởvềAndroid

N g u y ễ n V ư ơ n g Q u y ề n

Page 29

B1 : khởi tạo 1 project

Vào thẻ File -> New -> Project ->Android project(hoặc chọn New -> Other ->Android Project). Hoặc trên

thanh công cụ bấm vào icon như trong hình 2.1.10:

B2 : tạo một project mới

Project name: vidu 1

Build Target: Chọn Android 2.2

Application name:vidu 1

Package name: at.exam

Create activity: Nguyen Vuong Quyen(tạo một lớp con của lớp Activity, dùng để hiển thị một màn hình

ở đây là màn hình HelloWorld của chúng ta).

Min SDK version: 4 (tức SDK 1.6, ở đây chúng ta khai báo là ứng dụng này có thể đáp ứng được phiên

bản SDK cũ nhất là phiên bản nào).

Sau khi hoàn tất bấm Finish, project mới đã được tạo.

2.2.6.2.Tìm hiểu cấu trúc một project đơn giản bao gồm:

Thư mục src chứa source code ứng dụng. Gồm các package và các class.

Thư mục gen chứa các file tự động phát sinh (mà thường gặp nhất là R.class)

Thư mục res để chứa các resource dùng trong ứng dụng (thông qua ID)

Thư mục assets chứa các resource file mà ứng dụng cần dùng (dưới dạng file)

File Manifest là file khai báo thông tin về ứng với hệ thống (như ứng dụng gồm những màn hình

nào, có service nào… xin các quyền gì, phiên bản bao nhiêu, dùng từ SDK phiên bản nào…)

Thư mục Android 2.2:chứa các package hỗ trợ cho việc lập trình

Ngoài ra còn có file thư viện…

2.2.6.3.Build và run một dự án:tạo file *.apk trong thư mục bin của ứng dụng

Theo mặc định,project sẽ tự động built khi chúng ta lưu project

Hoặc ta cũng có thể bỏ chọn build automatically trên menu Project để loại bỏ chức năng tự

động build.Để build project thủ công,click chuột phải vào project chọn build.

2.2.6.4. Chạy ứng dụng Hello World:

Bấm Ctrl + F11 để chạy ứng dụng, sẽ hiện lên emulator hoặc bấm chuột phải trên project cần run chọn

run as -> android application

Generated by Foxit PDF Creator © Foxit Softwarehttp://www.foxitsoftware.com For evaluation only.

Page 30: Nghiên cưú và phát triển Android OS

ThựctậpcơsởvềAndroid

N g u y ễ n V ư ơ n g Q u y ề n

Page 30

Hình 2.1.11

*) Tạo UI trực tiếp từ code:

Vào mục src (chứa mã java của chương trình) để xem code:

package com.tuan10.vidu1;

import android.app.Activity;

import android.os.Bundle;

public class HelloWorldActivity extends Activity {

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

}

}

Trong đó R là file được tự động sinh ra chứa tài nguyên id, R.layout.main là id của layout chính.

Và đây là file main.xml trong thư mục res/layout

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

Generated by Foxit PDF Creator © Foxit Softwarehttp://www.foxitsoftware.com For evaluation only.

Page 31: Nghiên cưú và phát triển Android OS

ThựctậpcơsởvềAndroid

N g u y ễ n V ư ơ n g Q u y ề n

Page 31

android:orientation="vertical"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

>

<TextView

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="@string/hello"

/>

</LinearLayout>

*)

ở đây ta có thể soạn thảo mã mới,phát triển thêm nhiều ứng dụng phức tạp nữa,giả sử ta chỉnh sửa

đoạn mã trong file *.java trong thư mục src/at.exam trên như sau:

package com.tuan10.vidu1; import android.app.Activity; import android.os.Bundle; import android.widget.TextView; public class Quyenanh extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); TextView tv = new TextView(this); tv.setText("Hello, Android"); setContentView(tv); }

}

Sau đó chọn run android applications ta sẽ có kết quả là

Generated by Foxit PDF Creator © Foxit Softwarehttp://www.foxitsoftware.com For evaluation only.

Page 32: Nghiên cưú và phát triển Android OS

ThựctậpcơsởvềAndroid

N g u y ễ n V ư ơ n g Q u y ề n

Page 32

Hình 2.1.12

Để có thể hiển thị một hình ảnh đơn giản định dạng *.png thì trong file *.java ở phương thức onCreat()

thêm câu lệnh là:

ImageView <object_name>=new ImageView (this);//tạo một object image mới

< object_name>.setImageResource(R.drawable.helloimage);//chỉ đường dẫn đến file lưu ảnh

Hoặc trong file main.xml ,chỉnh sửa thêm thẻ <ImageView> là

<ImageView

android:id="@+id/imageview"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:src="@dra wable/icon"

/>

Chạy chương trình sau khi chỉnh sửa (hình 2.1.13):

Generated by Foxit PDF Creator © Foxit Softwarehttp://www.foxitsoftware.com For evaluation only.

Page 33: Nghiên cưú và phát triển Android OS

ThựctậpcơsởvềAndroid

N g u y ễ n V ư ơ n g Q u y ề n

Page 33

2.2.6.5.Debug chương trình

Dể debug một ứng dụng ban đầu,click chuột phải nên tên Project,chọn Debug as->Android

application,ứng dụng sẽ khởi động debug.Có hai cách debug là sử dụng DDMS và sử dụng logcat :

a.Sử dụng DDMS(Dalvik Debug Monitor Server):

Mở DDMS trên eclipse

Mở DDMS trong thư mục tools của android SDK.

DDMS:công cụ cho việc gỡ rối

Quản lí thiết bị và bộ giả lập emulator

Có thể giám sát ứng dụng chạy

Giám sát việc sử dụng bộ nhớ của chương trình

Gửi một sự kiện event đến emulator:dưới dạng một thông điệp hoặc tạo một lời gọi đến

emulator.

Gỡ rối khi được yêu cầu.

Khi ứng dụng được khởi động,lựa chọn gói ứng dụng trên thanh tab device của DDMS,click chọn icon

màu xanh để bắt đầu debug ứng dụng này( hình 2.1.14):

Generated by Foxit PDF Creator © Foxit Softwarehttp://www.foxitsoftware.com For evaluation only.

Page 34: Nghiên cưú và phát triển Android OS

ThựctậpcơsởvềAndroid

N g u y ễ n V ư ơ n g Q u y ề n

Page 34

b.Debug sử dụng logcat (hình 2.1.15):

Hệ thống android tạo file log của tất cả các ứng dụng bao gồm các lỗi và bản ghi của ứng dụng,và logcat

chỉ là một phần của DDMS để đọc file log của emulator hoặc device.Ứng dụng có thể ghi thông tin vào

file log sử dụng câu lệnh System.out.println(information); hoặc lớp log: Log.d(Tag,information);.

2.2.6.6.Device của Android ( hình 2.1.16):

Device cũng là một chức năng hữu ích trong Android hỗ trợ trên eclipse giúp ta quản lý thiết bị ảo cũng

như thật,do đó ta có thể xem trước chương trình đã viết. Mở Device bằng cách vào Window -> Show

View -> Device hoặc vào Window -> Show View -> Others -> Android -> Device.

Chức năng mình thường sử dụng nhất của device là Screen Capture, cực kỳ tiện để lấy ảnh minh họa làm

thuyết trình hoặc giới thiệu trên Google Market.

Generated by Foxit PDF Creator © Foxit Softwarehttp://www.foxitsoftware.com For evaluation only.

Page 35: Nghiên cưú và phát triển Android OS

ThựctậpcơsởvềAndroid

N g u y ễ n V ư ơ n g Q u y ề n

Page 35

2.3.Lập trình Android với Netbean:

Về cơ bản thì lập trình trên Netbean không khác gì nhiều với trên eclipse nên phần này em xin chỉ trình

bày về cấu hình và cài đặt plugin cho Netbean để viết các ứng dụng Android trên nền Windows:

2.3.1.Cài đặt plugin cho Netbean:

B1:mở Netbean,vào vào Tool | Plugin từ thanh menu sau đó chọn tab Setting từ hộp thoại xuất hiện

(hình 2.2.1):

B2: Ở tab Setting ta chọn nút Add -> hiện hộp thoại khác -> ở đây ta nhập tên của plugin (vd: Android

Plugin) và nhập URL trỏ tới server mà Netbean có thể tải về bản cài đặt của Android Plugin (dành riêng

cho Netbean): http://kenai.com/downloads/nbandroid/updates.xml(hình 2.2.2):

Generated by Foxit PDF Creator © Foxit Softwarehttp://www.foxitsoftware.com For evaluation only.

Page 36: Nghiên cưú và phát triển Android OS

ThựctậpcơsởvềAndroid

N g u y ễ n V ư ơ n g Q u y ề n

Page 36

Sau đó ta chọn OK, những thông số vừa được tạo sẽ được liệt kê ở khung bên trái của tab Setting mà ta

đang mở nãy giờ (hình 2.2.3):

Nhấn vào dấu check Android Plugin nếu nó chưa check.

B4: tiếp theo ta chọn tab Availalble Plugins -> check chọn mục Android -> chọn nút Install phía dưới góc

trái của hộp thoại -> hộp thoại sau sẽ xuất hiện(hình 2.2.4):

(Nếu chưa tìm thấy Android thì ta vào ô Search ở bên phải đành vào chữ Android rồi check nó vào.)

Generated by Foxit PDF Creator © Foxit Softwarehttp://www.foxitsoftware.com For evaluation only.

Page 37: Nghiên cưú và phát triển Android OS

ThựctậpcơsởvềAndroid

N g u y ễ n V ư ơ n g Q u y ề n

Page 37

Sau khi nhấn vào Install nó sẽ hiện ra như sau (hình 2.2.5):

Tiếp theo bạn chon Next de tiep tuc cai dat Android Plugin. Cứ bấm Next và Continue cho tới khi kết

thúc (hình 2.2.6):

2.3.2.Cấu hình Netbean:

B1: vào Netbean chọn Tools | Java Platform từ menu. Chọn Add Platform, sau đó chọn "Google Android

Open Handheld Platform" như hình sau (hình 2.2.7):

Generated by Foxit PDF Creator © Foxit Softwarehttp://www.foxitsoftware.com For evaluation only.

Page 38: Nghiên cưú và phát triển Android OS

ThựctậpcơsởvềAndroid

N g u y ễ n V ư ơ n g Q u y ề n

Page 38

chọn Next, một hộp thoại xuất hiện yêu cầu chọn thư mục mà Android SDk đã được cài đặt trên đó, sau

đó chọn Next .

Hình 2.2.8

(nếu không tìm thấy thư mục cài đặt của Android SDK thì ta có thể thêm thư mục Android của eclipse

cũng được hoặc có thể download (ta có thể chọn windows,linux,mac OS) tại địa chỉ

http://developer.android.com/sdk/index.html sau khi download về rồi giải nén ra một thư mục nào

đó,ví dụ:c:\android chẳng hạn).

-Tiếp theo đặt tên vào ô Name của platform rồi bấm Finish.

B2: Quay lại hộp thoại java Platform Manager ta sẽ thấy Android platform xuất hiện trong danh sách,ta

bấm vào nút close là đã cài xong(hình 2.2.9)

B3:sau khi đã hoàn thành các bước trên ta có thể bắt đầu viết chương trình ứng dụng cho Android

Generated by Foxit PDF Creator © Foxit Softwarehttp://www.foxitsoftware.com For evaluation only.

Page 39: Nghiên cưú và phát triển Android OS

ThựctậpcơsởvềAndroid

N g u y ễ n V ư ơ n g Q u y ề n

Page 39

Vào file -> New Project,hộp thoại New Project hiện ra,chọn Android -> Android Application (hình 2.2.10)

Tiếp theo trong hộp thoại New Android Application ta cũng điền đầy đủ các thông số cần thiết cho một

ứng dụng mới tương tự như ở Eclipse(hình 2.2.11):

Hình 2.2.11:tạo một ứng dụng mới trên Netbean

III.Lập trình ứng dụng Android:

Trong phần này em xin trình bày sơ lược về đồ họa 2D trong Android và một chương trình Android

translator.Nhưng trước khi đi vào một ứng dụng cụ thể,em xin trình bày thêm về vòng đời một ứng

dụng trong Android để từ đó phát triển thành một phần mềm hoàn chỉnh vì theo em thì điều này là

thực sự cần thiết nếu muốn tiếp tục phát triển chương trình hơn nữa.

3.1. Life-Cycle program:

Generated by Foxit PDF Creator © Foxit Softwarehttp://www.foxitsoftware.com For evaluation only.

Page 40: Nghiên cưú và phát triển Android OS

ThựctậpcơsởvềAndroid

N g u y ễ n V ư ơ n g Q u y ề n

Page 40

3.1.1.Các thành phần trong một ứng dụng của Android:

Một ứng dụng gồm một hoặc nhiều thành phần được định nghĩa trong file manifest.xml. Một thành

phần có là một trong các phần sau:

1. Một Activity

Một Activity hiện hữu cho một giao diện của ứng dụng. Mỗi Activity có một giao diện riêng. Activity

được đánh dấu là Activity đầu tiên sẽ được chạy khi chương trình chạy. Việc chuyển từ activity này đến

activity khác bằng việc gọi intents.

2. Một Service

Một service không có giao diện, nhưng chạy ở bên dưới chúng ta không biết được thời gian của nó. Nó

có thể kết nối tới một service đang chạy (và khởi động service nếu service đó không chạy). Trong quá

trình kết nối, bạn có thể giao tiếp với service qua một giao diện đó là serviec exposes.

3. Một broadcast receiver

Broadcast receiver là một thành phần mà không có gì nhưng nhận và phản ứng lại những thông báo

được broadcast. Nhiều broadcast gốc trong mã hệ thống (ví dụ: "you got mail") và các ứng dụng cũng có

thể khởi tạo broadcast. Broadcast receivers không hiển thị giao diện người dùng. Tuy nhiên, họ có thể

khởi tạo một Activity phản hồi lại những thông tin được nhận. Họ có thể dùng notification manager để

cảnh giác đến người dùng.

4. Một content provider

Một content provider cung cấp một tập chi tiết dữ liệu ứng dụng đến các ứng dụng khác. Dữ liệu thường

được lưu trữ ở file hệ thống, hoặc trong một SQLite database. Content Provider hiện thực một tập

phương thức chuẩn mà các ứng dụng khác có thể truy xuất và lưu trữ dữ liệu của loại nó điều khiển.

Tuy nhiên, những ứng dụng không thể gọi các phương thức trực tiếp. Hơn thế chúng dùng content

resolver và gọi những phương thức đó. Một content resolver có thể giao tiếp đến nhiều content

provider; nó cộng tác với các provider để quản lý bất kỳ giao tiếp bên trong liên quan.

Mỗi ứng dụng Android chạy trên process của nó. Bất cứ lúc nào nó cũng quản lý được các thành phần

của nó:

Android phải đảm bảo các process thành phẩn phải đang chạy

Khởi tạo nếu cần thiết

Một trường hợp tương thích của cái thành phần là có giá trị, đang khởi tạo trường hợp nếu cần

thiết.

Chu kỳ ứng dụng

Generated by Foxit PDF Creator © Foxit Softwarehttp://www.foxitsoftware.com For evaluation only.

Page 41: Nghiên cưú và phát triển Android OS

ThựctậpcơsởvềAndroid

N g u y ễ n V ư ơ n g Q u y ề n

Page 41

Một tiến trình Linux gói gọn một ứng dụng Android đã được tạo ra cho ứng dụng khi codes cần được run

và sẽ còn chạy cho đến khi

1. nó không phụ thuộc

2. hệ thống cần lấy lại bộ nhớ mà nó chiếm giữ cho các ứng dụng khác

Một sự khác thường và đặc tính cơ bản của Android là thời gian sống của tiến trình ứng dụng không

được điều khiển trực tiếp bới chính nó. Thay vào đó, nó được xác định bởi hệ thống qua một kết hợp

của

1. những phần của ứng dụng mà hệ thống biết đáng chạy

2. những phần quan trong như thế nào đối với người dùng

3. bao nhiêu vùng nhớ chiếm lĩnh trong hệ thống

Chu kỳ sống thành phần

Các thành phần ứng dụng có một chu kỳ sống, tức là mỗi thành phần từ lúc bắt đầu khởi tạo và đến thời

điểm kết thúc. Giữa đó, đôi lúc chúng có thể là active hoặc inactive, hoặc là trong trường hợp activies nó

có thể visible hoặc invisible

Hình 3.1 Chu kỳ sống của ứng dụng Android

Activity Stack

Bên trong hệ thống các activity được quản lý như một activity stack. Khi một Activity mới được bắt đầu,

nó được đặt ở đỉnh của stack và trở thành activity đang chạy,activity trước sẽ ở bên dưới activity mới và

sẽ không thấy trong suốt quá trình activity mới tồn tại. Nếu người dùng nhấn nút Back thì activity kế tiếp

của stack sẽ di chuyển lên và trở thành active.

Generated by Foxit PDF Creator © Foxit Softwarehttp://www.foxitsoftware.com For evaluation only.

Page 42: Nghiên cưú và phát triển Android OS

ThựctậpcơsởvềAndroid

N g u y ễ n V ư ơ n g Q u y ề n

Page 42

Hình 3.2 Chồng Activities

Các trạng thái của chu kỳ

Một Activity chủ yếu có 3 chu kỳ chính sau:

1. Active hoặc running: Khi Activity là được chạy trên màn hình. Activity này tập trung vào những

thao tác của người dùng trên ứng dụng.

2. Paused: Activity là được tạm dừng (paused) khi mất focus nhưng người dùng vẫn trông thấy. Có

nghĩa là một Activity mới ở trên nó nhưng không bao phủ đầy màn hình. Một Activity tạm dừng

là còn sống nhưng có thể bị kết thúc bởi hệ thống trong trường hợp thiếu vùng nhớ.

3. Stopped: Nếu nó hoàn toàn bao phủ bởi Activity khác. Nó vẫn còn trạng thái và thông tin thành

viên tron nó. Người dùng không thấy nó và thường bị loại bỏ trong trường hợp hệ thống cần

vùng nhớ cho tác vụ khác.

Generated by Foxit PDF Creator © Foxit Softwarehttp://www.foxitsoftware.com For evaluation only.

Page 43: Nghiên cưú và phát triển Android OS

ThựctậpcơsởvềAndroid

N g u y ễ n V ư ơ n g Q u y ề n

Page 43

Hình 3.3 Các trạng thái của chu kỳ một Activity

Chu kỳ của ứng dụng

Hình 3.4 Chu kỳ ứng dụng Android

Các sự kiện trong chu kỳ sống

Nếu một Activity đượ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ởi việc finish() (gọi hàm finish() của nó), hoặc đơn giản giết 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 restart và phục hồi lại trạng thái

trước.

Khi một Activity chuyển qua chuyển lại giữa các trạng thái, nó phải báo việc chuyển của nó bằng việc gọi

hàm transition.

Generated by Foxit PDF Creator © Foxit Softwarehttp://www.foxitsoftware.com For evaluation only.

Page 44: Nghiên cưú và phát triển Android OS

ThựctậpcơsởvềAndroid

N g u y ễ n V ư ơ n g Q u y ề n

Page 44

Hình 3.5 Các phương thức trong 1 chu kỳ của Activity

Tất cả các phương thức là những móc nối mà bạn có thể override để làm tương thich công việc trong

ứng dụng khi thay đổi trạng thái. Tất cả các Activity bắt buộc phải có onCreate() để khởi tạo ứng dụng.

Nhiều Activity sẽ cũng hiện thực onPause() để xác nhận việc thay đổi dữ liệu và mặt khác chuẩn bị dừng

hoạt động với người dùng.

ng của ứng dụng

7 phương thức chuyển tiệp định nghĩa trong chu kỳ sông của một Activity. Thời gian sống của một

Activity 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 Activity

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 tron

onDestroy().

Visible Lifetime

Visible lifetime của một activity diễn ra giữa lầ 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 activity trên màn hình, có nghĩa là nó không bị foreground

hoặc đang tương tác với người dùng. Giữa 2 phương thức người dùng có thể duy trì tài nguyên để hiển

thị activity đến người dùng.

Foreground LifeTime

Foregroudn lifetime của một activity diễn ra giữa 2 lần gọi onResume() và onPause()

Trong khoảng thời gian này, activity ở trước tất cả activity khác và là đang tương tác với người dùng.

Một Actifity thường xuyên chuyển trạng thái giữa resumed và paused.

onPause() được gọi khi thiết bi đi vào trạng thái sleep hoặc khi một activity mới là được start.

onResume() được gọi khi một Activity hoặc một intent mới được delivered

Các phương thức của chu kỳ sống

Phương thức: onCreate()

Được gọi khi activity lần đầu tiên được tạo

Ở đây bạn làm tất cả các cài đặt tĩnh -- tạo các view, kết nối dữ liệu đến list và .v.v

Phương thức này gửi qua một đối tượngBundle chứa đựng từ trạng thái trược của Activity

Luôn theo sau bởi onStart()

Phương thức: onRestart()

Được gọi sau khi activity đã được dừng, chỉ một khoảng đang khởi động lần nữa (stared again)

Generated by Foxit PDF Creator © Foxit Softwarehttp://www.foxitsoftware.com For evaluation only.

Page 45: Nghiên cưú và phát triển Android OS

ThựctậpcơsởvềAndroid

N g u y ễ n V ư ơ n g Q u y ề n

Page 45

Luôn theo sau bởi onStart()

Phương thức: onStart()

Được gọi trước khi một activity visible với người dùng

Theo sau bởi onResume() nếu activity đến trạng thái foreground hoặc onStop() nế nó trở nên ẩn.

Phương thức: onResume()

Được gọi trước khi activity bắt đầu tương tác với người dùng

Tại thời điểm này activity ở trên dỉnh của stack activity.

Luôn theo sau bởi onPause()

Phương thức: onPause()

Được gọi khi hệ thống đang resuming activity khác

Phương thức này là điển hình việc giữ lại không đổi dữ liệu.

Nó nên được diễn ra một cách nhanh chóng bởi vì activity kế tiếp sẽ không được resumed ngay

cho đến khi nó trở lại.

Theo sau bởi onResume nếu activity trở về từ ở trước, hoặc bởi onStop nếu nó trở nên visible

với người dùng.

Trạng thái của activity có thể bị giết bởi hệ thống

Phương thức: onStop()

Được gọi khi activity không thuộc tầm nhìn của người dùng.

Nó có thể diễn ra bởi vì nó đang bị hủy, hoặc bởi vì activity khác vữa được resumed và bao phủ

nó.

Được theo sau bởi onRestart() nếu activity đang đở lại để tương tác với người dùng, hoặc

onDestroy() nếu activity đang bỏ.

Trạng thái của activity có thể bị giết bởi hệ thống

Phương thức: onDestroy()

Được gọi trước khi activity bị hủy.

Đó là lần gọi cuối cùng mà activity này được nhận.

Generated by Foxit PDF Creator © Foxit Softwarehttp://www.foxitsoftware.com For evaluation only.

Page 46: Nghiên cưú và phát triển Android OS

ThựctậpcơsởvềAndroid

N g u y ễ n V ư ơ n g Q u y ề n

Page 46

Nó được gọi khác bởi vì activity đang hoàn thành, hoặc bởi vì hệ thống tạm thởi bị hủy diệt để

tiết kiệm vùng nhớ.

Bạn có thể phân bietj giữa 2 kịch bản với phương isFinshing()

Trạng thái của activity có thể được giết bởi hệ thống.

Killable States Activity đang ở trạng thái này có thể bị kết thúc bởi hệ thống bất kỳ lúc nào sau khi phương thức trả về. 3 phương thức (onPause(), onStop(), và onDestroy() là killable onPause() phải được gọi trước khi tiến trình bị giết -- onStop và onDestroy có thể là không. Vì vậy chúng ta dung onPause viết bất kỳ dữ liệu chắc để lưu trữ. Ví dụ: Demo Life Cycle Mục đích của ứng dụng này sẽ gọi các hàm trong Activity Life Cycle //protected void onCreate(Bundle savedInstanceSta te); //protected void onStart(); //protected void onRestart(); //protected void onResume(); //protected void onPause(); //protected void onStop(); //protected void onDestroy(); Tạo một ứng dụng mới trên Android với tên LifeCycle,file lifecycle.java : java:

1. package com.android;

2. import android.app.Activity;

3. import android.content.SharedPreferences;

4. import android.os.Bundle;

5. import android.view.View;

6. import android.widget.Button;

7. import android.widget.EditText;

8. import android.widget.TextView;

9. import android.widget.Toast;

10. // Muc dich cua vi du nay la show cac su kien cua chu ky song

11. //protected void onCreate(Bundle savedInstanceSta te);

Generated by Foxit PDF Creator © Foxit Softwarehttp://www.foxitsoftware.com For evaluation only.

Page 47: Nghiên cưú và phát triển Android OS

ThựctậpcơsởvềAndroid

N g u y ễ n V ư ơ n g Q u y ề n

Page 47

12. //protected void onStart();

13. //protected void onRestart();

14. //protected void onResume();

15. //protected void onPause();

16. //protected void onStop();

17. //protected void onDestroy();

18. public class VietAndLifeCycle extends Activity {

19. public static final String TAGID = "VietAnddev:LifeCycle";

20. public static final int acMode = Activity.MODE_PRIVATE;

21. EditText txtMsg;

22. Button btnFinish;

23. TextView txtTodo;

24. /** Called when the activity is first created. */

25. @Override

26. public void onCreate(Bundle savedInstanceState) {

27. super.onCreate(savedInstanceState);

28. setContentView(R.layout.main);

29. txtMsg = (EditText) findViewById(R.id.txtMsg);

30. updateFromSavedState_IfNeeded();

31. txtTodo = (TextView) findViewById(R.id.txtTodo);

32. String msg = "Instructions: \n " + "0. New instance (onCreate, onStart, onResume ) \n "+

"1. Back Arrow (onPause, onStop, onDestro y) \n "+ "2. Finish (onPause, onStop, onDes troy)

\n "+ "3. Home (onPause, onStop) \n " + "4. After 3> App Tab> re-execute current app \n " + "

(onRestart, onStart, onResume) \n "+ "5. Run DDMS> Receive a phone call or SMS \n "+ "

(onRestart, onStart, onResume) \n " + "6. Enter some data - repeat steps 1-5 \n ";

33. txtTodo.setText(msg);

34. btnFinish = (Button) findViewById(R.id.btnFinish);

Generated by Foxit PDF Creator © Foxit Softwarehttp://www.foxitsoftware.com For evaluation only.

Page 48: Nghiên cưú và phát triển Android OS

ThựctậpcơsởvềAndroid

N g u y ễ n V ư ơ n g Q u y ề n

Page 48

35. btnFinish.setOnClickListener(new Button.OnClickListener() {

36. @Override

37. public void onClick(View v) {

38. // TODO Auto-generated method stub

39. finish();

40. }

41. });

42. // xem message nay khi onCreate()duoc goi

43. Toast.makeText(getBaseContext(), "onCreate ...", Toast.LENGTH_LONG)

44. .show();

45. }

46. @Override

47. protected void onDestroy() {

48. super.onDestroy();

49. clearMyPrefs();

50. Toast.makeText(getBaseContext(), "onDestroy ...", Toast.LENGTH_LONG)

51. .show();

52. }

53. @Override

54. protected void onPause() {

55. super.onPause();

56. saveDataFromCurrentState();

57. Toast.makeText(getBaseContext(), "onPause ...", Toast.LENGTH_LONG)

58. .show();

59. }

Generated by Foxit PDF Creator © Foxit Softwarehttp://www.foxitsoftware.com For evaluation only.

Page 49: Nghiên cưú và phát triển Android OS

ThựctậpcơsởvềAndroid

N g u y ễ n V ư ơ n g Q u y ề n

Page 49

60. @Override

61. protected void onRestart() {

62. super.onRestart();

63. Toast.makeText(getBaseContext(), "onRestart ...", Toast.LENGTH_LONG) .show();

64. }

65. @Override

66. protected void onResume() {

67. super.onResume();

68. Toast.makeText(getBaseContext(), "onResume...", Toast.LENGTH_LONG) .show();

69. }

70. @Override

71. protected void onStart() {

72. super.onStart();

73. Toast.makeText(getBaseContext(), "onStart ...", Toast.LENGTH_LONG) .show();

74. }

75. @Override

76. protected void onRestoreInstanceState(Bundle savedInstanceState) {

77. super.onRestoreInstanceState(savedInstanceState);

78. Toast.makeText(getBaseContext(), "onRestoreInstanceState ...BUNDLING", Toast.LENGTH_

LONG).show();

79. }

80. @Override

81. protected void onStop() {

82. super.onStop();

83. Toast.makeText(getBaseContext(), "onStop ...", Toast.LENGTH_LONG) .show();

84. }

Generated by Foxit PDF Creator © Foxit Softwarehttp://www.foxitsoftware.com For evaluation only.

Page 50: Nghiên cưú và phát triển Android OS

ThựctậpcơsởvềAndroid

N g u y ễ n V ư ơ n g Q u y ề n

Page 50

85. private void saveDataFromCurrentState() {

86. // TODO Auto-generated method stub

87. SharedPreferences myPrefs = getSharedPreferences(TAGID, acMode);

88. SharedPreferences.Editor myEditor = myPrefs.edit();

89. myEditor.putString("txtMsg", txtMsg.getText().toString());

90. myEditor.commit();

91. }

92. private void clearMyPrefs() {

93. // TODO Auto-generated method stub

94. SharedPreferences myPrefs = getSharedPreferences(TAGID, acMode);

95. SharedPreferences.Editor myEditor = myPrefs.edit();

96. myEditor.clear();

97. myEditor.commit();

98. }

99. private void updateFromSavedState_IfNeeded() {

100. // TODO Auto-generated method stub

101. SharedPreferences myPrefs = getSharedPreferences(TAGID, acMode);

102. if ((myPrefs != null) && (myPrefs.contains("txtMsg"))) {

103. String myData = myPrefs.getString("txtMsg", "");

104. txtMsg.setText(myData);

105. }

106. }

107. @Override

108. protected void onSaveInstanceState(Bundle outState){

109. super.onSaveInstanceState(outState);

Generated by Foxit PDF Creator © Foxit Softwarehttp://www.foxitsoftware.com For evaluation only.

Page 51: Nghiên cưú và phát triển Android OS

ThựctậpcơsởvềAndroid

N g u y ễ n V ư ơ n g Q u y ề n

Page 51

110. }

111. }

Mã nguồn phần thiết kế (layout):

java:

1. <?xml version="1.0" encoding="utf-8"?>

2. <LinearLayout

3. android:id="@+id/widget0"

4. android:layout_width="fill_parent"

5. android:layout_height="fill_parent"

6. android:background="#ffffcccc"

7. android<img src="images/smilies/redface.gif" alt="" title="Embarrassment" class="inlineimg" bo

rder="0">rientation="vertical"

8. xmlns:android="http://schemas.android.com/apk/res/android"

9. >

10. <EditText

11. android:id="@+id/txtMsg"

12. android:layout_width="fill_parent"

13. android:layout_height="95px"

14. android:background="#ffffff99"

15. android:text="Enter data here"

16. android:textSize="18sp"

17. android:layout_x="0px"

18. android:layout_y="17px"

19. >

20. </EditText>

21. <Button

Generated by Foxit PDF Creator © Foxit Softwarehttp://www.foxitsoftware.com For evaluation only.

Page 52: Nghiên cưú và phát triển Android OS

ThựctậpcơsởvềAndroid

N g u y ễ n V ư ơ n g Q u y ề n

Page 52

22. android:id="@+id/btnFinish"

23. android:layout_width="117px"

24. android:layout_height="49px"

25. android:background="#ffffcc99"

26. android:text="Finish"

27. android:textStyle="bold"

28. android:layout_x="82px"

29. android:layout_y="115px"

30. android:gravity="center"

31. >

32. </Button>

33. <EditText

34. android:id="@+id/txtTodo"

35. android:layout_width="fill_parent"

36. android:layout_height="251px"

37. android:background="#ffff9999"

38. android:text="Todo"

39. android:textSize="18sp"

40. android:layout_x="0px"

41. android:layout_y="181px"

42. >

43. </EditText>

44. </LinearLayout>

3.2.Xử lí đồ họa 2D trong Android:

Generated by Foxit PDF Creator © Foxit Softwarehttp://www.foxitsoftware.com For evaluation only.

Page 53: Nghiên cưú và phát triển Android OS

ThựctậpcơsởvềAndroid

N g u y ễ n V ư ơ n g Q u y ề n

Page 53

Vì kiến thức còn ít nên phần này em chỉ trình bày sơ qua về đồ họa 2D trong Android thôi ạ. Android

cung cấp cho chúng ta một thư viện đồ họa đầy đủ, đó là gói android.graphics. Bên trong nó chứa các

lớp đồ họa như Color, Canvas…

Color: Color được thể hiện bởi 4 giá trị, đầu tiên là alpha, red, green, and blue (ARGB). Mỗi thể hiện gồm

256 giá trị (8 bít) do đó một màu có giá trị cao nhất lên tới 32 bít integer. Với android thuận tiên hơn khi

cho phép chúng ta thể hiện giá trị màu bằng một số nguyên thay vì thể hiện theo cách của lớp Color hay

dùng.

Để khởi tạo một giá trị màu có thể khai báo:

int color = Color.BLUE;

Ngoài ra ta cũng có thể khai báo sử dụng độ alpha:

// Translucent purple

color = Color.argb(127, 255, 0, 255);

Nhưng trong Android, người ta thường định nghĩa trong file XML, chẳng hạn color.xml. Để sau này thuận

tiện hơn cho việc sửa chữa.Ví dụ:

?xml version=”1.0″ encoding=”utf-8″?>

<resources>

<color name=”mycolor”>#7fff00ff</color>

</resources>

Khi đó sử dụng màu trong code bằng cách:

color = getResources().getColor(R.color.mycolor);

Paint: Paint một lớp quan trọng trong Android, một ứng dụng android chẳng khi nào thiếu lớp này. Nó

bao gồm các kiểu style, color, và những thông tin cần thiết để vẽ bất cứ dạng đồ họa nào như bitmap,

text,…

Ví dụ cần vẽ cái gì lên màn hình hiển thị, sử dụng solid color thì đặt nó như sau:

cPaint.setColor(Color.LTGRAY);

Canvas: là một lớp quan trọng trong quá trình xây dựng ứng dụng, đặt biệt trong Game. Nếu như lớp

Paint cung cấp những dụng cụ color, đường nét, độ to nhỏ của nét để vể thì Canvas cung cấp các

phương thức để vẽ nên những gì mình muốn,chẳng hạn như đường thẳng, đường tròn, hình chữ nhật,..

Để sử dụng Canvas để vẻ, ta cần nạp chồng phương thức View.onDraw( )

Generated by Foxit PDF Creator © Foxit Softwarehttp://www.foxitsoftware.com For evaluation only.

Page 54: Nghiên cưú và phát triển Android OS

ThựctậpcơsởvềAndroid

N g u y ễ n V ư ơ n g Q u y ề n

Page 54

Ví dụ sau:

public class Graphics extends Activity {

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(new GraphicsView(this));

}

static public class GraphicsView extends View {

public GraphicsView(Context context) {

super(context);

}

@Override

protected void onDraw(Canvas canvas) {

// Drawing commands go here

}

}

Lúc này ta có thể đưa những phương thức vẽ vào onDraw().

3.3.Android translater:

Trong phần này em xin trình bày một chương trình dịch đơn giản sử dụng google-api-translate có ở

trang http://code.google.com/p/google-api-translate-java/downloads/list. Chương trình có chức năng

khi người dùng nhập nội dung cần dịch vào ô “Nhập nội dung” tương thích với ngôn ngữ nguồn chọn

trong ô “AUTO_DETECT” ở bên trái rồi chọn ngôn ngữ cần dịch sang ở ô “AUTO_DETECT” bên phải rồi

cuối cùng là bấm nút “Translate” để dịch,kết quả dịch sẽ hiển thị ở phía dưới.Ngoài ra người dùng cũng

có thể chỉnh sửa đoạn văn bản đã nhập nếu gõ nhầm kí tự bằng nút “Clear”,và để sử dụng ứng dụng này

thì thiết bị phải kết nối internet.Dưới đây là mã lớp main (phần activity trong ứng dụng):

package vuongquyen.translate;

import com.google.api.translate.Language;

import android.app.Activity;

Generated by Foxit PDF Creator © Foxit Softwarehttp://www.foxitsoftware.com For evaluation only.

Page 55: Nghiên cưú và phát triển Android OS

ThựctậpcơsởvềAndroid

N g u y ễ n V ư ơ n g Q u y ề n

Page 55

import android.os.Bundle;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.ArrayAdapter;

import android.widget.Button;

import android.widget.EditText;

import android.widget.Spinner;

import android.widget.TextView;

import android.widget.Toast;

public class TranslateAPI extends Activity {

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

Spinner lang_from=(Spinner)findViewById(R.id.lang_from);

Spinner lang_to = (Spinner)findViewById(R.id.lang_to);

final Button bt_trans = (Button)findViewById(R.id.bt_trans);

final Button bt_clear = (Button)findViewById(R.id.bt_clear);

final EditText value_text = (EditText)findViewById(R.id.value_edit);

final TextView value_result = (TextView)findViewById(R.id.value_rs);

ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item);

adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

for(Language l : Language.values()){

adapter.add(l.name());

Generated by Foxit PDF Creator © Foxit Softwarehttp://www.foxitsoftware.com For evaluation only.

Page 56: Nghiên cưú và phát triển Android OS

ThựctậpcơsởvềAndroid

N g u y ễ n V ư ơ n g Q u y ề n

Page 56

}

lang_from.setAdapter(adapter);

lang_to.setAdapter(adapter);

bt_trans.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

String text = value_text.getText().toString();

try {

Language language_from = Translator.getLanguage((Spinner)findViewById(R.id.lang_from));

Language language_to = Translator.getLanguage((Spinner)findViewById(R.id.lang_to));

String text_rs = Translator.translate(text, language_from, language_to);

value_result.setText(text_rs);

} catch (Exception e) {

// TODO Auto-generated catch block

//value_result.setText("Không thể kết nối internet");

Toast toast = Toast.makeText(getBaseContext(), "couldn't connect to Internet",

Toast.LENGTH_SHORT);

toast.show();

}

}

});

bt_clear.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

// TODO Auto-generated method stub

value_result.setText("");

Generated by Foxit PDF Creator © Foxit Softwarehttp://www.foxitsoftware.com For evaluation only.

Page 57: Nghiên cưú và phát triển Android OS

ThựctậpcơsởvềAndroid

N g u y ễ n V ư ơ n g Q u y ề n

Page 57

value_text.setText("");

}

});

}

}

Lớp translate trong cùng gói package com.translate:

package com.translate;

import android.widget.Spinner;

import com.google.api.translate.Language;

import com.google.api.translate.Translate;

public class Translator {

public static String translate (String text, Language languge_from, Language language_to) throws

Exception{

Translate.setHttpReferrer("http://google.com");

String rs_trans = Translate.execute(text, languge_from, language_to);

return rs_trans;

}

// Ham get language

public static Language getLanguage(Spinner spinner)throws Exception{

String language = spinner.getSelectedItem().toString();

for(Language l : Language.values()){

if(l.name()==language){

return l;

}

}

Generated by Foxit PDF Creator © Foxit Softwarehttp://www.foxitsoftware.com For evaluation only.

Page 58: Nghiên cưú và phát triển Android OS

ThựctậpcơsởvềAndroid

N g u y ễ n V ư ơ n g Q u y ề n

Page 58

throw new Exception("Not support Language: "+language);

}

}

Giao diện của chương trình:file main.xml trong thư mục layout

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android: orientation="vertical"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

>

<LinearLayout

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android: orientation="horizontal"

>

<Spinner

android:id="@+id/lang_from"

android:layout_width="170px"

android:layout_height="fill_parent"

android: prompt="@string/lang_from_prompt"

android:layout_weight="1"

/>

<Spinner

android:id="@+id/lang_to"

android:layout_width="170px"

Generated by Foxit PDF Creator © Foxit Softwarehttp://www.foxitsoftware.com For evaluation only.

Page 59: Nghiên cưú và phát triển Android OS

ThựctậpcơsởvềAndroid

N g u y ễ n V ư ơ n g Q u y ề n

Page 59

android:layout_height="fill_parent"

android: prompt="@string/lang_to_prompt"

android:layout_weight="1"

/>

</LinearLayout>

<EditText

android:id="@+id/value_edit"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:gravity="center"

android:lines="3"

android:background="#ffffff"

android: hint="@string/edit_hint"

/>

<LinearLayout

android:layout_width="320px"

android:layout_height="wrap_content"

android: orientation="horizontal"

>

<Button

android:id="@+id/bt_trans"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:layout_weight="1"

android:gravity="center"

Generated by Foxit PDF Creator © Foxit Softwarehttp://www.foxitsoftware.com For evaluation only.

Page 60: Nghiên cưú và phát triển Android OS

ThựctậpcơsởvềAndroid

N g u y ễ n V ư ơ n g Q u y ề n

Page 60

android:text="Translate"

/>

<Button

android:id="@+id/bt_clear"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:layout_weight="1"

android:gravity="center"

android:text="Clear"

/>

</LinearLayout>

<TextView

android:id="@+id/value_rs"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

/>

</LinearLayout>

Tệp AndroidManifest.xml (tệp cấu hình của toàn ứng dụng):

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

package="com.translate"

android:versionCode="1"

android:versionName="1.0">

<uses-permission android:name="android.permission.INTERNET" />

<application android:icon="@drawable/icon" android:label="@string/app_name">

Generated by Foxit PDF Creator © Foxit Softwarehttp://www.foxitsoftware.com For evaluation only.

Page 61: Nghiên cưú và phát triển Android OS

ThựctậpcơsởvềAndroid

N g u y ễ n V ư ơ n g Q u y ề n

Page 61

<activity android:name=".TranslateAPI"

android:label="@string/app_name">

<intent-filter>

<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />

</intent-filter>

</activity>

</application>

</manifest>

Kết quả chạy chương trình:

Generated by Foxit PDF Creator © Foxit Softwarehttp://www.foxitsoftware.com For evaluation only.

Page 62: Nghiên cưú và phát triển Android OS

ThựctậpcơsởvềAndroid

N g u y ễ n V ư ơ n g Q u y ề n

Page 62

Nhận xét:chương trình còn đơn giản,giao diện đồ họa không có gì là nổi bật,cần hoàn thiện thêm một số

chức năng bổ sung.

Hướng phát triển:xây dựng thành một từ điển mini trên Android với cơ sở dữ liệu đủ lớn,giao diện có

them hình ảnh sinh động và chương trình có thêm chức năng phát âm từ hay cụm từ nhập vào.

IV.Tổng kết,đánh giá:

Với nền tảng mã nguồn mở,được một cộng đồng đông đảo các lập trình viên phát triển và dựa trên một

phần cứng hỗ trợ mạnh mẽ,hệ điều hành Android hứa hẹn sẽ trở thành hệ điều hành được sử dụng đa

số trên các thiết bị di động cùng một kho ứng dụng tuy ra đời sau App Store của Apple nhưng chúng đã

trở nên phong phú không kém. Hiện kho ứng dụng Android đã có 150.000 ứng dụng từ Google và

200.000 ứng dụng từ các nguồn khác. Với Android, người dùng sẽ không bị giới hạn tải ứng dụng từ kho

ứng dụng cũng như được sử dụng miễn phí. Trong khi đó, kho ứng dụng của Apple không phải ứng dụng

nào cũng miễn phí cả.

Cách tải về và cài đặt cũng khá đơn giản, người dùng chỉ cần truy cập vào kho ứng dụng, tìm chương

trình muốn cài là có thể cài đặt ngay cho sản phẩm Android của mình. Hơn nữa, hệ điều hành này đang

phát triển rất mạnh để trở nên chuyên dụng hơn cho các dòng điện thoại và tận dụng được thế mạnh

riêng của máy tính bảng.

Mặt khác, do tương thích thích với nhất nhiều phần cứng của các nhà sản xuất khác nhau trên thế giới

như Samsung, LG, HTC,… nên người dùng sẽ có nhiều lựa chọn thiết bị phần cứng của nhiều hãng khác

nhau với mức giá cũng phong phú.

Tất cả những điều đó đang khiến cho Android trở nên phổ biến nhất trong thị trường hệ điều hành dành

cho thiết bị di động nói chung và điện thoại thông minh nói riêng.

TA� ILIE� UTHAMKHA� O

1. Apress - Beginning Android (2009) written by Mark L. Murphy

2. Professional_android_application_development published by Wiley Publishing, Inc.

3. http://developer.android.com/index.html

4. http://www.codeproject.com/

5. http://en.wikipedia.org/wiki/Android_(operating_system)

6. http://vietandroid.com/forum.php

Generated by Foxit PDF Creator © Foxit Softwarehttp://www.foxitsoftware.com For evaluation only.

Page 63: Nghiên cưú và phát triển Android OS

ThựctậpcơsởvềAndroid

N g u y ễ n V ư ơ n g Q u y ề n

Page 63

Generated by Foxit PDF Creator © Foxit Softwarehttp://www.foxitsoftware.com For evaluation only.