Chẳng hạn như công suất của thiết bị là không thể thay đổi, cùng với hạn chế về bộ nhớ và tốc độ xử lý đó là những ràng buộc trong việc thiết kế nền tảng di động đã được đề cập đến trong
Trang 1NHIỆM VỤ CỦA ĐỒ ÁN
Đề tài tập trung nghiên cứu về hệ điều hành Android với một số nội dung chính như sau:
Giới thiệu tổng quan về hệ điều hành Android
Nghiên cứu về kiến trúc của hệ điều hành Android
Nghiên cứu về các khối chính tạo nên ứng dụng Android
Tìm hiểu về eclipse và Android Project trong eclipse
Nghiên cứu về các thành phần tạo nên giao diện của ứng dụng
Tìm hiểu về các gói của Android đặc biệt tập trung vào gói android media và lớp MediaPlayer
Xây dựng demo ứng dụng MusicPlayer
LỜI CẢM ƠN
Trang 2Để có được thời gian viết đồ án và làm việc hiệu quả đầu tiên cho em xin gửi lời cảm ơn chân thành đến Trường Đại Học Công Nghệ và Truyền Thông –
Bộ môn Hệ Thống Thông Tin đã tạo điều kiện tốt nhất cho em có thể hoàn thành tốt đợt báo cáo đồ án tốt nghiệp của mình
Bên cạnh đó, em xin cảm ơn sự hướng dẫn tận tình của cô Nguyễn Thị Tính đã giúp đỡ em hoàn thành tốt đợt báo cáo đồ án tốt nghiệp này Thiếu sự giúp đỡ của cô em không thể có được kết quả như ngày hôm nay
Trong quá trình làm đồ án, cũng như trong quá trình viết báo cáo, em khó tránh khỏi sai sót Rất mong các thầy, cô trong bộ môn và cô giáo Nguyễn Thị Tính bỏ qua và chỉ dẫn thêm cho em
Em xin chân thành cảm ơn!
Thái Nguyên, tháng 6 năm 2012
Sinh viên Bùi Văn Cương
LỜI CAM ĐOAN
Em xin cam đoan toàn bộ nội dung của báo cáo này là do em tự tìm hiểu nghiên cứu dưới sự định hướng của cô giáo hướng dẫn Nội dung báo cáo này không sao chép và vi phạm bản quyền từ bất kỳ công trình nghiên cứu nào
Trang 3Nếu những lời cam đoan trên không đúng, em xin chịu hoàn toàn trách nhiệm trước pháp luật.
Thái Nguyên, tháng 6 năm 2012
Sinh viên Bùi Văn Cương
MỤC LỤC
Trang 4LỜI NÓI ĐẦU
Trong những năm gần đây, nền tảng công nghệ thông tin phát triển mạnh
mẽ cùng với đó là sự ra đời của các thiết bị di động như máy tính bảng, điện thoại, smartphone…ngày càng được ưa chuộng và sử dụng nhiều hơn Các ứng dụng giờ đây không chỉ chạy được trên máy tính mà còn chạy được trên cả thiết
bị có hệ điều hành nữa Và việc xây dựng các ứng dụng cho những thiết bị trên cũng được người ta quan tâm nhiều hơn Các ứng dụng dựa trên nền tảng là hệ điều hành cho thiết bị di động ngày càng đa dạng và phong phú hơn, đáp ứng được ngày càng nhiều các yêu cầu thực tế của người dùng Mỗi thiết bị như thế đều chứa trong nó một hệ điều hành có khả năng chạy được ứng dụng như một máy tính Có thể nói hệ điều hành là nền tảng còn các ứng dụng sẽ làm phong phú hơn cho nền tảng đó Android OS là hệ điều hành trên điện thoại di động được phát triển bởi Google và dựa trên nền tảng Linux Việc xây dựng ứng dụng
Trang 5cho điện thoại di động chạy hệ điều hành Android hiện nay đang rất mới và rất phát triển ở Việt Nam
Với sự hấp dẫn của các ứng dụng trong Android cùng với bản tính tò mò thích khám phá cái mới và sự khuyến khích của bạn bè và cô giáo hướng dẫn
Em đã quyết định thực hiện đồ án “Xây dựng ứng dụng nghe nhạc trên nền hệ điều hành Android” Nội dung đồ án của em gồm 4 chương:
Chương 1: Tổng quan về hệ điều hành Android Chương này trình bày
về lịch sử phát triển, ưu thế và kiến trúc của hệ điều hành Android
Chương 2: Cơ sở lý thuyết lập trình ứng dụng Android Chương này
trình bày cấu trúc của một project, các khối chính tạo nên ứng dụng và hệ thống các thành phần tạo giao diện ứng dụng Android
Chương 3: Phân tích và thiết kế hệ thống Chương này trình bày biểu
đồ UseCase và biểu đồ trình tự của ứng dụng nghe nhạc
Chương 4: Thiết kế ứng dụng Chương này trình bày chi tiết về quy
trình thiết kế ứng dụng MusicPlayer trong eclipse
CHƯƠNG 1 TỔNG QUAN VỀ HỆ ĐIỀU HÀNH ANDROID
1 Giới thiệu chung về hệ điều hành Android
Android là một nền tảng mã nguồn mở toàn diện được thiết kế cho các thiết bị di động Nó là sự liên minh giữa ông lớn Google và Open Handset Alliance là các tập đoàn sản xuất thiết bị cầm tay nổi tiếng như Intel, SamSung, Toshiba….Với mục tiêu là “tăng tốc việc đổi mới trong di động và cung cấp cho người tiêu dùng nhiều tiện ích phong phú, ít tốn kém.” Và Android chính là công
Trang 6nhau và tạo ra một hệ sinh thái phong phú và đa dạng cho các nhà phát triển và người tiêu dùng.
Android là một nền tảng toàn diện điều này có nghĩa là nó là một tập hợp các phần mềm hoàn chỉnh cho thiết bị di động Đối với các nhà phát triển Android cung cấp các công cụ và các khung cơ bản cho việc phát triển các ứng dụng một cách nhanh chóng và dễ dàng Thư viện Android SDK là tất cả những
gì mà cần dùng để bắt đầu phát triển với android; ngay cả khi không có một điện thoại thật sự Còn đối với người sử dụng, Android làm việc một cách chính xác trên bề mặt màn hình của điện thoại Thêm vào đó người sử dụng cũng có thể tùy chỉnh điện thoại theo cách riêng của họ Đối với các nhà sản xuất Android là giải pháp hoàn chỉnh để chạy trên các thiết bị của họ Khác với một số trình điều khiển phần cứng cụ thể, Android cung cấp mọi thứ để thiết bị của họ làm việc
Android là một nền tảng mã nguồn mở, toàn bộ ngăn xếp từ các module cấp thấp của Linux đến tất cả các thư viện gốc và từ các ứng dụng khung cho đến các ứng dụng hoàn chỉnh là hoàn toàn mở Hơn thế nữa Android còn được chứng nhận là hệ điều hành thân thiện với người sử dụng Nó được cấp giấy phép bởi Apache/MIT(giấy phép chứng nhận mã nguồn mở thân thiện) nó có thể được mở rộng và phát triển với nhiều mục đích khác nhau mà không cần phải để ý đến bản quyền hay giấy phép sử dụng Điều này đồng nghĩa với việc bạn có thể xem toàn
bộ mã nguồn của nền tảng, có thể thêm bất kỳ những thiết kế bí mật của bạn và không đưa lại cộng đồng nếu không muốn
Android được thiết kế với mục đích xây dựng nền tảng cho thiết bị di động Khi thiết kế Android, nhóm phát triển đã xem xét để lường trước được các khả năng mà không thay đổi được đối với một thiết bị Chẳng hạn như công suất của thiết bị là không thể thay đổi, cùng với hạn chế về bộ nhớ và tốc độ xử lý đó
là những ràng buộc trong việc thiết kế nền tảng di động đã được đề cập đến trong suốt thời gian thiết kế Android Android được thiết kế để chạy trên tất cả các loại thiết bị cầm tay, Android không thực hiện bất kỳ giả định nào về kích thước của màn hình cũng như độ phân giải hay chipset của thiết bị
Trang 7Trong lịch sử phát triển, ban đầu Android thuộc sở hữu của công ty Android Inc Được Google mua lại vào năm 2005 và bắt đầu xây dựng Android Platform Cuối năm 2007 liên minh Open Handset Alliance được thành lập bao gồm các tập đoàn lớn và nổi bật như SamSung, LG, Toshiba… được công bố Android chính thức trở thành mã nguồn mở Phiên bản SDK đầu tiên được phát hành vào tháng 11 năm 2007, hãng T-Mobile cũng công bố chiếc điện thoại Android đầu tiên đó là chiếc T-Mobile G1, chiếc smartphone đầu tiên dựa trên nền tảng Android Một vài ngày sau đó, Google tiếp tục công bố sự ra mắt phiên bản Android SDK release Candidate 1.0 Trong tháng 10 năm 2008 Google được cấp giấy phép mã nguồn mở cho Android Platform Vào cuối năm 2008, Google cho phát hành một thiết bị cầm tay được gọi là Android Dev Phone 1 có thể chạy được các ứng dụng Android mà không bị ràng buộc vào các nhà cung cấp mạng điện thoại di động Mục tiêu của thiết bị này là cho phép các nhà phát triển thực hiện các cuộc thí nghiệm trên một thiết bị thực có thể chạy hệ điều hành Android
mà không phải ký một bản hợp đồng nào Năm 2009 các thiết bị chạy trên nền tảng Android tăng lên Phiên bản mới của hệ điều hành được phát hành là: Cupcake (1.5), Donut(1.6), và Eclair(2.0 và 2.1) Lúc này đã có hơn 20 thiết bị chạy hệ điều hành Android Trong năm 2010, Android là nền tảng tốt thứ 2 cho điện thoại Smartphone sau Blackberry Froyo (Android 2.2) được phát hành Lúc này đã có hơn 60 thiết bị chạy nền tảng Android
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ể kiếm bội, chủ yếu là từ các nguồn quảng cáo trên các dịch vụ đó
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
Trang 8phá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
- 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
Trang 9Giống như bất kỳ phần mềm nào Android được cải thiện theo thời gian, điều này được phản ánh trong một số phiên bản của nó Bảng sau đây giải thích một số phiên bản:
Trong bảng trên những gì quan trọng nhất được thể hiện trong các cấp độ của APIs(API level) Các phiên bản thay đổi theo thời gian bởi vì các bản vá lỗi hoặc bản cải tiến hiệu suất Bảng sau đây thể hiện lịch sử các phiên bản và sự phân bố của các phiên bản trong năm 2011
Trang 10Trong bảng phân phối trên, có rất nhiều người sử dụng phiên bản 1.5 và 1.6 nhiều còn phiên bản mới 2.3 lại không được nhiều người sử dụng mặc dù nó mới nhất và cao nhất, nhưng các phiên bản 2.x đang tăng lên vì các phiên bản 1.x
đã cũ và sẽ không có bản vá lỗi hay cập nhật firmware và thay vào đó các nhà sản xuất thường nâng cấp các bản mới hơn Tuy nhiên từ phiên bản 1.6 trở đi các phiên bản đã ổn định và thích hợp với hầu hết các ứng dụng
2 Máy ảo Dalvik trong Android
Dalvik là mục đích xây dựng máy ảo được thiết kế đặc biệt cho android,
và phát triển bởi Dan Bornstein và nhóm của ông tại Google
Máy ảo Java được đã được thiết kế với một kích thước phù hợp và nhóm Dalvik cảm thấy rằng họ có thể làm công việc này tốt hơn trên các thiết bị di động Họ đã nhìn ra các ràng buộc cụ thể trong môi trường di động là ít thay đổi trong tương lai gần Chẳng hạn như tuổi thọ của pin với sức mạnh của bộ xử lý
Và Dalvik đã được xây dựng để giải quyết những ràng buộc đó
Một tác dụng khác nữa của việc thay thế máy ảo Java bởi máy ảo Dalvik
đó là việc cấp giấy phép sử dụng Trong khi ngôn ngữ lập trình java, các công cụ trong java, thư viện của java đều là miễn phí thì máy ảo Java lại không phải như vậy Chính vì vấn đề phát sinh này mà vào năm 2005 khi công việc trên Dalvik
đã được bắt đầu Ngày nay, có nhiều lựa chọn mã nguồn mở thay thế cho máy ảo Java của SUN như dự án OpenJDK và Apache Harmony Bằng việc phát triển một mã nguồn mở đúng đắn và được chứng nhận là máy ảo thân thiện.Android cung cấp một nền tảng đầy đủ các tính năng, được khuyến khích áp dụng cho nhiều loại thiết bị mà không cần phải quan tâm về giấy phép sử dụng
Trong Java tệp tin nguồn Java được biên dịch thành mã Java byte sử dụng trình biên dịch Java, và sau đó chạy mã byte này trên máy ảo Java Trong Android điều này lại khác, ta vẫn phải biên dịch tệp tin nguồn thành mã byte Java
sử dụng trình biên dịch của Java Nhưng tại cùng thời điểm đó mã byte Java lại được biên dịch lại một lần nữa bởi trình biên dịch Dalvik để trở thành mã byte Dalvik Cuối cùng mã byte Dalvik được thực thi bởi máy ảo Dalvik Hình dưới đây minh họa việc so sánh hai trình biên dịch trên:
Trang 11Vấn đề ở đây là tại sao không biên dịch thẳng tệp nguồn Java thành mã byte Dalvik Điều này được giải thích vào năm 2005 khi mà công việc trên Dalvik bắt đầu, ngôn ngữ Java đã luôn thay đổi trong suốt thời gian trước đó nhưng các mã byte Java là nhiều hơn hoặc ít hơn so trong nhân của nó Vì vậy nhóm nghiên cứu android đã chọn Dalvik làm cơ sở trên mã byte Java thay vì chọn mã nguồn Java Và như vậy theo lý thuyết thì có thể viết các ứng dụng Android sử dụng bất kỳ ngôn ngữ nào mà có biên dịch thành mã byte Java Chẳng hạn như Python hay Ruby.
Một số lớp không đầy đủ của Java trong Android:
- Java Standard Edition: sử dụng để phát triển các ứng dụng cơ bản trên máy tính
- Java Enterprise Edition (aka J2EE or JavaEE): sử dụng để phát triển các ứng dụng cho việc kinh doanh
- Java Micro Edition (aka J2ME or JavaME): phát triển các ứng dụng di động
Trang 12Thư viện của Java trong Android gần giống như Java Standard Edition Sự khác biệt chủ yếu ở đây là Java sử dụng thư viện giao diện (AWT và Swing) đã được loại bỏ và thay thế bằng các thư viện Android cụ thể Và như vậy Android’s Java cũng được thêm một vài tính năng mới trong chuẩn Java trong khi nó hỗ trợ hầu hết các chức năng chuẩn của Java.
3 Kiến trúc của Android
Mô hình sau thể hiện một cách nhìn tổng quát các thành phần của hệ điều hành Android Mỗi một phần được đặc tả một cách chi tiết dưới đây:
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 Tầng Libraries & Android runtime , Tầng Application Framework và trên cùng là tầng Application
3.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
Trang 13phần cứng (driver model), thực hiện bảo mật (security), quản lý tiến trình (process) Kernel Linux hoạt động như một lớp trừu tượng hóa giữa phần cứng
và phần còn lại của ngăn xếp các phần mềm
Tuy được phát triển dựa vào nhân linux nhưng thực ra nhân linux đã được nâng cấp và sửa đổi rất nhiều để phù hợp với tính chất của những thiết bị cầm tay như hạn chế về bộ vi xử lý, dung lượng bộ nhớ, kích thước màn hình, nhu cần kết nối mạng không dây
Tầng này có các thành phần chủ yếu :
- Display Driver : Điều khiển việc hiển thị lên màn hình cũng như thu nhận những điều khiển của người dùng lên màn hình (di chuyển, cảm ứng )
- Camera Driver : Điều kiển hoạt động của camera, nhận luồng dữ liệu từ camera trả về
- Bluetooth Driver : Điều khiển thiết bị phát và thu sóng Bluetooth
- USB driver : Quản lý hoạt động của các cổng giao tiếp USB
- Keypad driver : Điều khiển bàn phím
- 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
3.2 Tầng Library và android runtime
Android bao gồm một tập hợp các thư viện cơ bản mà cung cấp hầu hết các chức năng có sẵn trong các thư viện lõi của ngôn ngữ lập trình Java Tất cả các ứng dụng Android đều chạy trong tiến trình riêng Máy ảo Dalvik đã được viết để cho một thiết bị có thể chạy nhiều máy ảo hiệu quả Các VM Dalvik thực
Trang 14thi các tập tin thực thi Dalvik (dex) Định dạng được tối ưu hóa cho bộ nhớ tối thiểu VM là dựa trên register-based, và chạy các lớp đã được biên dịch bởi một trình biên dịch Java để chuyển đổi thành các định dạng dex Các VM Dalvik dựa vào nhân Linux cho các hức năng cơ bản như luồng và quản lý bộ nhớ thấp.
Tầng này có 2 thành phần là phần Libraríe 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
-
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) Tại đây các ứng dụng viết bằng Java được chạy trên máy ảo Dalvik thay thế cho máy ảo Java VM của Sun
Trang 153.3 Tầng Application Framework
Bằng cách cung cấp một nền tảng phát triển mở, Android cung cấp cho các nhà phát triển khả năng xây dựng các ứng dụng cực kỳ phong phú và sáng tạo Nhà phát triển được tự do tận dụng các thiết bị phần cứng, thông tin địa điểm truy cập, các dịch vụ chạy nền, thiết lập hệ thống báo động, thêm các thông báo
để các thanh trạng thái, và nhiều, nhiều hơn nữa
Nhà phát triển có thể truy cập vào các API cùng một khuôn khổ được sử dụng bởi các ứng dụng lõi Các kiến trúc ứng dụng được thiết kế để đơn giản hóa việc sử dụng lại các thành phần; bất kỳ ứng dụng có thể xuất bản khả năng của mình và ứng dụng nào khác sau đó có thể sử dụng những khả năng (có thể hạn chế bảo mật được thực thi bởi khuôn khổ) Cơ chế này cho phép các thành phần tương tự sẽ được thay thế bởi người sử dụng
Giới thiệu một số thành phần của tầng 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
- Notification 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)
Trang 16- Một tập hợp rất nhiều các View có khả năng kế thừa lẫn nhau dùng để thiết kế phần giao diện ứng dụng như: gridview, tableview, linearlayout,…
- Một “Content Provider” cho phép các ứng dụng có thể truy xuất dữ liệu từ các ứng dụng khác (chẳng hạn như Contacts) hoặc là chia sẻ dữ liệu giữa các ứng dụng đó
- Các ứng dụng được cài thêm như các phần mềm chứng khoán (Stock), các trò chơi (Game), từ điển
Các ứng dụng 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
Trang 17CHƯƠNG 2
CƠ SỞ LÝ THUYẾT LẬP TRÌNH ỨNG DỤNG ANDROID
1 Các thành phần trong Android Project
Khi viết một ứng dụng Android dù đơn giản hay phức tạp thì Eclipse luôn tạo cho ta một khuôn mẫu được xác định trước bao gồm các thành phần: tệp nguồn java, tệp R.java, các tệp tin XML như main.xml, string.xml… và thành phần AndroidManifest.xml
Để tạo một Android Project trong giao diện Eclipse chọn File→New→Android Project với:
Trang 18- Tên project: là tên xây dựng từ Eclipse, nên là một từ, mỗi từ viết hoa chữ cái đầu và không có khoảng trắng giữa các từ chẳng hạn như HelloWorld.
- Build Target: lựa chọn phiên bản Android để xây dựng ứng dụng
- Tên của ứng dụng: là tên của ứng dụng cần tạo Nó được viết tùy ý và có thể gồm cả dấu “,” chẳng hạn: Hello,World !!!
- Tên gói được xây dựng theo Java và phải có ít nhất một dấu “.” Chẳng hạn như: com.example.calculator
1.1 Thành phần Manifest File
Thực chất là file XML được sinh ra khi một Android Project tạo ra Tệp tin này liên kết mọi thành phần trong ứng dụng với nhau Nó xác định cấu hình, định nghĩa quyền truy cập cũng như các chủ đề cho ứng dụng Đồng thời nó cũng chứa thông tin về phiên bản SDK cũng như main activity sẽ chạy đầu tiên
Trong file Manifest bao giờ cũng có 3 thành phần chính đó là: application, permission và version
Dưới đây là nội dung của một file AndroidManifest.xml:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.marakana"
android:versionCode="1" android:versionName="1.0">
<application
android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".HelloWorld" 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>
<uses-sdk android:minSdkVersion="8" />
Trang 19- android:theme = “drawable theme” thuộc tính này để đặt theme cho ứng dụng Các theme là các cách để hiển thị giao diện ứng dụng
- Ngoài ra còn nhiều thuộc tính khác…
Thẻ <permission/> Bao gồm các thuộc tính chỉ định quyền truy xuất và sử dụng tài nguyên của ứng dụng Khi cần sử dụng một loại tài nguyên nào đó thì trong file manifest của ứng dụng cần phải khai báo các quyền truy xuất như sau:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
Trang 20android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent">
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="hello">Hello World, HelloWorld!</string>
<string name="app_name">Hello, World!!!</string>
</resources>
1.4 Thành phần R.java
File R.java là một file tự động sinh ra ngay khi tạo ứng dụng, file này được sử dụng để quản lý các thuộc tính được khai báo trong file XML của ứng dụng và các tài nguyên hình ảnh
Mã nguồn của file R.java được tự động sinh khi có bất kì một sự kiện nào xảy xa làm thay đổi các thuộc tính trong ứng dụng Chẳng hạn như, kéo và thả một file hình ảnh từ bên ngoài vào project thì ngay lập tức thuộc tính đường dẫn đến file đó cũng sẽ được hình thành trong file R.java hoặc xoá một file hình ảnh thì đường dẫn tương ứng đến hình ảnh đó cũng tự động bị xoá
Có thể nói lớp R.java là mối liên kết giữa ngôn ngữ Java với kho tài nguyên của nó Nó được tự động tạo ra và không thể sửa được nó theo cách thủ
Trang 21công được Trong R.java các tài nguyên được đánh chỉ số và như vậy nó là cách nhanh nhất để tham chiếu đến các tài nguyên trong project.
1.5 Thành phần Java Source Code
Mã Java điều khiển mọi thứ Đây là mã cuối cùng được đổi thành mã Dalvik, thực thi và chạy ứng dụng Một mã nguồn Hello.java đơn giản như sau:
package com.marakana;
import android.app.Activity;
import android.os.Bundle;
public class HelloWorld extends Activity {
/** Called when the activity is first created */
2 Các khối chính cấu thành nên ứng dụng của Android
Các khối chính cần được xây dựng ở đây là các thành phần được sử dụng
để phát triển cũng như xây dựng các ứng dụng Chúng được đặt cùng với nhau để tạo thành một tổng thể lớn hơn Nó là các gợi ý cho việc thiết kế một ứng dụng
về màn hình, các tính năng và sự tương tác giữa chúng
2.1 Activity
Là một trong bốn thành phần chính của ứng dụng Hiểu theo cách đơn giản thì Activity là nền của một ứng dụng 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 Như vậy Activity là phần dễ nhận thấy nhất trong ứng dụng
Trang 22Có thể nói 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 running activity, 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
Chu kỳ sống của một Activity(Activity Life Cycle) bao gồm 5 state được quản lý bởi Activity Manager Nó có trách nhiệm tạo, phá hủy, giám sát các activity Dưới đây mô hình của một Activity Life Cycle
Starting state: khi một hoạt động không tồn tại trong bộ nhớ thì lúc đó nó
ở trong trạng thái bắt đầu (starting state) Trong khi bắt đầu nó lướt qua toàn bộ
các phương thức sẽ được gọi trong nó Cuối cùng, các hoạt động sẽ ở trạng thái
đang chạy(running state) Quá trình chuyển từ trạng thái starting state sang
running state là một trong những tiến trình tốn kém về thời gian để thực thi nhất,
điều này làm ảnh hưởng đến tuổi thọ pin của thiết bị Đó là lý do tại sao không phá hủy ngay các hoạt động không còn được hiển thị vì người dùng có thể còn muốn quay trở lại hoạt động đó Và hoạt động đó khi không hiển thị nữa thì nó được giữ trong một khoảng thời gian nhất định nào đó
Running state: hoạt động được được gọi là trong trạng thái này nếu hoạt
động đó đang được hiển thị và tương tác với người dùng trên màn hình Các
Trang 23tương tác với người dùng như đánh máy, chạm vào màn hình hay nhấn các nút đều được hiển thị trên màn hình để xử lý Như vậy chỉ có một hoạt động đang chạy tại một thời điểm nhất định.
Các hoạt động đang chạy được ưu tiên, nhận tài nguyên và bộ nhớ cần thiết để thực thi càng nhanh càng tốt Điều này đảm bảo cho các activity hoạt động một cách năng suất và ổn định đáp ứng yêu cầu của người sử dụng
Paused state: khi một activity không tương tác với người sử dụng nhưng
vẫn còn thấy được trên màn hình, lúc đó hoạt động này đang ở trạng thái tạm dừng(pause state) Trạng thái dừng vẫn được ưu tiên cao về tài nguyên và bộ nhớ
sử dụng Bởi vì chúng vẫn được nhìn thấy và không thể di chuyển khỏi màn hình
Stopped state: khi một hoạt động không được nhìn thấy nhưng vẫn còn
trong bộ nhớ, activity đó được gọi là trong trạng thái dừng (stopped state) Và một activity trong trạng thái này có thể được đưa trở lại màn hình thành một hoạt động đang chạy(running state) Nó có thể bị phá hủy hoặc gỡ bỏ khỏi bộ nhớ sử dụng
Hệ thống giữ các hoạt động trong trạng thái stopped bởi vì có khả năng người dùng vẫn muốn chạy lại các hoạt động đó Thứ hai nữa là việc khởi động lại một hoạt động nhanh hơn và tiết kiệm về bộ nhớ và thời gian hơn so với việc bắt đầu hoạt động lại từ đầu Các hoạt động ở trạng thái này có thể bị gỡ bỏ bất
cứ lúc nào
Destroyed state: 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 Một hoạt động trong trạng thái bị phá hủy là nó không còn trong bộ nhớ nữa Trình Activity Manager quyết định gỡ bỏ nó khi nó không còn cần thiết nữa Trước khi một hoạt động bị phá hủy nó phải lưu lại các thông tin chưa được lưu Tuy nhiên không có gì đảm bảo rằng một hoạt động sẽ dừng lại trước khi nó bị phá hủy Vì vậy nên lưu lại các dữ liệu trên nó nếu dữ liệu đó chưa được lưu 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 đó
Trang 24Vòng đời của Activity:
- 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 Actitvity cho ứng dụng cần phải viết lại phương thức onCreate( ) để thực hiện quá trình khởi tạo Các phương thức khác có cần viết lại hay không tùy vào yêu cầu lập trình
Intent chính là người đưa thư, giúp chúng ta triệu gọi cũng như truyền các
dữ liệu cần thiết để thực hiện một Activity từ một Activity khác Điều này cũng giống như việc di chuyển qua lại giữa các Forms trong lập trình Windows Form
Trong hình vẽ 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 sdcard và cho phép người dùng chọn ảnh Khi đó cặp “code+result” là cần thiết
và có thể là “0:null” tức chọn hủy hoặc “1:ảnh 20” tức chọn ảnh 20
2.2.1 Dữ liệu trong Intents
Trang 25Intents 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ác action định nghĩa sẵn :
Trên đây là những hằng String đã được định nghĩa sẵn trong lớp Intent
Đi kèm với nó là các Activity hay Application được xây dựng sẵn sẽ được triệu gọi mỗi khi Intent tương ứng được gửi (tất nhiên khi được cung cấp đúng data)
Trang 26VD: + Dial một số phone:
Intent dialIntent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:123456"));
startActivity(dialIntent);
+ Hiện danh bạ điện thoại:
Intent listContacts = new Intent(Intent.ACTION_VIEW, Uri.parse(“content://contacts/people/”);
startActivity(listContacts);
Các action tự định nghĩa: về nguyên tắc có thể đặt tên action của một intent là bất cứ thứ gì theo chuẩn đặt tên thông thường, hay thậm chí dùng luôn hằng action đã định nghĩa sẵn như ACTION_VIEW (hay
“android.intent.action.VIEW”) Cái tên VIEW thực chất chỉ là một tên gợi tả, có thể dùng nó với mục đích thực hiện một activity để … gửi mail! Tuy nhiên điều
đó rõ ràng là rất “ngớ ngẩn” Thay vào đó ta hãy dùng ACTION_SEND hay ACTION_SENDTO
2.2.2 Sử dụng Intent
Các hàm thực thi Activity:
Intents tường minh thực thi Activity:
- Như đã trình bày ở phần trước, intent có thể dùng thuộc tính phụ
component để chỉ định đích danh tên lớp sẽ thực thi Activity Để
thực hiện điều này, lớp Intent cung cấp các hàm đó là setComponent(ComponentName) và setClass(Context, Class) và
Trang 27setClassName(Context, String) setClassName(String, String) Chỉ được dùng để gọi các Activities trong cùng một app.
Ví dụ: Intent intent = new Intent();
intent.setClassName("ten_package", "ten_lop_ben_trong_package"); startActivity(intent);
- Trong trường hợp này intent không chỉ định một lớp cụ thể mà thay vào đó dùng các dữ liệu khác (action, data, type, etc.) và để hệ thống tự quyết định xem lớp nào (app nào) sẽ thích hợp để đáp ứng intent đó
- Thông tin action và category của activity trong một ứng dụng đáp ứng intent đó phải được khai báo trong Manifest của ứng dụng (AndroidManifest.xml) dưới dạng Intent-filter (tất nhiên nếu muốn gọi một built-in action thì ta không cần quan tâm đến vấn đề này)
Ví dụ trong một file AndroidManifest.xml:
<activity
class=".NotesList" android:label="@string/title_notes_list">
<intent-filter>
<action android:name="android.intent.action.GET_CONTENT" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="vnd.android.cursor.item/vnd.google.note" /> </intent-filter>
</activity>
2.2.3 Truyền nhận thông tin giữa các Activity sử dụng intent
Quay trở lại với hình vẽ:
Trang 28Giả sử ta xây dựng một app có hai activites A và B như hình trên Khi đó
bên phía Activity A gọi hàm: startActivity(intentA,request_code Còn bên phía Activity B sẽ gọi hàm: setResult(return_code, intentB);
2.3 Services
Các dịch vụ (services) chạy trong nền và không có bất kỳ thành phần giao diện nào Chúng có thể thực hiện các hành động tương tự như các hoạt động, nhưng mà không có bất kỳ giao diện người dùng nào Dịch vụ là hữu ích với các hành động(actions) khi mà người dùng cùng một lúc muốn thực hiện trên màn hình nhiều actions Chẳng hạn như vừa nghe nhạc vừa nhắn tin…
Một Service có thể được sử dụng theo 2 cách:
- Nó có thể được bắt đầu và được cho phép hoạt động cho đến khi một người nào đó dừng nó lại hoặc nó tự ngắt Ở chế độ này, nó được bắt đầu bằng cách gọi Context.startService() và dừng bằng lệnh Context.stopService() Nó có thể tự ngắt bằng lệnh Service.stopSelf() hoặc Service.stopSelfResult() Chỉ cần một lệnh stopService() để ngừng Service lại cho dù lệnh startService() được gọi ra bao nhiêu lần
- Service có thể được vận hành theo như đã được lập trình việc sử dụng một giao diện mà nó định nghĩa Người dùng thiết lập một đường truyền tới đối tượng Service và sử dụng đường kết nói đó
để thâm nhập vào Service Kết nối này được thiết lập bằng cách gọi lệnh Context.bindService() và được đóng lại bằng cách gọi lệnh Context.unbindService() Nhiều người dùng có thể kết nối tới cùng một thiết bị Nếu Service vẫn chưa được khởi chạy, lệnh
Trang 29bindService() có thể tùy ý khởi chạy nó Hai chế độ này thì không tách biệt toàn bộ Có thể kết nối với một Service mà nó đã được bắt đầu với lệnh startService() Ví dụ, một Service nghe nhạc ở chế độ nền có thể được bắt đầu bằng cách gọi lệnh startService() cùng với một đối tượng Intent mà định dạng được âm nhạc để chơi Chỉ sau đó, có thể là khi người sử dụng muốn kiểm soát trình chơi nhạc hoặc biết thêm thông tin về bài hát hiện tại đang chơi, thì sẽ có một Activity tạo lập một đường truyền tới Service bằng cách gọi bindService() Trong trường hợp như thế này, stopService() sẽ không thực sự ngừng Service cho đến khi liên kết cuối cùng được đóng lại.
Services có chu kỳ sống đơn giản hơn nhiều so với Activity Chu kỳ sống của Service được minh họa trong hình sau:
Chúng ta có thể bắt đầu hoặc dừng lại một Service Ngoài ra chu kỳ sống của Services ít nhiều bị kiểm soát bởi người phát triển Do đó, các Services phải được lưu tâm khi nó đang thực thi, để chúng không tiêu thụ việc chia sẻ các tài nguyên không cần thiết chẳng hạn như CPU và pin
Service chỉ có 3 phương thức được gọi đến trong chu trình sống là:
Trang 30Bằng việc thực hiện những phương thức này, ta có thể giám sát 2 vòng lặp của chu kỳ thời gian của mỗi Service Entire lifetime của một Service diễn ra giữa thời gian onCreate() được gọi ra và thời gian mà onDestroy() trả lại Giống như một Activity, một Service lại tiết hành cài đặt ban đầu ở onCreate(), và giải phóng tất cả các tài nguyên còn lại ở onDestroy() Ví dụ, một Service phát lại nhạc có thể tạo ra một luồng và bắt đầu chơi nhạc onCreate(),và sau đó luồng chơi nhạc sẽ dừng lại ở onCreate(), Active lifetime của một Service bắt đầu bằng một lệnh tới onStart() Đâylà phương thức được chuyển giao đối tượng Intent mà
đã được thông qua để tới startService() Service âm nhạc sẽ mở đối tượng Intent
để quyết định xem sẽ chơi loại nhạc nào và bắt đầu phát nhạc Không có callback tương đương nào cho thời điểm Service ngừng lại – không có phương thức onStop() Các phương thức onCreate() và onDestroy() được gọi cho tất cả các Service dù chúng có được bắt đầu bằng Context.startService() hoặc Context.bindService() hay không Tuy nhiên, onStart() chỉ được gọi ra đối với các Service bắt đầu bằng startService() Nếu một Service cho phép những Service khác kết nối với nó thì sẽ có thêm các phương thức callback dành cho Service đó để thực hiện 3 phương thức sau:
IBinder onBind(Intent intent) boolean onUnbind(Intent intent) void onRebind(Intent intent)
Hàm callback onBind() thông qua đối tượng Intent đã được truyền đến bindService và onUnbind() được chuyển giao đối tượng mà đã được chuyển đến Nếu Service đang được chỉ định (binding), onBind() quay trở lại kênh thông tin
mà người dùng sử dụng để tương tác với Service Phương thức onUnbind() có thể yêu cầu onRebind() được gọi nếu một người dùng kết nối với Service
Biểu đồ dưới đây minh họa cho các phương thức callback giành cho một Service:
Trang 31Mặc dù, nó phân tách các Service được tạo ra thông qua startService với các Service mà được tạo ra bằng bindService() Hãy nhớ rằng bất kì Service nào, cho dù nó được khởi tạo như thế nào thì nó vẫn có thể cho phép các người dùng kết nối tới nó một cách hiệu quả nhất, cho nên bất kì Service nào cũng có thể được chỉ định thông qua các các phương thức onBind()và onUnbind().
Lưu ý rằng một dịch vụ phải được chỉ rõ trong manifest file tức AndroidManifest.xml như dưới đây:
<service android:name=".SimpleServiceService" />
2.4 Content Providers
Content Providers là lớp trung gian chia sẻ dữ liệu giữa các ứng dụng Mặc định, Android chạy mỗi ứng dụng trong một khuôn thử của riêng nó để tất
cả dữ liệu thuộc về một ứng dụng hoàn toàn độc lập với các ứng dụng khác trong
hệ thống Mặc dù một lượng nhỏ dữ liệu vẫn được trao đổi giữa các ứng dụng thông qua các Intents, content providers sẽ tốt hơn và thích hợp hơn nhiều cho việc chia sẻ dữ liệu liên tục giữa các bộ dữ liệu lớn Như vậy các content providers API tuân thủ theo nguyên tắc CRUD Hình vẽ sau cho biết giao diện CRUD của content providers kết nối với cơ sở dữ liệu như thế nào:
Trang 32Hệ thống Android sử dụng cơ chế này vào mọi lúc Chẳng hạn như Content Provider ở đây trình bày tất cả dữ liệu liên hệ của người dùng một cách
đa dạng trên ứng dụng Settings Provider trình bày việc cài đặt các ứng dụng khác nhau trên hệ thống, bao gồm cả việc xây dựng ứng dụng Settings Media Store chịu trách nhiệm lưu trữ và chia sẻ các phương tiện khác nhau, chẳng hạn như ảnh và âm nhạc, trên các ứng dụng khác nhau Hình dưới đây minh họa việc ứng dụng Contacts sử dụng Contacts Provider như thế nào, đây là một ứng dụng hoàn toàn riêng biệt dùng để lấy dữ liệu về các liên hệ của người sử dụng Bản thân ứng dụng Contacts không có bất kỳ dữ liệu liên lạc nào và Contacts Provider cũng không có bất kỳ giao diện sử dụng nào
Sự phân tách của việc lưu trữ dữ liệu và giao diện của người sử dụng ứng dụng thực tế cung cấp tính linh hoạt lớn hơn trong việc làm tăng độ mềm dẻo của các thành phần trong hệ thống Cho ví dụ, một người sử dụng có thể cài đặt việc
Trang 33lựa chọn ứng dụng sổ địa chỉ sử dụng dữ liệu mặc định tương tự như ứng dụng Contacts Hoặc là anh ta có thể cài đặt các công cụ trên màn hình Home, cho phép dễ dàng thay đổi trong System Settings, chẳng hạn như việc mở hoặc tắt WiFi, Bluetooth, tính năng GPS Nhiều nhà sản xuất điện thoại đã lợi dụng lợi thế của Content Providers để thêm các ứng dụng riêng dựa trên chuẩn Android với mục đích cải thiện cho người dùng chung như HTC Sense chẳng hạn.
Content Provider là các giao diện tương đối đơn giản với các phương thức tiêu chuẩn như insert(), update(), delete(), and query() Các phương thức này giống như các phương thức chuẩn trong cơ sở dữ liệu
Trong hệ thống Android tất cả các tài nguyên ngư Contact, SMS,… đều được lưu trữ vào CSDL SQLite của hệ thống Cũng như các CSDL khác, CSDL
mà hệ thống Android sử dụng để lưu trữ thông tin cũng cho phép chúng ta truy vấn dữ liệu như một CSDL MSSQL thông thường Tuy nhiên, trong hệ thống đó chúng ta không cần phải thao tác bằng lệnh SQL nhiều để truy xuất dữ liệu mà thay vào đó Android đã được trang bị một API ContentProvider cho phép người lập trình có thể dễ dàng truy xuất dữ liệu ContentProvider cung cấp một đối tượng con trỏ giúp chúng ta có thể dễ dàng lấy được bất cứ dữ liệu lưu trữ nào chỉ cần cung cấp một đường dẫn đúng đến dữ liệu đó Đường dẫn này còn được gọi là Uri
Tạo một Uri:
Uri uri = Uri.parse(“content://com.android.contacts/contacts”);
Cấu trúc gồm có 4 phần chính như sau:
Phần A: Đây là tiền tố chỉ ra dữ liệu được điều khiển bởi Content Provider
và nó không bao giờ thay đổi
Trang 34Phần B: Phần này chỉ đến nơi lưu trữ dữ liệu Cũng giống như cấu trúc của một số điện thoại thì cái này có thể hình dung nó như là mã quốc gia hoặc cũng có thể coi nó như là tên của CSDL
Phần C: Phần này chỉ ra loại dữ liệu Chẳng hạn như, dữ liệu contact, dữ liệu SMS,… Phần này có thể coi nó như là tên của một table
Phần D: Phần này chỉ đến đúng vị trí của dữ liệu, có thể coi phần này như
là ID của row trong table hoặc một dữ liệu nào đó dùng để truy vấn
VD: Uri chỉ đến contact thứ 0 trong CSDL là content://contacts/people/0
Để có thể thực hiện truy vấn đến vùng dữ liệu được chỉ ra bởi một Uri cần phải có 2 đối tượng con trỏ được cung cấp bởi Activity đó là: Cursor và ContentResolver Để lấy được 2 đối tượng này thì trong Activity sử dụng hàm getContentResolver() trả về đối tượng ContentResolver và getContentResolver().query(Uri uri); trả về đối tượng Cursor
2.5 Broadcast Receivers
BroadcastReceiver (có thể gọi là Receiver là một trong bốn loại thành phần trong ứng dụng Android Chức năng dùng để nhận các sự kiện mà các ứng dụng hoặc hệ thống phát đi
– 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, lifercycle của Receiver kết thúc
Trang 35– Ngay khi onReceive() kết thúc, hệ thống coi như receiver đã không còn hoạt động và có thể kill process chứa receiver này bất cứ lúc nào.
– Tránh xử lý các code quá lâu trong onReceive()
– Không có xử lý bất đồng bộ, chờ callback… trong Receiver (cụ thể như hiển thị Dialog, kết nối service…)
Một số broadcast thông dụng:
– Một số broadcast thông dụng
– 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
Phương thức onReceive():Phương thức này được gọi khi có sự kiện tương ứng được phát đi Ở trong phương thức này, ta thấy truyền vào context và intent
– Vì Receiver không kế thừa từ Context nên cần truyền context mà receiver này đang chạy vào Thứ nhất, để có thể xử lý các phương thức yêu cầu truyền thêm Context, thứ 2, để sử dụng các phương thức của lớp Context
– Intent được truyền vào sẽ có đầy đủ thông tin như sự kiện nào mà receiver này đăng ký đã xảy ra dẫn đến onReceive() được gọi Có gửi kèm thông tin gì hoặc dữ liệu gì hay không Xem các api: Intent.getAction() , Intent.get…Extra(String dataName)
Ví dụ BootReceiver đăng ký nhận sự kiện BOOT_COMPLETED, sau đó
sẽ gọi một dialog lên hiển thi lời chào
Trong manifest, cần đăng ký permission được nhận sự kiện này:
Trang 36<action android:name="android.intent.action.BOOT_COMPLETED"/>
sử dụng ngay Dữ liệu database cũng được lưu ở một file duy nhất Không có khái niệm user, password hay quyền hạn trong SQLite database
SQLite không thích hợp với những hệ thống lớn nhưng ở quy mô vừa tầm thì SQLite phát huy uy lực và không hề yếu kém về mặt chức năng hay tốc
độ Với các đặc điểm trên SQLite được sử dụng nhiều trong việc phát triển, thử nghiệm v v và là sự lưa chọn phù hợp cho những người bắt đầu học database Hiện nay thì SQLite đã được ứng dụng vào smartphone như iPhone và Android
để lưu trữ dữ liệu
Để có thể dễ dàng thao tác với SQLite chúng ta có thể sử dụng trình duyệt FireFox và tải về plugin SQLite tại link sau: http://code.google.com/p/sqlite-manager/
Sau khi tải về file xpi, kéo file này vào cửa sổ firefox để cài đặt plugin Sau khi cài đặt plugin xong thì vào Menu_tools trong firefox sẽ có chức năng SQLite Manager Giao diện của SQLite manager trong firefox như sau:
Trang 372.7 TELEPHONY
Telephony cũng làm một thành phần tương đối quan trọng trong hệ thống Android Nó cho phép người lập trình có thể lấy các thông tin của hệ thống như thông tin SIM, thông tin thiết bị, thông tin mạng,… Ngoài ra, chúng ta cũng có thể cài đặt các thông số cho thiết bị nếu các thông số đó có thể thay đổi được Tất
cả những điều đó được quản lý bởi một class TelephonyManager trong Android
Trang 383 Các thành phần giao diện trong ANDROID
Có 2 cách để tạo một giao diện người dùng(UI) trong Android Cách thứ nhất là khai báo và cách thứ hai là lập trình Chúng hoàn toàn khác nhau nhưng lại thường được sử dùng cùng nhau để hoàn thành công việc
3.1 Khai báo giao diện người sử dụng
Sự tiếp cận giao diện người dùng bao gồm việc sử dụng XML để khai báo giao diện người sử dụng sẽ giống như, tương tự như việc tạo một trang web sử dụng HTML Chúng ta cũng viết các nhãn và các yếu tố cụ thể để nó xuất hiện trên màn hình Nếu đã từng code một trang HTML bằng tay thì bạn cũng phải làm khá nhiều công việc tương tự như vậy chẳng hạn như việc tạo một màn hình Android
Một lợi thế của việc tiếp cận bằng phương pháp khai báo đó là có thể sử
dụng các công cụ WYSIWYG (what-you-see-is-what-you-get) Một số các công
cụ này gắn với Eclipse Android Development Tools (ADT_công cụ phát triển Android Eclipse) mở rộng, và đến từ bên thứ ba Thêm vào đó, XML được viết một cách rõ ràng, dễ đọc và thậm chí cả những người không quen với nền tảng và khuôn khổ Android cũng có thể xác định được một cách rõ ràng mục đích của giao diện người sử dụng
Bất lợi của việc khai báo giao diện người dùng đó là chỉ có thể nhận được tới một mức độ như vậy với XML XML là việc nhìn nhận một cách rất tốt trong giao diện người sử dụng nhưng nó không cung cấp một cách tốt để xử lý đầu vào của người dùng
3.2 Lập trình giao diện người sử dụng
Việc lập trình giao diện người dùng bao hàm việc viết mã Java để phát triển giao diện Nếu bạn đã từng làm về Java AWT hay Java Swing thì đó là một lợi thế của bạn Việc lập trình giao diện người dùng cũng sử dụng nhiều bộ công
cụ như trong các ngôn ngữ lập trình khác
Trang 39Về cơ bản, nếu muốn tạo một nút lập trình, chúng ta phải khai báo biến button, tạo một phiên bản của nó, thêm nó vào một chỗ chứa và đặt các đặc tính button bất kỳ, có ý nghĩa như color, text, text size, background… Bạn cũng có thể muốn khai báo những gì mà button sẽ làm khi mà nó được click, đó là một đoạn mã khác.
Mọi thứ được khai báo hoặc cũng có thể được lập trình Nhưng java cũng cho phép bạn cụ thể hóa những gì xảy ra khi button đó thực sự được click Đây là thuận lợi chính của việc lập trình giao diện người sử dụng
Và tốt nhất là nên sử dụng cả hai cách trên để xây dựng giao diện người dùng Bởi vì nó sẽ tận dụng được những thuận lợi của cả hai phương pháp trên Nên sử dụng tiếp cận khai báo XML để khai báo mọi thứ xung quanh giao diện người dùng nếu nó là đối tượng tĩnh chẳng hạn như việc bố trí trên màn hình, tất
cả các widgets hay khác Sau đó chuyển sang cách tiếp cận bằng lập trình để xác định những gì diễn ra khi người dùng tương tác với các widgets khác trong giao diện người dùng Tóm lại dùng XML để khai báo một “button” còn code java để xác định cụ thể những gì nó sẽ làm
3.3 Views and Layouts
Android tổ chức các thành phần UI của nó trong Layouts và Views, mỗi thứ mà nhìn thấy được chẳng hạn như button, label, textbox chúng đều là View Layouts tổ chức các Views, chẳng hạn như nhóm một button và một label lại với nhau hay một nhóm các thành phần này
Nếu đã có kinh nghiệm với Java AWT hay Swing, các Layouts cũng tương
tự như các bộ chứa Java và các Views tương tự như các thành phần của Java Views trong Android đôi khi cũng còn được gọi là widgets
Tuy vậy, một layout có thể chứa các thành phần con khác nữa Những thành phần con này cũng có thể chứa nhiều thành phần con hơn nữa so với bản thân chúng, cho phép thực hiện một cấu trúc giao diện phức tạp
Mỗi Layouts chịu trách nhiệm phân bổ khoảng trống cho mỗi thành phần con Các Layouts khác nhau sử dụng những cách tiếp cận khác nhau để bố trí các widgets con của chúng Hình dưới đây minh họa điều đó:
Trang 40Có một vài layouts chính mà chúng ta thường hay sử dụng nhiều hơn những layouts khác, chẳng hạn như: LinearLayout, TableLayout, FrameLayout, RelativeLayout, và AbsoluteLayout.
3.3.1 LinearLayout
LinearLayout là một trong những layouts đơn giản và phổ biến nhất Nó chỉ đơn giản là bố trí các thành phần con của nó bên cạnh nhau, hoặc là bố trí theo chiều ngang hoặc chiều dọc Còn về trật tự của các thành phần con Nó giống như việc LinearLayout đòi hỏi các thành phần con của nó cần bao nhiêu không gian Nó phân bổ không gian mong muốn cho mỗi thành phần con và thứ
tự của chúng khi được thêm vào Như vậy nếu một thành phần con cũ yêu cầu đến cùng tất cả không gian trên màn hình thì các thành phần còn lại sẽ không còn nhiều chỗ trống để hiện thị và thêm vào nữa
Một thuộc tính quan trọng của LinearLayout là layout_orientation Đó là
lựa chọn việc bố trí theo chiều dọc hay chiều ngang (vertical or horizontal).
Dưới đây là một đoạn mã mô tả một LinearLayout đơn giản: