Bài giảng Phát triển ứng dụng cho thiết bị di động - Hồ Thị Thảo Trang

pdf 169 trang huongle 3300
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Phát triển ứng dụng cho thiết bị di động - Hồ Thị Thảo Trang", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • pdfbai_giang_phat_trien_ung_dung_cho_thiet_bi_di_dong_ho_thi_th.pdf

Nội dung text: Bài giảng Phát triển ứng dụng cho thiết bị di động - Hồ Thị Thảo Trang

  1. BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC MỎ ĐỊA CHẤT BÀI GIẢNG PHÁT TRIỂN ỨNG DỤNG CHO THIẾT BỊ DI ĐỘNG Tên học phần : Lập trình mobile Trình độ đào tạo : Đại học chính quy Dùng cho SV ngành : Cơng nghệ thơng tin Người soạn : Hồ Thị Thảo Trang Hà Nội 11-2013
  2. Phát triển ứng dụng cho thiết bị di động Hồ Thị Thảo Trang Mục lục Chương 1. Những kiến thức cơ bản về thiết bị di động và lập trình cho thiết bị di động 5 1.1. Các thiết bị di động 5 Phân loại các thiết bị di động 5 Các hệ điều hành thiết bị di động thơng minh 6 Xu hướng di động hĩa 11 1.2. Tổng quan về lập trình cho thiết bị di động 13 Chương 2. Nhập mơn lập trình Android 15 2.1. Thiết bị Android - hệ điều hành và máy ảo Dalvik 15 Giao diện và ứng dụng 16 Phát triển 19 Bảo mật và tính riêng tư 22 Máy ảo Dalvik 24 2.2. Lập trình cho thiết bị Android 28 Bộ phát triển phần mềm Android (Android SDK) 28 Mơi trường phát triển 31 Hello Android (Android “Hello world”) 38 Chương 3. Các Activity, Fragment và Intent 50 3.1. Activity 50 Vịng đời của Activity 50 Cửa sổ hộp thoại (Dialog) 53 3.2. Intent và việc tương tác giữa các Activity 56 Sử dụng Intent 56 Giải quyết “xung đột Intent” 58 Lấy kết quả trả về từ Activity thơng qua Intent 59 Truyền dữ liệu giữa các Activity với Intent 62 Sử dụng Intent để gọi các ứng dụng sẵn cĩ của hệ điều hành 63 Đối tượng Intent 66 3.3. Fragment 67 Thêm fragment trong thời gian thực thi (khơng khai báo trong layout): 71 Vịng đời của Fragment 73 Tương tác giữa các fragment 75 2
  3. Phát triển ứng dụng cho thiết bị di động Hồ Thị Thảo Trang Chương 4. Giao diện người dùng của ứng dụng Android 77 4.1. View và ViewGroup 77 LinearLayout 78 AbsoluteLayout 83 TableLayout 83 RelativeLayout 84 FrameLayout 86 ScrollView 87 4.2. Bố cục giao diện thích nghi với hướng màn hình (ngang|dọc) 88 Neo các view con theo các cạnh màn hình 89 Thay đổi kích thước và vị trí 90 Điều khiển hướng của màn hình 92 4.3. Sử dụng trình đơn (Menu) 93 Trình đơn chính 95 Trình đơn ngữ cảnh 96 4.4. Sử dụng thanh tác vụ (Action Bar) 97 4.5. Xử lý sự kiện tương tác với các thành phần đồ họa 100 Nạp chồng hàm xử lý sự kiện của Activity 100 Đăng ký sự kiện cho từng View 101 Chương 5. Thiết kế giao diện người dùng với các View cơ bản 102 5.1. Sử dụng các View cơ bản trong Android 102 TextView 102 Button và ImageButton 102 EditText 103 CheckBox 103 RadioButton và RadioGroup 103 ToggleButton 103 ProgressBar 106 5.2. TimePicker và DatePicker 108 TimePicker 108 DatePicker 111 5.3. Hiển thị ảnh với ImageView và Gallery 113 5.4. Sử dụng ListView để hiển thị danh sách dài 118 ListView 118 3
  4. Phát triển ứng dụng cho thiết bị di động Hồ Thị Thảo Trang SpinnerView 121 5.5. Hiển thị nội dung trang web với WebView 123 Chương 6. Lưu trữ dữ liệu 127 6.1. Lưu trữ dữ liệu cố định với shared preferences 127 6.2. Lưu trữ dữ liệu với file trên bộ nhớ trong và bộ nhớ ngồi 132 Làm việc với file trong bộ nhớ trong 132 Làm việc với file trong bộ nhớ ngồi 136 6.3. CSDL SQLite trong ứng dụng Android 137 Tạo lớp DBAdapter 137 Chương 7. Lập trình mạng với Android 142 7.1. Sử dụng web services thơng qua giao thức HTTP 142 7.2. Tải dữ liệu nhị phân thơng qua HTTP 144 7.3. Tải dữ liệu dạng text thơng qua HTTP 146 7.4. Web service với dữ liệu XML 148 7.5. Web service với dữ liệu JSON 152 Chương 8. Google Play Store và việc phân phối ứng dụng 156 8.1. Chuẩn bị ứng dụng trước khi phân phối 156 Đánh số phiên bản phần mềm 156 Chứng thực số cho ứng dụng Android 157 8.2. Phân phối ứng dụng 162 Sử dụng cơng cụ adb 162 Phân phối trên web server 162 Phân phối trên Google Play Store 163 4
  5. Phát triển ứng dụng cho thiết bị di động Hồ Thị Thảo Trang Chương 1. Những kiến thức cơ bản về thiết bị di động và lập trình cho thiết bị di động 1.1. Các thiết bị di động Phân loại các thiết bị di động Các thiết bị di động đã trải qua rất nhiều năm phát triển với rất nhiều loại thiết bị khác nhau, cĩ thể kể đến như máy nhắn tin di động, điện thoại di động, thiết bị trợ giúp cá nhân (PDA, Palm ), điện thoại thơng minh, máy tính bảng Các thiết bị nghe nhìn khác như máy ảnh, máy quay kỹ thuật số, máy nghe nhạc cũng cĩ thể được xếp vào "thiết bị di động". Tuy nhiên giáo trình sẽ bỏ qua các thiết bị mang tính chất lịch sử (đã khơng cịn hoặc gần như khơng cịn) và các thiết bị nghe nhìn mà chỉ đề cập đến các loại thiết bị điện tốn cầm tay hiện đang phổ biến trên thị trường tiêu dùng. Các thiết bị này thường được phân theo các loại như sau: Điện thoại di động cơ bản (basic phone và featured phones) - là các điện thoại di động với các tính năng cơ bản như nghe, gọi, danh bạ và một số ứng dụng dựng sẵn đơn giản. Các thiết bị này thường cĩ kích thước nhỏ, màn hình độ phân giải thấp, cĩ hoặc khơng cĩ bàn phím, pin dùng được lâu, ít kết nối và khả năng phát triển thêm phần mềm của nhà phát triển (gần như) khơng cĩ. Điện thoại di động thơng minh (smart phones) - là các điện thoại được trang bị cấu hình tốt hơn, chạy hệ điều hành thơng minh với SDK cho phép lập trình viên phát triển đa dạng các ứng dụng phục vụ mọi mục đích của cuộc sống. Các thiết bị này thường cĩ kích thước và màn hình lớn hơn nhiều so với featured phones, cấu hình phần cứng (CPU, RAM, GPU, camera ) cao, đa dạng các kết nối (Wifi, Bluetooth, 3G/4G, GPS, Glonass, NFC ), cĩ thể cĩ hoặc khơng nhiều loại cảm biến (cảm biến gia tốc, la bàn, cảm biến tiệm cận, cảm biến ánh sáng, con quay hồi chuyển ). Với ngần trang bị, dù thường được trang bị thỏi pin lớn hơn featured phones, thời lượng pin của điện thoại thơng mình thường rất hạn chế so với featured phones. Máy tính bảng - là các thiết bị thơng minh, tương tự như smart phones nhưng cĩ kích thước màn hình lớn hơn rất nhiều (thơng thường từ 7"-13"), cĩ thể cĩ hoặc khơng cĩ hỗ trợ khe cắm SIM-card (phục vụ việc nhắn tin, gọi điện hoặc truy cập internet qua WiFi/3G) Điện thoại thơng minh lai máy tính bảng (phablet) - là loại thiết bị lai giữa smartphone và máy tính bảng, về tính năng nĩ là một smart phone, nhưng được trang bị màn hình cỡ lớn hơn smart phone thơng thường và nhỏ hơn kích thước phổ biến của màn hình tablet. Màn hình của phablet thường cĩ kích thước 5.0"-6.9". Trong lập trình, các phablet thường được xếp gộp chung vào smart phones. Do khả năng lập trình các điện thoại cơ bản rất hạn chế (thường phải làm việc với lớp thấp hơn, khơng cĩ bộ cơng cụ phát triển tiện dụng) nên mặc dù điện thoại cơ bản vẫn chiếm thị phần chủ yếu, nội dung giáo trình "Phát triển ứng dụng di động" chỉ tập trung nhắm đến các thiết bị thơng minh (điện thoại thơng minh, máy tính bảng và điện thoại lai). Về mặt phần mềm, các thiết bị này hầu như tương đương, vì vậy giáo trình cĩ thể được gọi là "Lập trình cho điện thoại thơng minh". 5
  6. Phát triển ứng dụng cho thiết bị di động Hồ Thị Thảo Trang Biểu đồ dưới đây thể hiện tỷ lệ thị phần giữa Smart Phones và Featured Phones trong 3 năm gần đây, dữ liệu khảo sát trên tập người trưởng thành tại Hoa Kỳ (theo số liệu của PewSearchCenter, tháng 6 năm 2013): Các hệ điều hành thiết bị di động thơng minh Các hệ điều hành thiết bị di động hiện đại tổng hợp rất nhiều tính năng của máy tính cá nhân truyền thống cũng như hỗ trợ các tính năng đặc trưng cho thiết bị di động như màn hình cảm ứng, sĩng di động (GSM/CDMA), 3G/4G, Bluetooth, WiFi, GPS, Glonass, chụp ảnh, quay phim, nhận dạng giọng nĩi, ghi âm, trình chơi nhạc, NFC, bộ phát hồng ngoại Những hệ điều hành di động phổ biến nhất hiện nay gồm cĩ: Android Android là hệ điều hành miễn phí, mã nguồn mở, phát triển bởi "gã khổng lồ" Google. Android dựa trên nền tảng Linux được thiết kế dành cho các thiết bị di động cĩ màn hình cảm ứng như điện thoại thơng minh và máy tính bảng. Ban đầu, Android được phát triển bởi Tổng cơng ty Android, với sự hỗ trợ tài chính từ Google và sau này được chính Google mua lại vào năm 2005. Android ra mắt vào năm 2007 cùng với tuyên bố thành lập Liên minh thiết bị cầm tay mở: một hiệp hội gồm các cơng ty phần cứng, phần mềm, và viễn thơng với mục tiêu đẩy mạnh các tiêu chuẩn mở cho các thiết bị di động. Chiếc điện thoại đầu tiên chạy Android được bán vào tháng 10 năm 2008. Android cĩ mã nguồn mở và Google phát hành mã nguồn theo Giấy phép Apache. Chính mã nguồn mở cùng với một giấy phép khơng cĩ nhiều ràng buộc đã cho phép các nhà phát triển thiết bị, mạng di động và các lập trình viên nhiệt huyết được điều chỉnh và phân phối Android 6
  7. Phát triển ứng dụng cho thiết bị di động Hồ Thị Thảo Trang một cách tự do. Ngồi ra, Android cịn cĩ một cộng đồng lập trình viên đơng đảo chuyên viết các ứng dụng để mở rộng chức năng của thiết bị, bằng một loại ngơn ngữ lập trình Java cĩ sửa đổi. Vào tháng 10 năm 2012, cĩ khoảng 700.000 ứng dụng trên Android, và số lượt tải ứng dụng từ Google Play, cửa hàng ứng dụng chính của Android, ước tính khoảng 25 tỷ lượt. Những yếu tố này đã giúp Android trở thành nền tảng điện thoại thơng minh phổ biến nhất thế giới, vượt qua Symbian vào quý 4 năm 2010, và được các cơng ty cơng nghệ lựa chọn khi họ cần một hệ điều hành khơng nặng nề, cĩ khả năng tinh chỉnh, và giá rẻ chạy trên các thiết bị cơng nghệ cao thay vì tạo dựng từ đầu. Kết quả là mặc dù được thiết kế để chạy trên điện thoại và máy tính bảng, Android đã xuất hiện trên TV, máy chơi game và các thiết bị điện tử khác. Bản chất mở của Android cũng khích lệ một đội ngũ đơng đảo lập trình viên và những người đam mê sử dụng mã nguồn mở để tạo ra những dự án do cộng đồng quản lý. Những dự án này bổ sung các tính năng cao cấp cho những người dùng thích tìm tịi hoặc đưa Android vào các thiết bị ban đầu chạy hệ điều hành khác. Android chiếm 75% thị phần điện thoại thơng minh trên tồn thế giới vào thời điểm quý 3 năm 2012, với tổng cộng 500 triệu thiết bị đã được kích hoạt và 1,3 triệu lượt kích hoạt mỗi ngày. Sự thành cơng của hệ điều hành cũng khiến nĩ trở thành mục tiêu trong các vụ kiện liên quan đến bằng phát minh, gĩp mặt trong cái gọi là "cuộc chiến điện thoại thơng minh" giữa các cơng ty cơng nghệ. iOS iOS là hệ điều hành trên các thiết bị di động của Apple. Ban đầu hệ điều hành này chỉ được phát triển để chạy trên iPhone (gọi là iPhone OS), nhưng sau đĩ nĩ đã được mở rộng để chạy trên các thiết bị của Apple như iPod touch, iPad và Apple TV. Ngày 31 tháng 5, 2011, App Store của Apple chứa khoảng 500 000 ứng dụng iOS, và được tải về tổng cộng khoảng 15 tỷ lần. Trong quý 4 năm 2010, cĩ khoảng 26% điện thoại thơng minh chạy hệ điều hành iOS, sau hệ điều hành Android của Google và Symbian của Nokia. Giao diện người dùng của iOS dựa trên cơ sở thao tác bằng tay. Người dùng cĩ thể tương tác với hệ điều hành này thơng qua rất nhiều động tác bằng tay trên màn hình cảm ứng của các thiết bị của Apple. Phiên bản mới nhất là: 6.1.4 (ra ngày 2/5/2013) dành riêng cho iPhone 5 và 6.1.3 (ra ngày 19/3/2013) cho các thiết bị iOS cịn lại. Blackberry BlackBerry OS là nền tảng phần mềm tư hữu do RIM (Research In Motion) phát triển cho dịng sản phẩm cầm tay BlackBerry. BlackBerry OS cung cấp khả năng đa nhiệm, và được thiết kế cho các thiết bị sử dụng phương pháp nhập đặc biệt, thường là trackball hoặc màn hình cảm ứng. Hệ điều hành được hỗ trợ MIDP 1.0 và WAP 1.2. Các phiên bản trước đĩ cho phép đồng bộ hĩa khơng dây thư điện tử và lịch với Microsoft Exchange Server , và với cả Lotus Domino. Phiên bản OS 4 hiện tại hỗ trợ MIDP 2.0, cĩ khả năng kích hoạt khơng dây hồn tồn và đồng bộ thư điện tử, lịch, cơng việc, ghi chú và danh bạ với Exchange, và khả năng hỗ trợ Novell GroupWise, Lotus Notes khi kết hợp với BlackBerry Enterprise Server. 7
  8. Phát triển ứng dụng cho thiết bị di động Hồ Thị Thảo Trang Các bản cập nhật cho BlackBerry OS cĩ thể cĩ nếu nhà mạng cung cấp thơng qua dịch vụ BlackBerry OTASL. Các bên thứ ba cĩ thể phát triển ứng dụng dùng các API tư hữu của BlackBerry, nhưng bất kỳ ứng dụng nào sử dụng các chức năng giới hạn đều cần phải chứng thực trước khi cài đặt. Việc chứng thực này xác nhận tác giả của chương trình, nhưng khơng bảo đảm tính an tồn và bảo mật của ứng dụng. BlackBerry 10 Là thế hệ tiếp theo của hệ điều hành BlackBerry OS, được phát triển bởi BlackBerry Limited (Research In Motion đổi tên), dành cho cả điện thoại lẫn máy tính bảng. Thiết bị gần đây nhất sử dụng hệ điều hành là smartphone cao cấp BlackBerry Q10 Windows phone Windows Phone là hệ điều hành của Microsoft dành cho smartphone kế tục nền tảng Windows Mobile, mặc dù chúng khơng tương thích với nhau. Khác với Windows Mobile, Windows Phone tập trung vào sự phát triển của Marketplace - nới các nhà phát triển cĩ thể cung cấp sản phẩm (miễn phí hoặc cĩ phí) tới người dùng. Windows Phone được bán vào tháng 10 năm 2010 và đầu năm 2011 tại Châu Á. Phiên bản mới nhất hiện tài là Windows Phone 8. Microsoft cịn đang phát triển bản Windows Phone Apollo Plus, và trong tương lai cĩ thể cịn cĩ Windows Blue (hay cĩ thể là Windows 9) giúp tương thích với hệ điều hành Windows trên máy tính. Với Windows Phone , Microsoft đã phát triển giao diện người dùng mới mang tên Modern (trước đây tên là Metro) - tích hợp khả năng liên kết với các phần cứng và phần mềm của hãng thứ ba một cách dễ dàng. Ngày 11 tháng 2 năm 2011, trước mặt báo giới, CEO Microsoft Steve Balmer và CEO Nokia Stephen Elop cơng bố trở thành đối tác của nhau, đồng nghĩa với việc Windows Phone trở thành hệ điều hành chính của Nokia, thay thế Symbian đã già cỗi. Sự kiện này cũng đánh dấu một mốc quan trọng trong cuộc chiến với Android và iOS, được ví như là "cuộc đua giữa 3 con ngựa". Theo đĩ, cơng ty này sẽ hợp tác với Microsoft trong việc sản xuất những điện thoại Windows Phone 7 (hiện tại là Windows Phone 8). Nokia hứa hẹn sẽ: Tập trung vào Windows Phone 7/8 Đưa ra những thiết kế mới, bổ sung những gĩi ngơn ngữ và phổ biến chúng nhiều hơn cho người tiêu dùng thơng qua những thiết kế mới về phần cứng, nhiều phân khúc giá và thị trường hơn Hợp tác trong lĩnh vực marketing, phát triển phần mềm cho điện thoại di động Bing sẽ trở thành nền tảng tìm kiếm trong các thiết bị và dịch vụ của Nokia Kho ứng dụng riêng của Nokia sẽ được tích hợp chung với Marketplace. Ngồi các hệ điều hành trên, trên thị trường hiện tại cịn cĩ thiết bị chạy các hệ điều hành khác với thị phần khơng đáng kể như: Bada (của Samsung), BlackBerry Tablet OS (cho máy tính bảng BlackBerry PlayBook), GridOS (do Fusion Garage phát triển dựa trên Android), Linux, Brew (của Qualcomm), webOS (của Palm, sau HP mua lại, rồi lại bán lại cho LG hồi tháng 2 năm 2013), Tizen (do Samsung và Intel phối hợp hỗ trợ, dựa trên LiMo - Linux for Mobile), Windows RT (của Microsoft cho các thiết bị sử dụng chip kiến trúc ARM). 8
  9. Phát triển ứng dụng cho thiết bị di động Hồ Thị Thảo Trang Một số tổ chức, cơng ty cũng đang nỗ lực phát triển các hệ điều hành di động mới, được nhắc đến nhiều nhất trong số đĩ cĩ thể kể đến: Aliyun OS Aliyun OS ra đời tháng 7 năm 2011, là hệ điều hành dựa trên Linux, được phát triển bởi AliClound, một cơng ty con của Alibaba Group, Trung Quốc. Ý tưởng chung của hệ điều hành Aliyun là "đám mây hĩa" các tính năng của thiết bị di động (clound functionality). Theo Google đây là Aliyun được phát triển từ hệ điều hành mã nguồn mở Android của mình, Alibaba thì phủ nhận điều này, tuy nhiên hệ điều hành này cĩ thể chạy được hầu hết các ứng dụng của Android. Trên chợ ứng dụng của Aliyun thậm chí cịn chứa rất nhiều ứng dụng Android vi phạm bản quyền. Thiết bị đầu tiên chạy hệ điều hành này là điện thoại K-Touch W700 FireFox OS Là hệ điều hành cho điện thoại di động và máy tính bảng, phát triển trên nền Linux, được phát triển bởi tổ chức phi lợi nhuận Mozilla Foundation (tổ chức làm ra trình duyệt FireFox nổi tiếng). Được thiết kế để cung cấp một hệ thống tồn diện cho thiết bị di động, sử dụng các cơng nghệ mở và phổ biến như HTML5, Javascript, web API với khả năng truy cập trực tiếp vào phần cứng thiết bị, FireFox OS nhắm đến cạnh tranh với các ơng lớn khác như Apple's iOS, Google's Android, Microsoft's Windows Phone, cũng như các hệ điều hành mới xuất hiện như Ubuntu Touch OS. FireFox OS được giới thiệu tháng 2 năm 2012 trên vài điện thoại chạy Android, và trên bộ kit Raspberry Pi vào năm 2013. Tháng 1 năm 2013, tại triển lãm thiết bị điện tử tiêu dùng quốc tế CES 2013, hãng ZTE xác nhận sẽ sản xuất điện thoại chạy hệ điều hành này và đến 2 tháng 7 năm 2013, Telefĩnica chính thức giới thiệu điện thoại thương mại đầu tiên chạy FireFox OS tại Tây Ban Nha: điện thoại ZTE Open. Ubuntu Touch OS Là giao diện di động của hệ điều hành mã nguồn mở nổi tiếng - Ubuntu của Canonical Ltd., được thiết kế dành cho các thiết bị di động với màn hình cám ứng như điện thoại thơng minh và máy tính bảng. Điểm mạnh của Ubuntu Touch là việc dựa trên cùng một cơng nghệ lõi như hệ điều hành Ubuntu cho máy tính, giúp các ứng dụng dành cho Ubuntu và Ubuntu Touch cĩ thể chạy lẫn nhau mà khơng cần phát triển lại phiên bản riêng. Ngồi ra thiết bị chạy Ubuntu Touch cĩ thể biến thành Ubuntu bản cho máy tính với đầy đủ tính năng của máy tính cá nhân khi kết nối vào màn hình ngồi hoặc kết nối qua bộ đế (dock). Với sự phổ biến của hệ điều hành Ubuntu và khả năng tương thích của Ubuntu Touch, đây cĩ thể sẽ trở thành một trong những hệ điều hành phổ biến trong tương lai. Bảng dưới đây thể hiện tương quan thị phần giữa các hệ điều hành di động thơng minh phổ biến từ năm 2012-2013, theo số liệu ngày 16/05/2013 của IDC Worldwide Quarterly Mobile Phone Tracker, May 2013 (đơn vị: triệu thiết bị) Số lượng Q1- Thị phần Q1- Số lượng Q1- Thị phần Q1- Tỷ lệ tăng HĐH 2013 2013 2012 2012 trưởng 9
  10. Phát triển ứng dụng cho thiết bị di động Hồ Thị Thảo Trang Android 162.1 75.0% 90.3 59.1% 79.5% iOS 37.4 17.3% 35.1 23.0% 6.6% Windows Phone 7.0 3.2% 3.0 2.0% 133.3% BlackBerry OS 6.3 2.9% 9.7 6.4% -35.1% Linux 2.1 1.0% 3.6 2.4% -41.7% Symbian 1.2 0.6% 10.4 6.8% -88.5% Others 0.1 0.0% 0.6 0.4% -83.3% Total 216.2 100.0% 152.7 100.0% 41.6% Biểu đồ dưới đây cho thấy sự thay đổi về sản lượng cũng như thị phần của các hệ điều hành di động từ năm 2007 đến nay (nguồn wikipedia.org) 10
  11. Phát triển ứng dụng cho thiết bị di động Hồ Thị Thảo Trang Xu hướng di động hĩa 11
  12. Phát triển ứng dụng cho thiết bị di động Hồ Thị Thảo Trang Tốc độ tăng trưởng Mobile Data Internet Exabytes/month 12.00 10.8 EB 10.00 8.00 6.9 EB 6.00 4.2 EB 4.00 2.4 EB 2.00 1.3 EB 0.60 EB 0.00 2011 2012 2013 2014 2015 2016 Theo số liệu thống kê của Cisco – Mobile Global, 2012 1 EB = 1 million terabytes = 1 billion gigabytes Tại Việt Nam: • Thuê bao di động: 120 triệu. • Thuê bao 3G: 20 triệu. • Tỷ lệ người dùng smartphone: 21%. 12
  13. Phát triển ứng dụng cho thiết bị di động Hồ Thị Thảo Trang Thĩi quen sử dụng thiết bị truy cập Internet Cimigo netcitizens report 2012 1.2. Tổng quan về lập trình cho thiết bị di động Người lập trình ứng dụng cho thiết bị di động truyền thống luơn luơn phải nhớ trong đầu nguyên tắc "tiết kiệm tối đa tài nguyên" của thiết bị, dùng mọi cách để tơi ưu hĩa độ phức tạp tnhs tốn cũng như lượng bộ nhớ cần sử dụng. Tuy nhiên cùng với sự phát triển nhanh chĩng của phần cứng, các thiết bị di động hiện đại thường cĩ cấu hình rất tốt, với chip xử lý mạnh mẽ, bộ nhớ (RAM) lớn, khiến việc lập trình cho thiết bị di dộng trở nên dễ dàng hơn bao giờ hết. Các bộ kit phát triển của các hãng sản xuất hệ điều hành di động hiện hành cũng thường làm trong suốt hầu hết các tác vụ liên quan đến quản lý bộ nhớ, quản lý tiến trình Lập trình viên cĩ thể ít quan tâm hơn đến việc tối ưu hĩa sử dụng tài nguyên và tập trung vào việc "lập trình", phát triển tính năng cho ứng dụng như khi lập trình cho máy tính cá nhân. Tuy nhiên, đặc trưng di động của các thiết bị này cũng đem đến nhiều vấn đề mà người lập trình cần phải quan tâm như: kết nối mạng của thiết bị di động thường khơng ổn định (tùy thuộc vào vị trí, tốc độ di truyển, hạ tầng mạng ), việc quản lý tài nguyên để tối ưu hĩa lượng điện năng tiêu thụ (tiết kiệm pin). Ngồi việc việc phân mảnh (quá nhiều loại thiết bị, nhiều kích thước và độ phân dải màn hình, nhiều cấu hình phần cứng khác nhau ) của các thiết bị di động khiến việc kiểm thử ứng dụng rất khĩ khăn. Ngồi ra các hãng phát triển hệ điều hành di động đều làm ra bộ kit phát triển (SDK) và mơi trường phát triển tích hợp (IDE) rất thuận tiện cho việc viết code, biên dịch, gỡ rỗi, kiểm thử cũng như xuất bản phần mềm. So với máy tính cá nhân, các thiết bị di động hiện đại được trang bị thêm rất nhiều tính năng giúp việc tương tác với người dùng trở nên thuận tiện (màn hình cảm ứng đa điểm, tương tác giọng nĩi, cử chỉ ), các loại kết nối đa dạng (NFC, GPS, 3G, 4G, bluetooth, IR ), các cảm biến phong phú giúp trải nghiệm rất đa dạng (cảm biến ánh sáng, cảm biến tiệm cận, la bàn, cám biến chuyển động, gia tốc kế ). Người lập trình, tùy thuộc vào ứng dụng cụ thể, cĩ thể sử dụng đến các tính năng đặc trưng này để đem đến cho người dùng trải nghiệm tốt nhất trên thiết bị di động của mình. Xét theo thị phần trên thị trường, 3 hệ điều hành phổ biến nhất cho thiết bị hiện nay là Google's Android, Apple's iOS và Microsoft's Windows Phone. Mỗi ứng dụng thành cơng thường được phát triển cho cả 3 hệ nền này. Mỗi hệ nền đều cĩ một chợ ứng dụng chính hãng (Google cĩ Google Play Store, Apple cĩ Apple AppStore, Microsoft cĩ Windows Phone Store) 13
  14. Phát triển ứng dụng cho thiết bị di động Hồ Thị Thảo Trang với rất nhiều khách hàng tiềm năng, giúp người phát triển cĩ thể xuất bản ứng dụng miễn phí hoặc mất phí với chi phí nhất định. Bảng dưới đây liệt kê các hệ điều hành với ngơn ngữ và IDE phổ biến nhất của nĩ. HĐH Ngơn ngữ lập trình IDE Android Java IBM's Eclipse với Google's ADT plugins iOS Objective-C Apple' Xcode Windows Phone C# Microsoft's Visual Studio cho Windows phone Ngồi việc phát triển ứng dụng cho từng hệ điều hành như kể trên, lập trình viên cĩ thể lựa chọn các thư viện lập trình đa nền, để phát triển ứng dụng, phổ biến nhất trong các ứng dụng đa nền là các ứng dụng viết bằng ngơn ngữ web (HTML, CSS & Javascript). Trình duyệt web của các thiết bị di động đương thời cĩ đầy đủ tính năng lẫn hiệu năng năng chạy tốt các ứng dụng web hiện đại, một ứng dụng web cĩ thể được đặt trên máy chủ hoặc được đĩng gĩi thành native app (ứng dụng cho từng hệ điều hành) qua một số cơng cụ đĩng gĩi của các hãng thứ ba. Cơng cụ đĩng gĩi ứng dụng Web cho thiết bị di động phổ biến nhất hiện nay là PhoneGap, được phát triển bởi Nitobi, sau được Adobe mua lại. PhoneGap cho phép lập trình viên phát triển ứng dụng di động sử dụng ngơn ngữ web phổ biến (HTML5, CSS3 và Javascript), với các tính năng bổ sung, cho phép ứng dụng truy cập vào lớp phần cứng của thiết bị như gia tốc kế, máy ảnh, GPS và đĩng gĩi thành ứng dụng cho nhiều hệ điều hành khác nhau, bao gồm Android, iOS, Blackberry, BlackBerry 10, Windows Phone, Windows 8, Tizen, Bada. Tuy nhiên, nhược điểm của các ứng dụng loại này là cĩ hiệu suất thấp (chạy khơng được "mượt mà" như ứng dụng native) và khơng đồng nhất với tất cả các trình duyệt web di động (cĩ thể chạy hoặc hiển thị khác nhau trên các hệ điều hành với các trình duyệt khác nhau). Việc chọn hệ điều hành/thư viện nào để phát triển tùy thuộc vào nhiều yếu tố khác nhau như mục đích của ứng dụng, đối tượng sử dụng, tiềm năng của hệ điều hành, các yêu cầu kỹ thuật cụ thể cũng như thĩi quen và kỹ năng của lập trình viên. Trong khuơn khổ cĩ hạn, giáo trình chỉ tập trung đi sâu vào việc phát triển ứng dụng cho hệ điều hành di động phổ biến nhất hiện nay - Google's Android. 14
  15. Phát triển ứng dụng cho thiết bị di động Hồ Thị Thảo Trang Chương 2. Nhập mơn lập trình Android 2.1. Thiết bị Android - hệ điều hành và máy ảo Dalvik Ngày 5 tháng 11 năm 2007, Liên minh thiết bị cầm tay mở (Open Handset Alliance), một hiệp hội bao gồm nhiều cơng ty trong đĩ cĩ Texas Instruments, Tập đồn Broadcom, Google, HTC, Intel, LG, Tập đồ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. Cùng ngày, Android cũng được ra mắt với vai trị là sản phẩm đầu tiên của Liên minh, một nền tảng thiết bị di động được xây dựng trên nhân Linux phiên bản 2.6. Chiếc điện thoại chạy Android đầu tiên được bán ra là HTC Dream, phát hành ngày 22 tháng 10 năm 2008. Biểu trưng của hệ điều hành Android mới là một con rơbốt màu xanh lá cây do hãng thiết kế Irina Blok tại California vẽ. Từ năm 2008, Android đã trải qua nhiều lần cập nhật để dần dần cải tiến hệ điều hành, bổ sung các tính năng mới và sửa các lỗi trong những lần phát hành trước. Mỗi bản nâng cấp được đặt tên lần lượt theo thứ tự bảng chữ cái, theo tên của một mĩn ăn tráng miệng; ví dụ như phiên bản 1.5 Cupcake (bánh bơng lan nhỏ cĩ kem) tiếp nối bằng phiên bản 1.6 Donut (bánh vịng). Phiên bản mới nhất là 4.3 Jelly Bean (kẹo dẻo). Vào năm 2010, Google ra mắt loạt thiết bị Nexus—một dịng sản phẩm bao gồm điện thoại thơng minh và máy tính bảng chạy hệ điều hành Android, do các đối tác phần cứng sản xuất. HTC đã hợp tác với Google trong chiếc điện thoại thơng minh Nexus đầu tiên, Nexus One. Kể từ đĩ nhiều thiết bị mới hơn đã gia nhập vào dịng sản phẩm này, như điện thoại Nexus 4 và máy tính bảng Nexus 10, lần lượt do LG và Samsung sản xuất. Google xem điện thoại và máy tính bảng Nexus là những thiết bị Android chủ lực của mình, với những tính năng phần cứng và phần mềm mới nhất của Android. Bảng dưới đây thể hiện tỷ lệ sử dụng các phiên bản Android tính đến ngày 01/08/2013 Phiên bản Tên mã Ngày phát hành Phiên bản API Tỷ lệ 4.3 Jelly Bean July 24, 2013 18 0.0% 4.2.x Jelly Bean November 13, 2012 17 6.5% 4.1.x Jelly Bean July 9, 2012 16 34.0% 4.0.3–4.0.4 Ice Cream Sandwich December 16, 2011 15 22.5% 3.2 Honeycomb July 15, 2011 13 0.1% 3.1 Honeycomb May 10, 2011 12 0.0% 2.3.3–2.3.7 Gingerbread February 9, 2011 10 33.0% 2.3–2.3.2 Gingerbread December 6, 2010 9 0.1% 2.2 Froyo May 20, 2010 8 2.5% 2.0–2.1 Eclair October 26, 2009 7 1.2% 1.6 Donut September 15, 2009 4 0.1% 1.5 Cupcake April 30, 2009 3 0% 15
  16. Phát triển ứng dụng cho thiết bị di động Hồ Thị Thảo Trang Giao diện và ứng dụng Giao diện Giao diện người dùng của Android dựa trên nguyên tắc tác động trực tiếp, sử dụng cảm ứng chạm tương tự như những động tác ngồi đời thực như vuốt, chạm, kéo dãn và thu lại để xử lý các đối tượng trên màn hình. Sự phản ứng với tác động của người dùng diễn ra gần như ngay lập tức, nhằm tạo ra giao diện cảm ứng mượt mà, thường dùng tính năng rung của thiết bị để tạo phản hồi rung cho người dùng. Những thiết bị phần cứng bên trong như gia tốc kế, con quay hồi chuyển và cảm biến khoảng cách được một số ứng dụng sử dụng để phản hồi một số hành động khác của người dùng, ví dụ như điều chỉnh màn hình từ chế độ hiển thị dọc sang chế độ hiển thị ngang tùy theo vị trí của thiết bị, hoặc cho phép người dùng lái xe đua bằng xoay thiết bị, giống như đang điều khiển vơ-lăng. Các thiết bị Android sau khi khởi động sẽ hiển thị màn hình chính, điểm khởi đầu với các thơng tin chính trên thiết bị, tương tự như khái niệm desktop (bàn làm việc) trên máy tính để bàn. Màn hính chính Android thường gồm nhiều biểu tượng (icon) và tiện ích (widget); biểu tượng ứng dụng sẽ mở ứng dụng tương ứng, cịn tiện ích hiển thị những nội dung sống động, cập nhật tự động như dự báo thời tiết, hộp thư của người dùng, hoặc những mẩu tin thời sự ngay trên màn hình chính. Màn hình chính cĩ thể gồm nhiều trang xem được bằng cách vuốt ra trước hoặc sau, mặc dù giao diện màn hình chính của Android cĩ thể tùy chỉnh ở mức cao, cho phép người dùng tự do sắp đặt hình dáng cũng như hành vi của thiết bị theo sở thích. Những ứng dụng do các hãng thứ ba cĩ trên Google Play và các kho ứng dụng khác cịn cho phép người dùng thay đổi "chủ đề" của màn hình chính, thậm chí bắt chước hình dáng của hệ điều hành khác như Windows Phone chẳng hạn. Phần lớn những nhà sản xuất, và một số nhà mạng, thực hiện thay đổi hình dáng và hành vi của các thiết bị Android của họ để phân biệt với các hãng cạnh tranh. 16
  17. Phát triển ứng dụng cho thiết bị di động Hồ Thị Thảo Trang Hình . Màn hình chính với các biểu tượng (icon) và tiện ích (widget) Ở phía trên cùng màn hình là thanh trạng thái, hiển thị thơng tin về thiết bị và tình trạng kết nối. Thanh trạng thái này cĩ thể "kéo" xuống để xem màn hình thơng báo gồm thơng tin quan trọng hoặc cập nhật của các ứng dụng, như email hay tin nhắn SMS mới nhận, mà khơng làm gián đoạn hoặc khiến người dùng cảm thấy bất tiện. Trong các phiên bản đời đầu, người dùng cĩ thể nhấn vào thơng báo để mở ra ứng dụng tương ứng, về sau này các thơng tin cập nhật được bổ sung theo tính năng, như cĩ khả năng lập tức gọi ngược lại khi cĩ cuộc gọi nhỡ mà khơng cần phải mở ứng dụng gọi điện ra. Thơng báo sẽ luơn nằm đĩ cho đến khi người dùng đã đọc hoặc xĩa nĩ đi. 17
  18. Phát triển ứng dụng cho thiết bị di động Hồ Thị Thảo Trang Hình . Thanh trạng thái đang được "kéo" xuống với các thơng báo bên trong Một điểm mạnh của hệ điều hành Android là cho phép người dụng chạy nhiều ứng dụng cùng lúc (đa nhiệm - multi-tasking). Việc chuyển qua chuyển lại giữa các ứng dụng được thực hiện một cách dễ dàng bằng cách bấm và giữ phím Home để hiển thị danh sách ứng dụng đang chạy. Hình . Danh sách ứng dụng đang chạy trên thiêt bị (đa nhiệm) Ứng dụng Android cĩ lượng ứng dụng của bên thứ ba ngày càng nhiều, được chọn lọc và đặt trên một cửa hàng ứng dụng như Google Play hay Amazon Appstore để người dùng lấy về, hoặc bằng cách tải xuống rồi cài đặt tập tin APK từ trang web khác. Các ứng dụng trên Cửa hàng Play cho phép người dùng duyệt, tải về và cập nhật các ứng dụng do Google và các nhà phát triển thứ ba phát hành. Cửa hàng Play được cài đặt sẵn trên các thiết bị thỏa mãn điều kiện tương thích của Google. Ứng dụng sẽ tự động lọc ra một danh sách các ứng dụng tương thích với thiết bị của người dùng, và nhà phát triển cĩ thể giới hạn ứng dụng của họ chỉ dành cho những nhà mạng cố định hoặc những quốc gia cố định vì lý do kinh doanh. Nếu người dùng mua một ứng dụng mà họ cảm thấy khơng thích, họ được hồn trả tiền sau 15 phút kể từ lúc tải về, và một vài nhà mạng cịn cĩ khả năng mua giúp các ứng dụng trên Google Play, sau đĩ tính tiền vào trong hĩa đơn sử dụng hàng tháng của người dùng. Tính đến tháng 8 năm 2013, cĩ hơn 975.000 ứng dụng dành cho Android trên cửa hàng Google Play, và số lượng ứng dụng tải về từ Cửa hàng Play ước tính đạt gần 30 tỷ. 18
  19. Phát triển ứng dụng cho thiết bị di động Hồ Thị Thảo Trang Hình . Giao diện cửa hàng Play trên điện thoại Google Nexus 4 Các ứng dụng cho Android được phát triển bằng ngơn ngữ Java sử dụng Bộ phát triển phần mềm Android (SDK). SDK bao gồm một bộ đầy đủ các cơng cụ dùng để phát triển, gồm cĩ cơng cụ gỡ lỗi, thư viện phần mềm, bộ giả lập điện thoại dựa trên QEMU, tài liệu hướng dẫn, mã nguồn mẫu, và hướng dẫn từng bước. Mơi trường phát triển tích hợp (IDE) được hỗ trợ chính thức là Eclipse sử dụng phần bổ sung Android Development Tools (ADT). Các cơng cụ phát triển khác cũng cĩ sẵn, gồm cĩ Bộ phát triển gốc dành cho các ứng dụng hoặc phần mở rộng viết bằng C hoặc C++, Google App Inventor, một mơi trường đồ họa cho những nhà lập trình mới bắt đầu, và nhiều nền tảng ứng dụng web di động đa nền tảng phong phú. Phát triển Android được Google tự phát triển riêng cho đến khi những thay đổi và cập nhật đã hồn thiện, khi đĩ mã nguồn mới được cơng khai. Mã nguồn này, nếu khơng sửa đổi, chỉ chạy trên 19
  20. Phát triển ứng dụng cho thiết bị di động Hồ Thị Thảo Trang một số thiết bị, thường là thiết bị thuộc dịng Nexus. Cĩ nhiều thiết bị cĩ chứa những thành phần được giữ bản quyền do nhà sản xuất đặt vào thiết bị Android của họ. Hạt nhân Linux Android cĩ một hạt nhân dựa trên nhân Linux phiên bản 2.6, kể từ Android 4.0 Ice Cream Sandwich (bánh ngọt kẹp kem) trở về sau, là phiên bản 3.x, với middleware, thư viện và API viết bằng C, cịn phần mềm ứng dụng chạy trên một nền tảng ứng dụng gồm các thư viện tương thích với Java dựa trên Apache Harmony. Android sử dụng máy ảo Dalvik với một trình biên dịch động để chạy 'mã dex' (Dalvik Executable) của Dalvik, thường được biên dịch sang Java bytecode. Nền tảng phần cứng chính của Android là kiến trúc ARM. Người ta cũng hỗ trợ x86 thơng qua dự án Android x86 (chip Intel Atom), và Google TV cũng sử dụng một phiên bản x86 đặc biệt của Android. Nhân Linux dùng cho Android đã được Google thực hiện nhiều thay đổi về kiến trúc so với nhân Linux gốc. Android khơng cĩ sẵn X Window System cũng khơng hỗ trợ các thư viện GNU chuẩn, nên việc chuyển các ứng dụng hoặc thư viện Linux cĩ sẵn sang Android rất khĩ khăn. Các ứng dụng C đơn giản và SDL cũng được hỗ trợ bằng cách chèn những đoạn shim Java và sử dụng tương tự JNI, như khi người ta chuyển Jagged Alliance 2 sang Android. Một số tính năng cũng được Google đĩng gĩp ngược vào nhân Linux, đáng chú ý là tính năng quản lý nguồn điện cĩ tên wakelock, nhưng bị những người lập trình chính cho nhân từ chối vì họ cảm thấy Google khơng cĩ định sẽ tiếp tục bảo trì đoạn mã do họ viết. Google thơng báo vào tháng 4 năm 2010 rằng họ sẽ thuê hai nhân viên để làm việc với cộng đồng nhân Linux, nhưng Greg Kroah-Hartman, người bảo trì nhân Linux hiện tại của nhánh ổn định, đã nĩi vào tháng 12 năm 2010 rằng ơng ta lo ngại rằng Google khơng cịn muốn đưa những thay đổi của mình vào Linux dịng chính nữa. Một số lập trình viên Android của Google tỏ ý rằng "nhĩm Android thấy chán với quy trình đĩ," vì nhĩm họ khơng cĩ nhiều người và cĩ nhiều việc khẩn cấp cần làm với Android hơn. Vào tháng 8 năm 2011, Linus Torvalds phát biểu rằng "rốt cuộc thì Android và Linux cũng sẽ trở lại với một bộ nhân chung, nhưng điều đĩ cĩ thể sẽ khơng xảy ra trong 4 hoặc 5 năm nữa". Vào tháng 12 năm 2011, Greg Kroah-Hartman thơng báo kích hoạt Dự án Dịng chính Android, nhắm tới việc đưa một số driver, bản vá và tính năng của Android ngược vào nhân Linux, bắt đầu từ Linux 3.3. Linux cũng đưa tính năng autosleep (tự nghỉ hoạt động) và wakelocks vào nhân 3.5, sau nhiều nỗ lực phối trộn trước đĩ. Tương tác thì vẫn vậy nhưng bản hiện thực trên Linux dịng chính cho phép hai chế độ nghỉ: bộ nhớ (dạng nghỉ truyền thống mà Android sử dụng), và đĩa (là ngủ đơng trên máy tính để bàn). Việc trộn sẽ hồn tất kể từ nhân 3.8, Google đã cơng khai kho mã nguồn trong đĩ cĩ những đoạn thử nghiệm đưa Android về lại nhân 3.8. Bộ lưu trữ flash trên các thiết bị Android được chia thành nhiều phân vùng, như "/system" dành cho hệ điều hành và "/data" dành cho dữ liệu người dùng và cài đặt ứng dụng. Khác với các bản phân phối Linux cho máy tính để bàn, người sở hữu thiết bị Android khơng được trao quyền truy cập root vào hệ điều hành và các phân vùng nhạy cảm như /system được thiêt lập chỉ đọc. Tuy nhiên, quyền truy cập root cĩ thể chiếm được bằng cách tận dụng những lỗ 20
  21. Phát triển ứng dụng cho thiết bị di động Hồ Thị Thảo Trang hổng bảo mật trong Android, điều mà cộng đồng mã nguồn mở thường xuyên sử dụng để nâng cao tính năng thiết bị của họ, kể cả bị những người ác ý sử dụng để cài virus và phần mềm ác ý. Việc Android cĩ được xem là một bản phân phối Linux hay khơng vẫn cịn là vấn đề gây tranh cãi, tuy được Linux Foundation và Chris DiBona, trưởng nhĩm mã nguồn mở Google, ủng hộ. Một số khác, như linux-magazine.com thì khơng đồng ý, do Android khơng khơng hỗ trợ nhiều cơng cụ GNU, trong đĩ cĩ glibc. Quản lý bộ nhớ Vì các thiết bị Android chủ yếu chạy bằng pin, nên Android được thiết kế để quản lý bộ nhớ (RAM) để giảm tối đa tiêu thị điện năng, trái với hệ điều hành máy tính để bàn luơn cho rằng máy tính sẽ cĩ nguồn điện khơng giới hạn. Khi một ứng dụng Android khơng cịn được sử dụng, hệ thống sẽ tự động ngưng nĩ trong bộ nhớ - trong khi ứng dụng về mặt kỹ thuật vẫn "mở", những ứng dụng này sẽ khơng tiêu thụ bất cứ tài nguyên nào (như năng lượng pin hay năng lượng xử lý) và nằm đĩ cho đến khi nĩ được cần đến. Cách làm như vậy cĩ lợi kép là vừa làm tăng khả năng phản hồi nĩi chung của thiết bị Android, vì ứng dụng khơng nhất thiết phải đĩng rồi mở lại từ đầu, vừa đảm bảo các ứng dụng nền khơng làm tiêu hao năng lượng một cách khơng cần thiết. Android quản lý các ứng dụng trong bộ nhớ một cách tự động: khi bộ nhớ thấp, hệ thống sẽ bắt đầu diệt ứng dụng và tiến trình khơng hoạt động được một thời gian, sắp theo thời điểm cuối mà chúng được sử dụng (tức là cũ nhất sẽ bị tắt trước). Tiến trình này được thiết kế ẩn đi với người dùng, để người dùng khơng cần phải quản lý bộ nhớ hoặc tự tay tắt các ứng dụng. Tuy nhiên, sự che giấu này của hệ thống quản lý bộ nhớ Android đã dẫn đến sự thịnh hành của các ứng dụng tắt chương trình của bên thứ ba trên cửa hàng Google Play; những ứng dụng kiểu như vậy được cho là cĩ hại nhiều hơn cĩ lợi. Cộng đồng mã nguồn mở Android cĩ một cộng đồng các lập trình viên và những người đam mê rất năng động. Họ sử dụng mã nguồn Android để phát triển và phân phối những phiên bản chỉnh sửa của hệ điều hành. Các bản Android do cộng đồng phát triển thường đem những tính năng và cập nhật mới vào nhanh hơn các kênh chính thức của nhà sản xuất/nhà mạng, tuy khơng được kiểm thử kỹ lưỡng cũng như khơng cĩ đảm bảo chất lượng; cung cấp sự hỗ trợ liên tục cho các thiết bị cũ khơng cịn nhận được bản cập nhật chính thức; hoặc mang Android vào những thiết bị ban đầu chạy một hệ điều hành khác, như HP Touchpad. Các bản Android của cộng đồng thường được root sẵn và cĩ những điều chỉnh khơng phù hợp với những người dùng khơng rành rẽ, như khả năng ép xung hoặc tăng/giảm áp bộ xử lý của thiết bị. CyanogenMod là firmware của cộng đồng được sử dụng phổ biến nhất, và là cơ sở cho rất nhiều firmware khác phát triển dựa trên bản firmware này. Trước đây, nhà sản xuất thiết bị và nhà mạng tỏ ra thiếu thiện chí với việc phát triển firmware của bên thứ ba. Những nhà sản xuất cịn thể hiện lo ngại rằng các thiết bị chạy phần mềm khơng chính thức sẽ hoạt động khơng tốt và dẫn đến tốn tiền hỗ trợ. Hơn nữa, các firmware đã thay đổi như CyanogenMod đơi khi cịn cung cấp những tính năng, như truyền tải mạng (tethering), mà người dùng bình thường phải trả tiền nhà mạng mới được sử dụng. Kết quả là nhiều thiết bị bắt đầu đặt ra hàng rào kỹ thuật như khĩa bootloader hay hạn chế quyền truy cập 21
  22. Phát triển ứng dụng cho thiết bị di động Hồ Thị Thảo Trang root. Tuy nhiên, khi phần mềm do cộng đồng phát triển ngày càng trở nên phổ biến, và sau một thơng cáo của Thư viện Quốc hội Hoa Kỳ cho phép "jailbreak" (vượt ngục) thiết bị di động, các nhà sản xuất và nhà mạng đã tỏ ra mềm mỏng hơn với các nhà phát triển thứ ba, thậm chí một số hãng như HTC, Motorola, Samsung và Sony, cịn hỗ trợ và khuyến khích phát triển. Kết quả của việc này là dần dần nhu cầu tìm ra các hạn chế phần cứng để cài đặt được firmware khơng chính thức đã bớt đi do ngày càng nhiều thiết bị được phát hành với bootloader đã mở khĩa sẵn hoặc cĩ thể mở khĩa, tương tự như điện thoại dịng Nexus, tuy rằng thơng thường họ sẽ yêu cầu người dùng từ bỏ chế độ bảo hành nếu họ làm như vậy. Tuy nhiên, tuy được sự chấp thuận của nhà sản xuất, một số nhà mạng tại Mỹ vẫn bắt buộc điện thoại phải bị khĩa. Bảo mật và tính riêng tư Các ứng dụng Android chạy trong một "hộp cát" (sandboxed applications), là một khu vực riêng rẽ với hệ thống và khơng được tiếp cận đến phần cịn lại của tài nguyên hệ thống, trừ khi nĩ được người dùng trao quyền truy cập một cách cơng khai khi cài đặt. Trước khi cài đặt ứng dụng, Cửa hàng Play sẽ hiển thị tất cả các quyền mà ứng dụng địi hỏi: ví dụ như một trị chơi cần phải kích hoạt bộ rung hoặc lưu dữ liệu vào thẻ nhớ SD, nhưng nĩ khơng nên cần quyền đọc tin nhắn SMS hoặc tiếp cận danh bạ điện thoại. Sau khi xem xét các quyền này, người dùng cĩ thể chọn đồng ý hoặc từ chối chúng, ứng dụng chỉ được cài đặt khi người dùng đồng ý. 22
  23. Phát triển ứng dụng cho thiết bị di động Hồ Thị Thảo Trang Hình . Yêu cầu chấp nhận các quyền ứng dụng được phép sử dụng trước khi cài đặt Hệ thống hộp cát và hỏi quyền làm giảm bớt ảnh hưởng của lỗi bảo mật hoặc lỗi chương trình cĩ trong ứng dụng, nhưng sự thiếu kinh nghiệm của lập trình viên và tài liệu hướng dẫn cịn hạn chế đã dẫn tới những ứng dụng hay địi hỏi những quyền khơng cần thiết, do đĩ làm giảm đi hiệu quả của hệ thống này. Một số cơng ty bảo mật, như Lookout Mobile Security, AVG Technologies, và McAfee, đã phát hành những phần mềm diệt virus cho các thiết bị Android. Phần mềm này khơng cĩ hiệu quả vì cơ chế hộp cát vẫn áp dụng vào các ứng dụng này, do vậy làm hạn chế khả năng quét sâu vào hệ thống để tìm nguy cơ. Một nghiên cứu của cơng ty bảo mật Trend Micro đã liệt kê tình trạng lạm dụng dịch vụ trả tiền là hình thức phần mềm ác ý phổ biến nhất trên Android, trong đĩ tin nhắn SMS sẽ bị gửi đi từ điện thoại bị nhiễm đến một số điện thoại trả tiền mà người dùng khơng hề hay biết. Loại phần mềm ác ý khác hiển thị những quảng cáo khơng mong muốn và gây khĩ chịu trên thiết bị, hoặc gửi thơng tin cá nhân đến bên thứ ba khi chưa được phép. Đe dọa bảo mật trên Android được cho là tăng rất nhanh theo cấp số mũ; tuy nhiên, các kỹ sư Google phản bác rằng hiểm họa 23
  24. Phát triển ứng dụng cho thiết bị di động Hồ Thị Thảo Trang từ phần mềm ác ý và virus đã bị thổi phồng bởi các cơng ty bảo mật nhằm mục đích thương mại, và buộc tội ngành cơng nghiệp bảo mật đang lợi dụng sự sợ hãi để bán phần mềm diệt virus cho người dùng. Google vẫn giữ quan điểm rằng phần mềm ác ý thật sự nguy hiểm là cực kỳ hiếm, và một cuộc điều tra do F-Secure thực hiện cho thấy chỉ cĩ 0,5% số phần mềm ác ý Android là len vào được cửa hàng Google Play. Google hiện đang sử dụng bộ quét phần mềm ác ý Google Bouncer để theo dõi và quét các ứng dụng trên Cửa hàng Google Play. Nĩ sẽ đánh dấu các phần mềm bị nghi ngờ và cảnh báo người dùng về những vấn đề cĩ thể xảy ra trước khi họ tải nĩ về máy. Android phiên bản 4.2 Jelly Bean được phát hành vào năm 2012 cùng với các tính năng bảo mật được cải thiện, bao gồm một bộ quét phần mềm ác ý được cài sẵn trong hệ thống, hoạt động cùng với Google Play nhưng cũng cĩ thể quét các ứng dụng được cài đặt từ nguồn thứ ba, và một hệ thống cảnh báo sẽ thơng báo cho người dùng khi một ứng dụng cố gắng gửi một tin nhắn vào số tính tiền, chặn tin nhắn đĩ lại trừ khi người dùng cơng khai cho phép nĩ. Điện thoại thơng minh Android cĩ khả năng báo cáo vị trí của điểm truy cập Wi-Fi, phát hiện ra việc di chuyển của người dùng điện thoại, để xây dựng những cơ sở dữ liệu cĩ chứa vị trí của hàng trăm triệu điểm truy cập. Những cơ sở dữ liệu này tạo nên một bản đồ điện tử để tìm vị trí điện thoại thơng minh, cho phép chúng chạy các ứng dụng như Foursquare, Google Latitude, Facebook Places, và gửi những đoạn quảng cáo dựa trên vị trí. Phần mềm theo dõi của bên thứ ba như TaintDroid, một dự án nghiên cứu trong trường đại học, đơi khi cĩ thể biết được khi nào thơng tin cá nhân bị gửi đi từ ứng dụng đến các máy chủ đặt ở xa. Máy ảo Dalvik Java được biết đến với khẩu hiệu "viết một lần, chạy mọi nơi" (write once, run anywhere). Tính năng này của hệ sinh thái Java cĩ được nhờ một lớp máy ảo đứng giữa lớp ứng dụng (viết bằng Java) và lớp hệ điều hành (nhiều loại khác nhau), gọi là máy ảo Java - JVM (Java Virtual Machine). Máy ảo Java chạy rất ổn định và đồng nhất trên các mơi trường máy tính cá nhân (JSE) và máy chủ (JEE), tuy nhiên trong mơi trường di động (JME) thì máy ảo Java bị phân mảnh tương đối nhiều với các gĩi (pakages), cấu hình (configurations) và các mẫu (profiles) khác nhau. Google đã chọn Java làm ngơn ngữ phát triển ứng dụng cho hệ điều hành Android, tuy nhiên lại từ bỏ cả phiên bản Java di động (JME) lẫn máy ảo Java (JVM) để phát triển một máy ảo riêng - máy ảo Dalvik và tập thư viện Java chuẩn được viết lại và thu gọn hơn. Ứng dụng Android được phát triển bằng ngơn ngữ Java, sau đĩ được biên dịch thành dạng mã nhị phân Java (Java bytecode). Các file nhị phân .class (tương thích với JVM) này sẽ được chuyển đổi thành 1 file nhị phân dùng cho máy ảo Dalvik - .dex (Dalvik EXecutable) trước khi được cài lên thiết bị. Các tập tin .dex được thiết kế để phù hợp hơn với các thiết bị hạn chế về bộ nhớ cũng như hiệu năng xử lý. 24
  25. Phát triển ứng dụng cho thiết bị di động Hồ Thị Thảo Trang Dalvik là một phần mềm mã nguồn mở, ban đầu được phát triển bởi Dan Bornstein, và được ơng đặt tên theo tên ngơi làng Dalvík tại Eyjafjưrður, Iceland, quê hương của ơng. Kiến trúc Hệ điều hành Android được thiết kế hướng đến rất nhiều các loại thiết bị khác nhau, từ những thiết bị giá rẻ, cấu hình thấp (low-end) đến những siêu phẩm đắt tiền (high-end). Bên cạnh đĩ các ứng dụng Android phải được chạy trong "hộp cát" với độ bảo mật cao, hiệu năng tốt và ổn định, vì vậy việc sử dụng một máy ảo làm mơi trường thực thi là điều tất yếu. Tuy nhiên việc sử dụng máy ảo thường sẽ làm giảm hiệu năng của hệ thống. Giải pháp máy ảo Dalvik của Google được đưa ra nhằm cân bằng giữa 2 điểm này: - Mỗi ứng dụng Android được chạy trong tiến trình riêng, với một thực thể (instance) của máy ảo Dalvik riêng. Dalvik được thiết kế để hệ điều hành cĩ thể chạy nhiều thực thể của máy ảo một cách hiệu quả với file thực thi Dalvik (.dek file) được thiết kế để tối ưu hĩa bộ nhớ cần sử dụng. Máy ảo Dalvik là máy ảo dựa trên thanh ghi (register-based), khác với máy ảo Java chạy dựa trên cấu trúc ngăn xếp (stack-based). - Máy ảo Dalvik sử dụng hạt nhân Linux cho các việc liên quan đến lơp dưới của hệ thống như quản lý tiểu trình (threading), quản lý bộ nhớ cấp thấp Do mỗi ứng dụng chạy trên một thực thể máy ảo riêng, hệ thống Android khơng những cần tối ưu việc chạy nhiều máy ảo và cịn phải giảm tối đa thời gian khởi tạo máy ảo mới. Phần dưới đây sẽ xem xét 4 điểm chính trong thiết kế máy ảo mà Google đã chọn lựa để đạt được hiệu năng và độ bảo mật cần thiết: cấu trúc file .dex, Zygote, cấu trúc dựa trên thanh ghi và bảo mật. Định dạng file .dex Trong mơi trường Java truyền thống, mã nguồn Java được biên dịch thành dạng bytecode, ở đĩ mỗi class trong mã nguồn được biên dịch thành một file .class riêng. Trong hệ thống Android, mã nguồn Java cũng được biên dịch thành các file .class riêng. Tuy nhiên trước khi cĩ thể được cài đặt lên thiết bị, các file này phải được chuyển đổi thành file 25
  26. Phát triển ứng dụng cho thiết bị di động Hồ Thị Thảo Trang thực thi Dalvik (.dex) bằng cơng cụ "dx" cĩ trong Android SDK. File thực thi Dalvik cĩ thể chứa nhiều class bên trong và mỗi ứng dụng Android chỉ chứa một file .dex duy nhất. File thực thi Dalvik được thiết kế nhắm đến tối ưu bộ nhớ trên cơ sở chia sẻ (dùng chung) dữ liệu. Biểu đồ dưới đây phân biệt cấu trúc file .dex với file .class truyền thống. Hình . Cấu trúc Java class file và file thực thi Dalvik Cơ chế chính của file .dex cho việc tiết kiệm bộ nhớ là dùng chung các vùng nhớ chứa hằng số cho tất cả các class. Các vùng nhớ cho hằng số này được chia theo từng loại dữ liệu (hằng số chuỗi, tên trường, tên class, tên method ). Trong mã lệnh của các class bên dưới sẽ khơng cần ghi lại các tên/hằng số này mà chỉ chứa chỉ số (số nguyên) của nĩ trong vùng hằng số. Đối với các file .class truyền thống, mỗi class file chứa vùng nhớ riêng cho các hằng số của class đĩ. Vùng nhớ này khơng đồng nhất vì nĩ chứa tất cả các loại hằng số, khơng phân biệt theo loại như trong trường hợp của .dex file. Việc lặp lại khai báo các hằng số này ở nhiều file .class khiến tổng kích thước các file .class lơn hơn nhiều so với file thực thi Dalvik. Theo số liệu thống kế, trung bình trong mỗi file .class, 61% kích thước của file là các hằng số (!!!), các mã của các phương thức (method) chỉ chứa khoảng 33%, cịn lại 5% cho các phần khác của class. Như vậy việc tiết kiệm vùng nhớ cho hằng số dẫn đến tiết kiệm đáng kể 26
  27. Phát triển ứng dụng cho thiết bị di động Hồ Thị Thảo Trang kịch thước file thực thi (thơng thường là khoảng 50%), từ đĩ tiết kiệm được lượng bộ nhớ cần cấp phát lúc thực thi ứng dụng. Zygote Các ứng dụng Android được chạy trong các thực thể máy ảo riêng, vì vậy máy ảo phải được "khởi động" nhanh và sử dụng tối thiểu bộ nhớ cần thiết. Để đạt được điều này, hệ thống Android đưa ra một cơ chế giúp các thực thể máy ảo cĩ thể chia sẻ mã lệnh dùng chung và "khởi động" nhanh, gọi là Zygote. Hầu hết các ứng dụng Android đều dùng chung một số thư viện lõi và cấu trúc bộ nhớ heap kèm theo nĩ. Thêm vào đĩ, vùng nhớ heap của các thư viện lõi này thường chỉ được truy xuất một chiều chỉ đọc (read-only). Lợi dụng điểm này, Zygote, một tiến trình máy ảo Dalvik được khởi chạy lúc khởi động thiết bị, nạp sẵn các thư viện lõi của hệ điều hành mà các ứng dụng thường xuyên sử dụng, để sẵn sàng cho các máy ảo sử dụng. Mỗi lần một ứng dụng được chạy, hệ thống sẽ khởi động một máy ảo mới, tuy nhiên máy ảo này sẽ khơng cần chứa những thư viện lõi, mà sử dụng luơng thư viện lõi trong Zygote, khiến thời gian khởi tạo máy ảo là tối thiểu. Các thư viện lõi trong hầu hết các trường hợp là "chỉ đọc" chứ khơng bị ghi đè bởi ứng dụng. Trong trường hợp ứng dụng cĩ nhu cầu ghi vào vùng nhớ heap của các thư viện lõi này, một bản sao của vùng nhớ Zygote sẽ được tạo ra riêng cho tiến trình của ứng dụng đĩ. Cơ chế "sao chép khi ghi" (copy-on-write) này giúp tối ưu hĩa việc sử dụng chung mã lệnh của thư viện lõi mà vẫn đảm bảo tính bảo mật giữa các ứng dụng: việc thay đổi dữ liệu trong bộ nhớ của ứng dụng này khơng ảnh hưởng đến các ứng dụng khác. Trong JVM truyền thống, mỗi thực thể của máy ảo Java sẽ cĩ một tập các thư viện lõi riêng cùng vùng nhớ tương ứng cho chúng, khơng cĩ sự chia sẻ bộ nhớ giữa các thực thể của máy ảo. Kiến trúc máy ảo dựa trên thanh ghi Theo truyền thống, các nhà phát triển máy ảo thường lựa chọn kiến trúc dựa trên ngăn xếp (stack-based architecture) hơn là kiến trúc dựa trên thanh ghi (register-based architecture) do việc thiết kế máy ảo và trình biên dịch cho kiến trúc ngăn xếp đơn giản hơn so với trường hợp của kiến trúc thanh ghi. Bù lại cho sự đơn giản là hiệu suất giảm đi. Các nghiên cứu đã chỉ ra rằng, kiến trúc dựa trên thanh ghi thường địi hỏi số lượng mã lệnh thực thi cho ứng dụng ít hơn trung bình là 47% so với trường hợp dùng ngăn xếp. Bù lại kích thước mã lệnh thường lớn hơn khoảng 25%. Tuy nhiên sự gia tăng về kích thước mã lệnh này chỉ phát sinh thêm khoảng 1.07% tải của CPU thật. Các trình đánh giá tiêu chuẩn cho thấy hiệu suất tổng thể của máy ảo dựa trên kiến trúc thanh ghi cao hơn khoảng 32.3% so với kiến trúc ngăn xếp. Với yêu cầu chạy trên các thiết bị với hiệu năng tính tốn thấp, việc máy ảo Dalvik lựa chọn kiến trúc thanh ghi là hồn tồn hợp lý. Mặc dù kích thước mã lệnh lớn hơn trung bình 25%, việc sử dụng vùng nhớ chung cho hằng số của file .dex giúp kích thước mã lệnh giảm đi đến 50% khiến file thực thi Dalvik vẫn hiệu quả hơn đáng kể về mặt bộ nhớ so với các file .class truyền thống. 27
  28. Phát triển ứng dụng cho thiết bị di động Hồ Thị Thảo Trang Bảo mật Mặc định theo kiến trúc bảo mật của hệ điều hành Android, mỗi ứng dụng khơng cĩ quyền thực thi bất cứ thao tác nào ảnh hưởng đến các ứng dụng khác, đến hệ điều hành hay người dùng, bao gồm: đọc/ghi dữ liệu cá nhân (như danh bạ, emails ), đọc/ghi file dữ liệu của ứng dụng khác, thực hiện kết nối mạng, giữ màn hình luơn sáng Tính năng này được thực hiện từ lớp hệ điều hành và lớp khung ứng dụng (application framework) chứ khơng phải bên trong máy ảo Dalvik. Mỗi ứng dụng được chạy trong một máy ảo riêng, máy ảo này lại được chạy trong một tiến trình riêng. Mỗi tiến trình được chạy dưới một mã người dùng (user ID) riêng, được sinh ra lúc cài đặt và được phân quyền chỉ được truy cập một sơ tính năng nhất định của hệ điều hành và các tập tin riêng của mình. Nếu ứng dụng cĩ các yêu cầu đặc biệt đến các tính năng khác của hệ thống thì phải khai báo các quyền tương ứng trong file mơ tả ứng dụng (AndroidManifest.xml) và sẽ được cấp các quyền này lúc cài đặt nếu được sự đồng ý từ người dùng. 2.2. Lập trình cho thiết bị Android Bộ phát triển phần mềm Android (Android SDK) Hệ sinh thái Android được cấu thành từ 3 thành phần tổng quan như sau: - Hệ điều hành mã nguồn mở cho thiết bị nhúng - Bộ cơng cụ phát triển phần mềm (mã nguồn mở) - Android SDK - Các thiết bị (chủ yếu là điện thoại thơng minh) chạy hệ điều hành Android với các ứng dụng được phát triển cho chúng Trong đĩ Android SDK là bộ phát triển phần mềm Android được Google đưa ra dưới dạng mã nguồn mở, giúp người lập trình cĩ thể dễ dàng truy xuất vào các tính năng của hệ điều hành như: - Mạng điện thoại cho việc nghe gọi/SMS cũng như truy cập Internet: GSM/GRPS, EGDE, 3G, 4G, LTE - Tập APIs cho các ứng dụng hướng vị trí (GPS, vị trí dựa trên kết nối mạng) - Tích hợp ứng dụng bản đồ thành 1 thành phần của ứng dụng - Kết nối mạng WiFi và kết nối điểm-tới-điểm (peer-to-peer) - Các ứng dụng đa phương tiện: ghi hình, ghi âm với camera và microphone, phát nhạc, phát video - Thư viện đa phương tiện vơi khả năng thu và phát nhiều loại audio và video, cũng như các ảnh tĩnh - API truy cập đến các cảm biến: cảm biến gia tốc, tiệm cận, la bàn - Thư viện cho việc sử dụng Bluetooth và NFC cho kết nối điểm-tới-điểm - Chia sẻ dữ liệu và trao đổi dữ liệu giữa các ứng dụng - API cho các kho dữ liệu chia sẻ như danh bạ, lịch, mạng xã hội, đa phương tiện 28
  29. Phát triển ứng dụng cho thiết bị di động Hồ Thị Thảo Trang - Các ứng dụng/tác vụ chạy ngầm - Các tiện ích (widget) trên màn hình chính và hình nền động - Tích hợp khả năng tìm kiếm của ứng dụng vào cơng cụ tìm kiếm của hệ thống - Trình duyệt HTML5 mã nguồn mở, dựa trên Webkit - Bộ tăng tốc đồ họa bằng phần cứng (GPU) cho việc tối ưu hiệu năng hiển thị, bao gồm nhưng khơng giới hạn ở đồ họa 2D và 3D với OpenGL ES 2.0 - Hỗ trợ đa ngơn ngữ với cơ chế cung cấp tài nguyên đặc trưng - Cơ chế sử dụng lại các thành phần của ứng dụng cũng như thay thế các ứng dụng sẵn cĩ - Lưu trữ và truy xuất dữ liệu với CSDL Sqlite 3.0 - Google Clound Message cho quản lý việc đẩy thống báo xuống thanh hệ thống - Bộ SDK đầy đủ sau khi tải về sẽ bao gồm tất cả các thành phần cần thiết cho việc viết code, gỡ rối, kiểm thử, biên dịch và xuất bản phần mềm như: - Android API - là các thư viện lõi của bộ SDK, giúp người lập trình truy xuất các thành phần của hệ điều hành. Các ứng dụng của Google cài sẵn trên thiết bị cũng được phát triển dựa trên các API này. - Cơng cụ phát triển: bao gồm các cơng cụ dùng cho việc biên dịch và gỡ rối ứng dụng - Bộ quản lý các thiết bị ảo và bộ giả lập thiết bị: cho phép người lập trình chạy thử ứng dụng trên một hoặc nhiều thiết bị ảo thơng qua bộ giả lập trên máy tính cá nhân mà khơng cần thiết bị di động thật. - Bộ tài liệu tra cứu rất chi tiết về mơ tả và cách sử dụng cho tất cả các gĩi và các lớp, cũng như các bài viết hữu ích khác. - Các mã nguồn mẫu: bộ SDK cũng đi kèm với những ứng dụng mẫu, nhằm biểu diễn các tính năng của Android với các ví dụ chi tiết về việc sử dụng các API Đối với những người dùng Eclipse làm mơi trường phát triển tích hợp, Google cũng phát triển một trình cắm thêm cho IDE gọi là Android Developer Tools (ADT) giúp việc phát triển ứng dụng Android trở nên dễ dàng hơn rất nhiều. Ta sẽ làm quen với trình cắm thêm ADT ở các phần sau của tài liệu. Các lớp phần mềm Android (software stack) Để đảm bảo sự đơn giản, tính dùng chung và bảo mật trong các ứng dụng trên hệ thống Android, các thư viện cho ứng dụng Android được chia ra thành các phân lớp từ thấp đến cao, các thành phần ở lớp trên chủ yếu sử dụng các dịch vụ do các lớp ngay bên dưới cung cấp mà ít khi phải dùng đến các API của các lớp thấp hơn. Kiến trúc này được chia ra thành các tầng chính như trong hình vẽ dưới đây. 29
  30. Phát triển ứng dụng cho thiết bị di động Hồ Thị Thảo Trang Hình . Các lớp phần mềm trong Android Ở đĩ: Hạt nhân Linux (Linux kernel) - bao gồm các dịch vụ lõi (trình điều khiển phần cứng, quản lý tiến trình, bộ nhớ, mạng, nguồn điện và bảo mật ). Hạt nhân này là lớp trừu tượng giữa phần cứng của thiết bị và các lớp phía trên. Các thư viện (libraries) - chạy bên trên lớp hạt nhân, bao gồm các các thư viện lõi viết bằng C/C++ như libc và SSL, cũng như các thư viện như: - Thư viện cho việc phát các loại dữ liệu âm thanh và hình ảnh - Bộ quản lý bề mặt (surface manager) cho việc hiển thị đồ họa trên màn hình - Các thư viện đồ họa bao gồm SGL và OpenGL cho đồ họa 2D và 3D - SQLite cho các ứng dụng sử dụng CSDL - SSL và WebKit cho việc tích hợp trình duyệt và bảo mật Internet Bộ thực thi Android (Android runtime) - là mơi trường cho các ứng dụng Android cĩ thể chạy được, bao gồm các thư viện lõi Android (gần như tương đồng với các thư viện lõi của 30
  31. Phát triển ứng dụng cho thiết bị di động Hồ Thị Thảo Trang ngơn ngữ Java), các thư viện dành riêng cho Android, và máy ảo Dalvik như đã mơ tả ở phần trước. Bộ khung ứng dụng (Application framework) - cung cấp tập các class để phát triển ứng dụng Android. Lớp này cung cấp khả năng giao tiếp với phần cứng thơng qua các lớp bên dưới cũng như quản lý giao diện và các tài nguyên của ứng dụng Lớp ứng dụng (Application layer) - hầu hết các ứng dụng (bao gồm cả ứng dụng cài sẵn trong hệ điều hành và các ứng dụng của các bên thứ 3) đều được phát triển dựa trên lớp này (dùng chung tập API). Lớp ứng dụng được chạy trong bộ thực thi Android (với các thư viện lõi và máy ảo Dalvik), sử dụng các lớp và các dịch vụ cung cấp bởi lớp Application Framework. Mơi trường phát triển Để cĩ thể bắt đầu lập trình ứng dụng cho hệ điều hành Android, bạn cần ít nhất các thứ sau: Bộ phát triển phần mềm Android (Android SDK) như mơ tả ở trên, bao gồm các cơng cụ phát triển do Google phát triển và các Android API (các API được download riêng bởi cơng cụ Mơi trường phát triển tích hợp (IDE) dùng cho việc viết mã nguồn với các tính năng như tự động định dạng mã nguồn, tự động hồn thiện mã nguồn (gợi ý) Các mơi trường thường tự động kết nối đến Android SDK giúp các thao tác biên dịch, gỡ rối, kiểm thử và xuất bản ứng dụng trở nên dễ dàng hơn rất nhiều. Các IDE phổ biến cho lập trình Android cĩ thể kể đến như Eclipse (với plugin ADT của Google), IntelliJ IDEA, Android Studio Thiết bị chạy Android, thơng thường là điện thoại thơng mình chạy hệ điều hành Android, dùng để chạy thử ứng dụng trong quá trình phát triển. Bạn cũng cĩ thể dùng trình giả lập thiết bị (Android emulator) đi kèm theo bộ kit phát triển nếu khơng cĩ thiết bị thật, tuy nhiên hiệu năng của trình giả lập thiết bị Android tương đối thấp, và một số tác vụ đặc biệt liên quan đến phần cứng như lập trình đa phương tiện hay truy xuất đến một số cảm biến sẽ khơng chạy được trên trình giả lập. Hầu hết các ví dụ trong tài liệu này sẽ chạy được tốt trên cả thiết bị thật lẫn trình giả lập, trong trường hợp mã nguồn khơng chạy được trên trình giả lập sẽ cĩ chú thích riêng. Tải và cài đặt mơi trường SDK, IDE Cách thức đơn giản nhất để cĩ được bộ cơng cụ đầy đủ, cấu hình sẵn sàng cho việc phát triển là tải gĩi Eclipse cĩ đĩng gĩi sẵn trình cắm ADT (Android Developer Tool) của Google tại địa chỉ chọn "Download the SDK (ADT Bundle for {OS})". 31
  32. Phát triển ứng dụng cho thiết bị di động Hồ Thị Thảo Trang Sau khi tải xong Eclipse + ADT (bộ đĩng gĩi sẵn của Google), gỡ nén và chạy file eclipse.exe, giao diện màn hình đang khởi động của IDE như sau: Hình . Eclipse với ADT đang khởi động 32
  33. Phát triển ứng dụng cho thiết bị di động Hồ Thị Thảo Trang Hình . Giao diện Eclipse với ADT đã khởi động xong Tải Android API Bộ đĩng gĩi sẵn Eclipse + ADT trên đã kèm sẵn bộ phát triển Android SDK, tuy nhiên để cĩ thể bắt đầu viết ứng dụng Android, bạn cần tải thêm các Android API và tạo các thiết bị Android ảo để test. Để tải các Android API, từ trình đơn “Window” của Eclipse, chọn “Android SDK Manager”. Cửa sổ Android SDK Manager sẽ hiện ra cho phép bạn chọn các mức API cần thiết để download. Mỗi phiên bản hệ điều hành Android sẽ cĩ một mức API (API level) tương ứng, để bắt đầu phát triển, bạn chỉ cần tải một trong số các mức API được liệt kê, trong hình vẽ dưới đây, ta chọn mức API mới nhất (Android 4.3 – API 18). Tuy nhiên để kiểm thử tính tương thích của ứng dụng viết ra với các phiên bản Android cũ hơn, bạn nên tải thêm các mức API thấp hơn, phổ biến nhất là API 10 (Android 2.3.3). 33
  34. Phát triển ứng dụng cho thiết bị di động Hồ Thị Thảo Trang Hình . Chọn các mức API để tải về Tạo thiết bị Android ảo Để tạo các thiết bị Android ảo, từ Eclipse, chọn Window > Android Virtual Deivce Manager, cửa sổ quản lý thiết bị giả lập sẽ xuất hiện như hình dưới. 34
  35. Phát triển ứng dụng cho thiết bị di động Hồ Thị Thảo Trang Hình . Quản lý thiết bị giả lập Android (thiết bị ảo) Để tạo thiết bị mới, bấm “New ”, màn hình tạo thiết bị mới xuất hiện như hình bên dưới, bạn cần lựa chọn các thơng số kỹ thuật cho thiết bị cần tạo như: - Tên thiết bị - Loại thiết bị thật tương ứng cần giả lập (ứng với độ phân giải màn hình của thiết bị thật này) - Mức API - Các thơng số khác như: bàn phím, máy ảnh, RAM, heap, thẻ nhớ Bấm OK để hồn thành quá trình tạo thiết bị giả lập. 35
  36. Phát triển ứng dụng cho thiết bị di động Hồ Thị Thảo Trang Hình . Tạo thiết bị giả lập Android mới Sau khi thiết bị ảo đã được tạo, bạn cĩ thể khởi động thiết bị bằng cách chọn thiết bị tương ứng từ danh sách và bấm “Start ”. Màn hình chọn cấu hình khởi chạy thiết bị xuất hiện, cho phép bạn chọn kích thước màn hình thật của thiết bị và phương pháp khởi chạy. Bạn nên lựa chọn khởi động với trạng thái lưu trước đĩ (Launch from snapshot) để được tốc độ nhanh nhất. Nếu bạn muốn lưa lại trạng thái của lượt chạy này cho các lần sử dụng máy ảo sau này thì chọn “Save to snapshot”. Cuối cùng, bấm “Launch” để bắt đầu khởi động thiết bị. 36
  37. Phát triển ứng dụng cho thiết bị di động Hồ Thị Thảo Trang Hình . Khởi động máy ảo Android Máy ảo Android với API 17 (Android 4.2) sau khi khởi động lần đầu sẽ cĩ dạng như hình dưới đây: 37
  38. Phát triển ứng dụng cho thiết bị di động Hồ Thị Thảo Trang Hình . Máy ảo Android 4.2 sau khi khởi động xong (lần đầu tiên) Sau khi thiết lập đầy đủ mơi trường làm việc theo các bước trên, chúng ta đã cĩ thể bắt tay vào viết ứng dụng cho thiết bị chạy Android. Theo truyền thống chúng ta sẽ bắt đầu với ứng dụng “Hello world”. Hello Android (Android “Hello world”) Để tạo dự án Android mới, chúng ta làm theo các bước sau: 1. Từ Eclipse, chọn File > New > Project 38
  39. Phát triển ứng dụng cho thiết bị di động Hồ Thị Thảo Trang 2. Trong mục Android, chọn “Android project” 3. Đặt tên cho dự án là “HelloWorld” 39
  40. Phát triển ứng dụng cho thiết bị di động Hồ Thị Thảo Trang 4. Điền thơng tin cho ứng dụng cần tạo: - Tên ứng dụng (sẽ hiển thị trên thiết bị Android) - Package name: chuỗi định danh duy nhất cho ứng dụng, thường được đặt cĩ định dạng giống với định dạng package của Java - Chọn “Create Activity” và đặt tên Activity mặc định của ứng dụng. Khái niệm activity trong Android ta sẽ tìm hiểu trong chương tới, ở đây tạm hiểu activity là một “màn hình” hay “form” của ứng dụng - Chọn SDK thấp nhất mà ứng dụng hỗ trợ - Finish 40
  41. Phát triển ứng dụng cho thiết bị di động Hồ Thị Thảo Trang 5. Sau khi tạo xong, project mới sẽ xuất hiện trong khung “Package Explorer” của Android như hình dưới: 41
  42. Phát triển ứng dụng cho thiết bị di động Hồ Thị Thảo Trang 6. Trong thư mục res/layout, ta thấy cĩ file “main.xml”. Đây là file mơ tả giao diện của ứng dụng HelloWorld của chúng ta, kích đúp vào file này, cửa sổ soạn thảo giao diện sẽ được mở ra như hình dưới. Để thay đổi giao diện bằng tay (XML code), ta chuyển sang tab “main.xml” 42
  43. Phát triển ứng dụng cho thiết bị di động Hồ Thị Thảo Trang 7. Thêm đoạn code in đậm dưới đây vào file main.xml: 8. Ghi file (Ctrl+S) và chạy ứng dụng lên thiết bị ảo bằng cách nháy phải chuột vào project, chọn Run As > Android Application 43
  44. Phát triển ứng dụng cho thiết bị di động Hồ Thị Thảo Trang 9. Ứng dụng sau khi chạy sẽ cĩ dạng như sau: 44
  45. Phát triển ứng dụng cho thiết bị di động Hồ Thị Thảo Trang /; 10. Click vào nút Home (biểu tượng ngơi nhà trong các phím ảo ở bên phải màn hình emulator) để ẩn ứng dụng và hiển thị màn hình chủ của hệ điều hành Android, sau đĩ bấm nút danh sách ứng dụng , ta sẽ thấy ứng dụng HelloWorld của chúng ta xuất hiện trong danh sách ứng dụng được cài đặt: 45
  46. Phát triển ứng dụng cho thiết bị di động Hồ Thị Thảo Trang Như vậy ứng dụng HelloWorld đã được biên dịch và chạy thành cơng trên thiết bị ảo (đối với thiết bị thật cũng vậy), để hiểu được ứng dụng chạy như thế nào, trước tiên ta sẽ tìm hiểu cấu trúc của một ứng dụng Android và tìm hiểu các khái niệm cơ bản sử dụng trong dự án này. Cấu trúc của một dự án Android Một bộ mã nguồn của ứng dụng Android bao thường bao gồm các thành phần như sau: - “src” – thư mục chứa các file mã nguồn Java, các file mã nguồn này được đặt trong các thư mục con của thư mục “src”, tương ứng với package chứa nĩ. Trong ví dụ ở trên, ta chỉ cĩ 1 file mã nguồn là “HelloWorldActivity.java”, nằm trong package “net.learn2develop.HelloWorld”. - “gen” – thư mục chứa file R.java, file này được trình biên dịch tự động sinh ra, chứa tham chiếu đến tất cả các tài nguyên (ảnh, chuỗi, màu sắc, kích thước, layout ) sử dụng trong dự án. Đây là file tự sinh ra, bạn khơng cần tự chỉnh sửa file này trong mọi trường hợp. - “Android x.x” – chứa file android.jar, bao gồm tất cả các lớp trong thư viện Android cần thiết cho ứng dụng, file này cũng tự động được gắn vào dự án, tùy thuộc vào mức API bạn chọn trước đĩ. - “assets” – thư mục chứa các tài nguyên tĩnh khác được sử dụng trong ứng dung, như HTML, font, file CSDL - “bin” – chứa các file tạm biên dịch trong quá trình, trong đĩ cĩ file .apk, là file nhị phân của ứng dụng Android. File .apk là file đã đĩng gĩi tồn bộ mọi thứ cần thiết để 46
  47. Phát triển ứng dụng cho thiết bị di động Hồ Thị Thảo Trang chạy ứng dụng. Nội dung thư mục này cũng do trình biên dịch tự động sinh ra, bạn khơng cần can thiệp bằng tay. - “res” – thư mục chứa tất cả các tài nguyên của được sử dụng trong ứng dụng như: hình ảnh (drawable), bố cục giao diện (layout), các chỗi, màu sắc, kích thước (values). Chúng ta sẽ xem chi tiết về các loại tài nguyên này trong các chương kế tiếp. - AndroidManifest.xml – là file đặc tả ứng dụng, mọi ứng dụng Android đều cần cĩ file này, hệ thống sẽ đọc file này để lúc cài đặt để xác định các quyền cần cấp cho ứng dụng, các activity cĩ trong ứng dụng, và nhiều tính năng khác. Chi tiết về file đặc tả này sẽ được đề cập đến ở phần dưới. Mã nguồn duy nhất chúng ta sử dụng trong dự án HelloWorld là class HelloWorldActivity.java, nội dung file này như sau: package net.learn2develop.HelloWorld; 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); } } Lớp này kế thừa từ lớp android.app.Activity với cài đặt thêm hàm onCreate (hàm này được gọi khi Acticity được khởi tạo), trong thân hàm ngồi việc gọi hàm dựng của lớp cha, chỉ chứa một dịng duy nhất setContentView(R.layout.main); địng này chỉ ra activity hiện tại sẽ sử dụng bố cục (giao diện) khai báo trong file main.xml nằm trong thư mục res/layout. File này đã được biên dịch và tham chiều đến trong file R.java dưới tên R.layout.main. Để Activity này cĩ thể sử dụng và mở ra đầu tiên khi ứng dụng được chạy trên thiết bị, nĩ cần phải được khai báo trong file AndroidManifest.xml như sau: 47
  48. Phát triển ứng dụng cho thiết bị di động Hồ Thị Thảo Trang Các thành phần chính của file AndroidManifest.xml: - Khai báo package name – định danh duy nhất của ứng dụng trên hệ thống Android (“net.learn2develop.HelloWorld”) - Phiên của ứng dụng (tên mã và tên hiển thị của phiên bản): android:versionCode, android:versionName. Trong đĩ version code là số nguyên, được sử dụng cho hệ thống, nhắm xác định khi nào ứng dụng co phiên bản mới hơn, cịn version name là chuỗi, chứa tên của phiên bản hiển thị lên cho người dùng. - android:minSdkVersion – khai báo mức API thấp nhất ứng dụng cần để chạy, thiết bị chạy Android với phiên bản thấp hơn mức API này sẽ khơng cài đặt được ứng dụng đang phát triển. - android:icon="@drawable/ic_launcher" – khai báo sử dụng file ảnh ic_launcher.png trong thư mục res/drawable để làm biểu tượng cho ứng dụng - android:label="@string/app_name" – khai báo sử dụng chuỗi cĩ tên là app_name trong file string.xml làm tên của ứng dụng (chuỗi này cĩ giá trị là “HelloWorld”) - File manifest này cũng khai báo các activity cĩ trong ứng dụng, trong ví dụ của chúng ta chỉ cĩ 1 activity là ".HelloWorldActivity”, dấu chấm (.) ở đầu tên Activity chỉ ra rằng activity này nằm trong package cùng tên với package name của ứng dụng (net.learn2develop.HelloWorld.HelloWorldActivity). Bên trong khai báo Activity này cĩ thêm mục intent-filter với chỉ ra rằng đây là Activity cần mở ra đầu tiên khi chạy ứng dung, và chỉ ra rằng Activity này sẽ được tạo biểu tượng (shortcut) trên màn hình chủ của Android. File main.xml trong thư mục res/layout (như đã mơ tả ở trên) chứa mơ tả giao diện của activity HelloWorldActivity, bao gồm khai báo 2 đoạn chữ (TextView) ("@string/hello" và "This is my first Android Application!") và một nút bấm với nội dung "And this is a clickable button!". Ba thành phần này được sắp xếp thứ tự từ trên xuống dưới do chúng được đặt trong một LinearLayout với tham số hướng dọc (android:orientation="vertical"). Ta cĩ thể để ý thấy TextView thứ 2 được khai báo nội dung chữ tường minh ("This is my first Android Application!"), trong khi TextView đầu tiên được khai báo tên của hằng số chuỗi nằm trong thư mục tài nguyên của ứng dụng (res/values/string.xml) – xem hình dưới. Đây là cách cung cấp tài nguyên phổ biến trong Android, giúp cho việc quản lý các hằng số một cách tập trung và dễ dàng cho việc địa phương hĩa các chuỗi (đa ngơn ngữ). Chúng ra sẽ tìm hiểu thêm về vấn đề này ở các chương sau. 48
  49. Phát triển ứng dụng cho thiết bị di động Hồ Thị Thảo Trang Chúng ta kết thúc dự án HelloWorld ở đây, chương tiếp theo sẽ tìm hiều sâu hơn về thành phần quan trọng nhất của ứng dụng Android là các Activity và một số khái niệm liên quan. 49
  50. Phát triển ứng dụng cho thiết bị di động Hồ Thị Thảo Trang Chương 3. Các Activity, Fragment và Intent Trong chương trước, chúng ta đã biết activity là một cửa sổ (hay màn hình, form) chứa giao diện của ứng dụng Android. Đây là thành phần phổ biến và quan trọng nhất trong mỗi ứng dụng Android. Thơng thường mỗi ứng dụng cĩ thể cĩ ít nhất một hoặc nhiều activity, là nơi người dùng tương tác với ứng dụng (tuy nhiên cĩ những ứng dụng đặc biệt khơng chứa một activity nào, như những ứng dụng chạy ngầm khơng cĩ giao diện). Trong quá trình thực thi ứng dụng, kể từ khi được khởi tạo đến lúc biến mất khỏi màn hình điện thoại, mỗi activity sẽ trải qua một số các trạng thái nhất định, gọi là “vịng đời” của Activity. Mỗi lập trình viên Android cần phải nắm vững các trạng thái trong vịng đời của các Activity để cĩ những xử lý phù hợp như lưu lại trạng thái dữ liệu trước khi Activity biến mất hay khơi phục lại trạng thái dữ liệu khi Activity được khơi phục Ngồi Activity, Android từ phiên bản 3.0 (API level 11) trở lên giới thiệu thêm khái niệm “mảnh giao diện”, hay fragment. Fragment cĩ thể được hiểu như các “mảnh ghép” của giao diện ứng dụng – là một phần của Activity. Mỗi Activity cĩ thể chứa một hoặc nhiều “mảnh ghép” này trong giao diện của mình, và mỗi “mảnh ghép” lại cĩ thể được chèn vào nhiều Activity khác nhau. Điều này cho phép giảm thiểu tối đa sự trùng lặp về mã nguồn cho việc tạo giao diện ứng dụng thích nghi được với nhiều loại kích cỡ và hướng của màn hình. Các ứng dụng viết cho các phiên bản hệ điều hành thấp hơn cũng cĩ thể sử dụng Fragment bằng cách sử dụng “thư viện hỗ trợ” của Android (Android Support Library). Thư viện này cung cấp các tính năng của các mức API mới cho các ứng dụng viết cho mức API thấp hơn, trong số đĩ Android Support Library v4 cho phép các ứng dụng viết cho API 4 (Android 1.6) trở lên sử dụng được Fragment và nhiều tính năng khác của các API level cao hơn. Chúng ta sẽ tìm hiểu kỹ hơn về Activity và Fragment trong phần tiếp theo của chương này. Một khái niệm quan trọng khác của hệ điều hành Android là Intent. Intent hiểu một cách nơm na giống như “keo dán” giữa các thành phần của hệ điều hành, giúp các activity của cùng một ứng dụng hoặc các ứng dụng khác nhau cĩ thể tương tác với nhau để thực hiện cơng việc một cách trơi chảy, giống như các activity đĩ cùng thuộc một ứng dụng. Người lập trình cũng cĩ thể sử dụng Intent để gọi các ứng dụng sẵn cĩ của hệ điều hành như trình duyệt, trình gọi điện, gửi tin nhắn, bản đồ 3.1. Activity Vịng đời của Activity Mỗi activity là một class kế thừa từ class android.app.Activity hoặc các lớp kế thừa từ nĩ, ta xem lại Activity trong ví dụ của chương trước: package net.learn2develop.HelloWorld; 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) { 50
  51. Phát triển ứng dụng cho thiết bị di động Hồ Thị Thảo Trang super.onCreate(savedInstanceState); setContentView(R.layout.main); } } Activity này sử dụng giao diện được khai báo trong file bố cục main.xml, trong thư mục res/layout bằng cách gọi lênh: setContentView(R.layout.main); Cũng nhắc lại là mỗi Activity cần được khai báo trong file đặc tả ứng dụng (AndroidManifest.xml) như trong chương trước đã mơ tả. Vịng đời của mỗi Activity trải qua các trạng thái nhất định, tại mỗi trạng thái sẽ cĩ sự kiện tương ứng được gọi đến. Các sự kiện này được khai báo trong lớp cơ sở (android.app.Activity), bạn cĩ thể nạp chồng các sự kiện này để theo dõi vịng đời của Activity và cĩ những tác động thích hợp. Các sự kiện như vậy bao gồm: - onCreate() – được gọi khi Activity được khởi tạo - onStart() – được gọi khi Activity bắt đầu được hiện ra (người bắt đầu nhìn thấy giao diện) - onResume() – bắt đầu nhận các tương tác với người dùng - onPause() – gọi khi activity bi dừng lại để chuyển qua activity khác - onStop() – gọi khi activity biến mất khỏi màn hình - onDestroy() – khi activity bị hủy (hủy chủ động hoặc bị hủy bởi hệ thống trong trường hợp hệ điều hành xác nhận thiếu RAM) - onRestart() – khi activity được khởi động lại sau khi đã bị dừng lại Mặc định, Eclipse sẽ tạo sẵn cho bạn hàm onCreate() cho mỗi Activity mới được tạo ra. Thơng thường người lập trình sẽ viết code liên quan đến khởi tạo giao diện đồ họa trong thân hàm này. Vịng đời của một Activity được mơ tả trong sơ đồ dưới đây: 51
  52. Phát triển ứng dụng cho thiết bị di động Hồ Thị Thảo Trang Hình . Vịng đời của một Activity Để hiểu rõ hơn vịng đời của một Activity, chúng ta viết một Activity đơn giản, nạp chồng tất cả cả các hàm sự kiện kể trên và ghi ra log tương ứng: public class Activity101Activity extends Activity { String tag = "Lifecycle"; / Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // hides the title bar requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.main); Log.d(tag, "In the onCreate() event"); } public void onStart() { super.onStart(); Log.d(tag, "In the onStart() event"); } 52
  53. Phát triển ứng dụng cho thiết bị di động Hồ Thị Thảo Trang public void onRestart() { super.onRestart(); Log.d(tag, "In the onRestart() event"); } public void onResume() { super.onResume(); Log.d(tag, "In the onResume() event"); } public void onPause() { super.onPause(); Log.d(tag, "In the onPause() event"); } public void onStop() { super.onStop(); Log.d(tag, "In the onStop() event"); } public void onDestroy() { super.onDestroy(); Log.d(tag, "In the onDestroy() event"); } } Chạy ứng dụng trên thiết bị Android, thực hiện các thao tác bấm phím Home, Back, mở activity khác và theo dõi thứ tự của các sự kiện trên trong cửa sổ LogCat sẽ cho bạn khái niệm chắc chắn nhất về vịng đời của các Activity. Phần này coi như bài tập. Cửa sổ hộp thoại (Dialog) Trong rất nhiều trường hợp chúng ta cần hiển thị thơng báo, hỏi xác nhận của người dùng, hiển thị trạng thái chờ ở dạng hộp thoại nhanh hiện lên trên Activity hiện tại, mà khơng cần mở ra Activity mới, khi đĩ ta cần nạp chồng hàm onCreateDialog của của lớp cơ sở android.app.Activity. Ví dụ dưới đây mơ tả cách tạo một hộp thoại cơ bản như vậy: 1. Tạo project mới trong Eclipse, đặt tên là Dialog 2. Thêm một nút bấm vào file main.xml: 53
  54. Phát triển ứng dụng cho thiết bị di động Hồ Thị Thảo Trang 3. Để ý tham số android:onClick="onClick" của nút bấm btn_dialog, tham số này chỉ ra rằng bạn cần khai váo một phương thức tên là onClick trong Activity để xử lý sự kiện khi nút bấm này được chọn. 4. Thêm code sau vào DialogActivity.java: public class DialogActivity extends Activity { CharSequence[] items = { "Google", "Apple", "Microsoft" }; boolean[] itemsChecked = new boolean [items.length]; ProgressDialog progressDialog; / Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } public void onClick(View v) { showDialog(0); } @Override protected Dialog onCreateDialog(int id) { switch (id) { case 0: return new AlertDialog.Builder(this) .setIcon(R.drawable.ic_launcher) .setTitle("This is a dialog with some simple text ") .setPositiveButton("OK", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { Toast.makeText(getBaseContext(), "OK clicked!", Toast.LENGTH_SHORT).show(); } }) .setNegativeButton("Cancel", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { Toast.makeText(getBaseContext(), "Cancel clicked!", Toast.LENGTH_SHORT).show(); } }) .setMultiChoiceItems(items, itemsChecked, new DialogInterface.OnMultiChoiceClickListener() { public void onClick(DialogInterface dialog, int which, boolean isChecked) { Toast.makeText(getBaseContext(), items[which] + (isChecked ? " checked!":" unchecked!"), Toast.LENGTH_SHORT).show(); } }).create(); } return null; } } 54
  55. Phát triển ứng dụng cho thiết bị di động Hồ Thị Thảo Trang 5. Chạy ứng dụng và bấm vào nút “Click to display a dialog”, hộp thoại như hình bên dưới sẽ hiện ra: Hình . Hộp thoại Trong ví dụ trên ta đã nạp chồng phương thức onCreateDialog(int id) để hiển thị hộp thoại thì cĩ yêu cầu. Trong Activity cĩ thể hiển thị nhiều hộp thoại khác nhau tùy vào ngữ cảnh xử lý như hộp thoại thơng báo, hộp thoại xác nhận, hộp thoại tiến trình , tham số id trong phương thức onCreateDialog là để phân biệt hộp thoại nào cần được hiện lên. Để kích hoạt yêu cầu mở hộp thoại, ta gọi phương thức showDialog(0); phương thức này được gọi khi ta bấm vào nút bấm “Click to display a dialog”, Trong hàm onCreateDialog, tùy thuộc vào id truyền vào mà ta hiển thị hộp thoại tương ứng, trong ví dụ trên là hộp thoại cĩ id = 0. Trong trường hợp này ta sử dụng loại hộp thoại đơn giản nhất là AlertDialog. Để tạo ra một hộp thoại loại này, ta tạo ra một object của class AlertDialog.Builder và gọi phương thức create() của nĩ. Đoạn code trên thiết lập 2 nút bấm cho hộp thoại cho trường hợp đồng ý (nút “OK” – setPositiveButton) và hủy bỏ (nút “Cancel” – setNegativeButton), cũng như thiết lập các ơ checkbox (setMultiChoiceItems). 55
  56. Phát triển ứng dụng cho thiết bị di động Hồ Thị Thảo Trang Các hàm xử lý sự kiện trong Dialog trong ví dụ chỉ đơn giản là hiển thị lên màn hình dịng thơng báo dạng text trong một khoảng thời gian ngắn. Dạng thơng báo này trong Android gọi là Toast - là đoạn chữ hiển thị ở giữa, phía dưới màn hình trong khoảng vài giây. Toast thường được dùng để hiển thị các loại thơng báo ngắn, ít quan trọng như thơng báo SMS đã được gửi, thơng báo một tiến trình ngầm đã hồn thành Ta cĩ thể mở tạo thêm các nút bấm khác và hiển thị các hộp thoại khác tương ứng bằng cách truyền id khác nhau cho hàm showDialog(), ví dụ nút bấm 1 – showDialog(0), nút bấm 2 – showDialog(1) Cĩ rất nhiều các loại hộp thoại khác nhau trong hệ điều hành Android như hộp thoại chờ (với biểu tượng “quay quay”) hay hộp thoại thể hiện tiến trình (cĩ thanh tiến trình theo %), thậm chí bạn cĩ thể tạo riêng một bố cục (layout) bằng file .xml cho hộp thoại. Bạn đọc tự tìm hiểu thêm coi như bài tập. Đối tượng Context trong Android Trong Android, rất nhiều phương thức lấy một trong những tham số là một đối tượng của lớp Context. Trong ví dụ trên, hàm dựng của lớp AlertDialog.Builder và hàm Toast.makeText đều nhận tham số kiểu Context. Đối tượng kiểu Context này thường dùng để chỉ ra phạm vi, hay ngữ cảnh của phương thức được gọi và thường trỏ đến ứng dụng hoặc activity hiện tại. Ở ví dụ trên ta thấy đối tượng của lớp AlertDialog.Builder được gọi với tham số this: new AlertDialog.Builder(this). Đối tượng this ở đây là Activity hiện tại (Activity cũng là lớp con cháu của lớp Context), trong khi hàm Toast.makeText nhận tham số Context là getBaseContext() chứ khơng được dùng con trỏ this nữa, bởi vì phương thức này được gọi bên trong đối tượng của lớp DialogInterface.OnClickListener(), con trỏ this ở đây cĩ kiểu OnClickListener chứ khơng phải Activity, nên khơng phải là Context. Vì vậy ta dùng hàm getBaseContext() để lấy Context cơ sở của đối tượng hiện tại, một cách khác cĩ thể sử dụng là dùng DialogActivity.this. 3.2. Intent và việc tương tác giữa các Activity Như đã đề cập ở các phần trên, mỗi ứng dụng Android cĩ thể khơng cĩ, cĩ một hoặc nhiều Activity. Khi ứng dụng cĩ nhiều hơn một Activity thì việc điều hướng từ Activity này sang Activity khác và ngược lại là việc rất cần thiết và được thực hiện rất thường xuyên. Trong Android, việc điều hướng này được thực hiện thơng qua một cơ chế rất đặc thù, gọi là Intent. Sử dụng Intent Trước tiên ta xem xét một ví dụ đơn giản nhất trong việc sử dụng Intent để mở một Activity khác từ Activity hiện tại. Để thực hiện điều này ta tạo một project chứa 2 Activity, trong Activity thứ nhất cĩ một nút bấm, khi bấm vào nút này ta sẽ mở Activity thứ 2. Các bước cụ thể như sau: 1. Tạo project UsingIntent và tạo 2 Activity: UsingIntentActivity (Activity mặc định) và SencondActivity, 2 activity này được khai báo trong AndroidManifest.xml như sau: 56
  57. Phát triển ứng dụng cho thiết bị di động Hồ Thị Thảo Trang 2. Tạo layout riêng cho SecondActivity bằng cách copy file main.xml thành file secondactivity.xml và sửa nội dung TextView như bên dưới. Sau đĩ trong hàm onCreate của SecondActivity, gọi lệnh setContentView(R.layout.secondactivity); để khai báo việc sử dụng file layout này cho SecondActivity. 3. Tạo một nút bấm trong UsingIntentActivity và trong hàm xử lý sự kiện “onClick” của nút bấm này, ta gọi lệnh mở Activity thứ 2 như sau: startActivity(new Intent("net.learn2develop.SecondActivity")); 4. Chạy ứng dụng và bấm vào nút bấm duy nhất trong UsingIntentActivity, ta sẽ thấy SecondActivity được mở ra: 57
  58. Phát triển ứng dụng cho thiết bị di động Hồ Thị Thảo Trang Trong ví vụ trên, ta thấy dịng lệnh để mở ra Activity thứ 2 là startActivity(new Intent("net.learn2develop.SecondActivity"));. Trong tham số của hàm dựng Intent khơng hề chỉ ra tên Class của SecondActivity mà chỉ ra “action” cần thực hiện, khi đĩ hệ điều hành sẽ quét tồn bộ các Activity của tồn bộ các ứng dụng được cài đặt trên thiết bị và lọc ra Activity cĩ khai báo action tương ứng (net.learn2develop.SecondActivity) để mở nĩ. Trong trường hợp của chúng ta, SecondActivity đã được khai báo action này trong phần intent- filter của activity đĩ trong AndroidManifest.xml ( ) nên sẽ được mở ra. Ngồi ra cũng phải chú ý là để activity cĩ thể được mở ra bằng phương thức startActivity như trong ví dụ, thì trong Manifest cũng phải khai báo thêm danh mục (category) android.intent.category.DEFAULT trong phần intent-filter ( ). Trong trường hợp Activity cần mở nằm trong cùng ứng dụng với Activity mở nĩ (như trong ví dụ trên của ta), ta cĩ thể gọi startActivity với Intent tường mình như sau: startActivity(new Intent(this, SecondActivity.class)); Giải quyết “xung đột Intent” Trong ví dụ trên ta thấy để mở một Activity, ta chỉ cần truyền vào action của Activity đĩ. Hệ thống sẽ quét tìm kiếm Activity được khai báo với action như vậy để mở ra. Vậy điều gì sẽ xảy ra nếu cĩ nhiều hơn 1 Activity khai báo với cùng một action như vậy? Chẳng hạn ta khai báo thêm một Activity thứ 3 với cùng intent-filter giống như của SecondActivity: 58
  59. Phát triển ứng dụng cho thiết bị di động Hồ Thị Thảo Trang Và giữ nguyên lời gọi Activity như cũ: startActivity(new Intent("net.learn2develop.SecondActivity")); Khi được gọi đến, hệ thống sẽ hiển thị danh sách các Activity phù hợp theo bộ lọc Intent (trong trường hợp này là 02 Activity) để người dùng chọn. Kèm theo cửa sổ chọn sẽ là checkbox “Use by default for this action”. Nếu bạn chọn checkbox này thì hệ thống sẽ ghi nhớ lựa chọn của bạn và khơng hỏi lại cho các lần sau nữa, nếu khơng cửa sổ chọn Activity cần mở sẽ hiển thị mỗi lần bạn gọi hàm startActivity kể trên. Nếu đã lỡ chọn ghi nhớ lựa chọn mặc định này, bạn cĩ thể xĩa ghi nhớ này bằng cách vào mục Settings của hệ thống, chọn Apps > Manage Applications, sau đĩ chọn ứng dụng đang dùng (UsingIntent) và chọn nút “Clear defaults” ở phía cuối màn hình. Hình ảnh dưới đây minh họa các trương hợp vừa kể ra: Các ứng dụng mặc định sẵn cĩ của hệ điều hành Android cũng được mở ra bằng cơ chế Intent với các bộ lọc như vậy. Cơ chế này làm hệ điều hành Android trở nên vơ cùng mềm dẻo: mọi thành phần của hệ điều hành đều được đối xử như nhau và đều cĩ khả năng “thay thế” được. Ví dụ bạn cĩ thể viết một ứng dụng sử lý tin nhắn SMS thay cho ứng dụng Message mặc định bằng cách khai báo action cho Activity của bạn trùng với action của ứng dụng tin nhắn mặc định. (các intent action này được mơ tả rất đầy đủ trong các tài liệu tham chiếu của Google). Khi đĩ, khi cĩ yêu cầu gửi tin nhắn từ một ứng dụng bất kỳ, hệ thống sẽ liệt kê ra các ứng dụng cĩ khả năng xử lý yêu cầu này cho người dùng lựa chọn, bao gồm ứng dụng tin nhắn mặc định và ứng dụng bạn mới viết. Lấy kết quả trả về từ Activity thơng qua Intent Trong rất nhiều trường hợp, ta mở Activty mới với mục đích yêu cầu thêm dữ liệu từ người dùng, như yêu cầu người dùng nhập vào tên truy cập và mật khẩu Trong trường hợp đĩ, 59
  60. Phát triển ứng dụng cho thiết bị di động Hồ Thị Thảo Trang sau khi người dùng kết thúc nhập liệu và quay trở lại Activity trước đĩ, dữ liệu người dùng vừa nhập vào cần phải được truyền về Activity ban đầu để xử lý. Để làm được điều này, trong Activty thứ nhất (UsingIntentActivity ở trên) thay vì mở Activity thứ 2 (SecondActivity) bằng phương thức startActivity, ta cần gọi phương thức startActivityForResult và khai báo thêm phương thức onActivityResult để hứng sự kiện khi SecondActivity đĩng lại và trả về dữ liệu cho nĩ. Bên cạnh đĩ trong SecondActivity cũng phải chứa đoạn mã trả về dữ liệu người dùng nhập vào thơng qua Intent. Để minh họa cho quá trình trên, ta thực hiện các bước sau: 1. Trong SecondActivity, thêm một ơ nhập liệu và một nút bấm như sau: 2. Trong hàm xử lý sự kiện click của nút OK của SecondActivity, ta thêm đoạn code trả về dữ liệu cho Activity gốc (Activity gọi nĩ, trong ví dụ là UsingIntentActivity) trước khi đĩng lại: Intent data = new Intent(); // get the EditText view EditText txt_username = (EditText) findViewById(R.id.txt_username); 60
  61. Phát triển ứng dụng cho thiết bị di động Hồ Thị Thảo Trang // set the data to pass back data.setData(Uri.parse(txt_username.getText().toString())); setResult(RESULT_OK, data); // closes the activity— finish(); 3. Trong UsingIntentActivity, thay vì mở SecondActivity bằng phương thức startActivity, ta dùng startActivityForResult kèm theo một mã request tự quy định (chọn = 1 chẳng hạn): startActivityForResult(new Intent("net.learn2develop.SecondActivity"), 1); 4. Và khai báo nạp chồng hàm hứng sự kiện Activity trả kết quả về (onActivityResult): @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == 1) { if (resultCode == RESULT_OK) { Toast.makeText(this,data.getData().toString(), Toast.LENGTH_SHORT).show(); } } } 5. Khi nhận được kết quả (dạng chuỗi) từ SecondActivity, với mục đích minh họa, ta chỉ hiển thị text này lên màn hình dưới dạng Toast message. Kết quả thu được khi chạy ứng dụng sẽ như hình bên dưới: 61
  62. Phát triển ứng dụng cho thiết bị di động Hồ Thị Thảo Trang Truyền dữ liệu giữa các Activity với Intent Ngồi việc lấy dữ liệu trả về của Activity, một thao tác phổ biến khác là truyền dữ liệu cho Activity mới được mở ra. Ví dụ trong trường hợp trên, khi gọi mở SecondActivity ta cĩ thể truyền sẵn chuỗi mặc định cần hiển thị sẵn trong ơ nhập liệu trong Activity này. Để làm được điều này, trong UsingIntentActivity, trước khi gọi startActivity, ta gắn dữ liệu cần truyền vào đối tượng Intent dùng để mở SecondActivity bằng phương thức putExtra của đối tượng Intent như sau: Intent i = new Intent("net.learn2develop.PassingDataSecondActivity"); // use putExtra() to add new key/value pairs i.putExtra("str1", "This is a string"); i.putExtra("age1", 25); // use a Bundle object to add new key/values pairs Bundle extras = new Bundle(); extras.putString("str2", "This is another string"); extras.putInt("age2", 35); // attach the Bundle object to the Intent object i.putExtras(extras); // start the activity startActivityForResult(i); 62
  63. Phát triển ứng dụng cho thiết bị di động Hồ Thị Thảo Trang Khi đĩ, trong hàm onCreate của SecondActivity, ta cĩ thể lấy dữ liệu được truyền sang bằng cách lấy Intent qua hàm getIntent() và lần lượt lấy ra các trường dữ liệu tương ứng bằng các phương thức getStringExtra, getIntExtra, getExtras như sau: // get the data passed in using getStringExtra() Toast.makeText(this,getIntent().getStringExtra("str1"), Toast.LENGTH_SHORT).show(); // get the data passed in using getIntExtra() Toast.makeText(this,Integer.toString(getIntent().getIntExtra("age1", 0)), Toast.LENGTH_SHORT).show(); // get the Bundle object passed in Bundle bundle = getIntent().getExtras(); // get the data using the getString() Toast.makeText(this, bundle.getString("str2"), Toast.LENGTH_SHORT).show(); // get the data using the getInt() method Toast.makeText(this,Integer.toString(bundle.getInt("age2")),Toast.LENGTH_SHOR T).show(); Sử dụng Intent để gọi các ứng dụng sẵn cĩ của hệ điều hành Như đã nĩi ở trên, các ứng dụng mặc định sẵn cĩ của hệ điều hành Android cũng được mở ra bằng cơ chế Intent như các ứng dụng thơng thường. Từ ứng dụng của mình, bạn cĩ thể dùng Intent để mở trình duyệt với một website bạn chọn, hay mở ứng dụng gửi tin nhắn với số điện thoại và nội dung tin nhắn chọn sẵn . Phần này sẽ đưa ra vài trường hợp cụ thể sử dụng Intent trong các việc như vậy. Mở trình duyệt web: Intent i = new Intent("android.intent.action.VIEW"); i.setData(Uri.parse(" ")); startActivity(i); Kết quả: 63
  64. Phát triển ứng dụng cho thiết bị di động Hồ Thị Thảo Trang Mở ứng dụng gọi điện thoại: Intent i = new Intent(android.content.Intent.ACTION_DIAL, Uri.parse("tel:+651234567")); startActivity(i); 64
  65. Phát triển ứng dụng cho thiết bị di động Hồ Thị Thảo Trang Mở ứng dụng bản đồ và điều hướng đến vị trí nhất định: Intent i = new Intent(android.content.Intent.ACTION_VIEW, Uri.parse("geo:37.827500,-122.481670")); startActivity(i); 65
  66. Phát triển ứng dụng cho thiết bị di động Hồ Thị Thảo Trang 0 Đối tượng Intent Ở các ví dụ trên ta đã xem qua một số cách sử dụng Intent khác nhau, phần này sẽ tổng hợp lại mơ tả chi tiết hơn về đối tượng Intent. Mỗi đối tượng Intent (Intent Object) cĩ thể chứa các thơng tin sau: - Action (hành động) - Data (dữ liệu) - Type (loại) - Category (danh mục) Trong ví dụ trên, ta đã thấy để mở Activity khác, ta cần truyền Action của activity đĩ trong hàm dựng của đối tượng Intent như sau: startActivity(newIntent(“net.learn2develop.SecondActivity”)); Action ở đây ( “net.learn2develop.SecondActivity”) cịn được gọi là “component name”. Trong trường hợp Activity cần mở nằm cùng project với Activity hiện tại, ta cĩ thể gọi như sau: startActivity(newIntent(this, SecondActivity.class)); Activity cũng cĩ thể được gọi bằng cách truyền Action và dữ liệu (Data) kèm theo như trong trường hợp mở trình duyệt ở trên: Intent i = new Intent(android.content.Intent.ACTION_VIEW, Uri.parse(“ ”)); startActivity(i); 66
  67. Phát triển ứng dụng cho thiết bị di động Hồ Thị Thảo Trang Phần “hành động” mơ tả việc chúng ta cần làm, cịn phần “dữ liệu” chứa thơng tin cần thiết cho Activity sắp được mở ra xử lý. Trong ví dụ trên, ta tạo Intent với yêu cầu cần hiển thị thơng tin, với dữ liệu đi kèm là url đến một website. Hệ thống Android sẽ lọc trong tất cả ứng dụng đã được cài đặt trên hệ thống và liệt kê ra các ứng dụng cĩ thể xử lý được Intent này để người dùng lựa chọn. Intent trên cũng cĩ thể được gọi tường minh hơn như sau: Intent i = new Intent(“android.intent.action.VIEW”); i.setData(Uri.parse(“ ”)); Một số Intent khơng cần truyền theo dữ liệu cụ thể, mà chỉ cần truyền theo loại dữ liệu, ví dụ lấy một bản ghi trong danh sách danh bạ, ta cĩ thể dùng Intent như sau: Intent i = new Intent(android.content.Intent.ACTION_PICK); i.setType(ContactsContract.Contacts.CONTENT_TYPE); Hàm setType()method chỉ ra loại dữ liệu (MIME data type) của thơng tin trả về cho activity hiện tại. MIME type của ContactsContract.Contacts.CONTENT_TYPE là xâu “vnd.android.cursor.dir/contact”. Ngồi hành động, dữ liệu và loại dữ liệu, mỗi đối tượng Intent cĩ thể cĩ thêm tham số “danh mục” (category) dùng để nhĩm các Activity lại theo danh mục nhằm thuận tiện cho việc lọc các Activity theo nhu cầu của ứng dụng. Các bạn cĩ thể tìm hiểu kỹ hơn về bộ lọc Activity ở các tài liệu khác. Phần này coi như bài tập. 3.3. Fragment Trong phần trước ta đã tìm hiểu qua Activty là giao diện của một “màn hình” ứng dụng, mỗi màn hình chỉ chứa 01 Activity. Tuy nhiên khi các máy tính bảng ra đời với màn hình lớn hơn rất nhiều so với điện thoại truyền thống, cho phép thiết kế với nhiều loại view khác nhau, và phát sinh nhu cầu dùng lại các view này trên các màn hình khác nhau (điện thoại và máy tính bảng). Khái niệm fragment được sinh ra nhằm phục vụ nhu cầu đĩ. Cĩ thể hiểu fragment như các “tiểu Activity”, chứa tập hợp các view khác bên trong nĩ. Fragment luơn luơn được chứa trong một Activity hoặc fragment khác, mỗi Activity cĩ thể chứa một hoặc nhiều fragment . Một ví dụ điển hình của việc sử dụng fragment là trường hợp thiết kế “master-detail”, bao gồm 2 view: view tổng quan chứa danh sách các đối tượng (danh sách tiêu đề các bài báo chẳng hạn), và view chi tiết, hiển thị nội dung của đối tượng (bài báo) đang được chọn. Mỗi view như vậy được đặt trong 1 fragement. Trên màn hình điện thoại, do kích thước hạn chế, 2 fragement này sẽ nằm trong 2 activity khác nhau, trong khi đối với màn hình máy tính bảng, 2 fragment này nằm trên cùng một Activity (xem hình dưới). Thiết kế này giúp việc dùng lại code được tối đa, mội logic của ứng dụng nằm trong 2 fragment, được dùng lại cho cả điện thoại và máy tính bảng, cịn Activity chỉ là vỏ chứa tối thiểu mã nguồn. Khái niệm fragment mới được đưa vào từ phiên bản Android 3.0 HoneyComb, tuy nhiên tính năng này cũng được Google bổ sung cho các API thấp hơn (từ Level 4) thơng qua thư viện hỗ trợ Android Support Library v4. 67
  68. Phát triển ứng dụng cho thiết bị di động Hồ Thị Thảo Trang 1. Tạo project mới, đặt tên là Fragments 2. Tạo file fragment1.xml trong res/layout, đây là file chứa mơ tả giao diện của fragment thứ nhất, với nội dung như sau: 3. Tạo file fragment2.xml trong res/layout, đây là file chứa mơ tả giao diện của fragment thứ hai, với nội dung như sau: <LinearLayout xmlns:android=" " 68