Khóa luận Tìm hiểu hệ điều hành android và xây dựng ứng dụng minh họa
MỤC LỤC
MỤC LỤC . 3
DANH MỤC CÁC HÌNH . 9
Phụ lục A Cuộc thăm dò hệ điều hành Android khuấy động thị trường
smart phone 19
Phụ lục B Những thống kê thú vị về Google Android trong những năm gần
đây (theo iTech.vn ngày 25/01/2010).24
B.1 Những thống kê từ Google . 24
B.2 Những thông tin đáng chú ý . 26
B.3 Báo cáo của Admob . 26
B.4 Báo cáo của Myxer . 28
Phụ lục C Danh sách các công ty trong Hiệp hội các thiết bị cầm tay mở .29
Phụ lục D Các smart phone dùng hệ điều hành Android .32
Phụ lục E So sánh các hệ điều hành hiện có trên smart phone .35
Phụ lục F Hai HĐH smartphone Android và iPhone tăng trưởng nhanh
nhất 39
Phụ lục G Lập trình trên Android .41
G.1 Tổng quan Android . 41
G.1.1 Định nghĩa Android . 41
G.1.2 Tính năng và kiến trúc Android . 41
G.2 Giới thiệu Java SE JDK, Android SDK , ADT, Eclipse và các bước cài đặt
44
G.2.1 Giới thiệu Java SE JDK, Android SDK, ADT, DDMS, Eclipse và mối
liên hệ giữa chúng . 44
G.2.2 Các bước cài đặt để lập trình Android . 50
G.2.3 Các điều lưu ý sau khi cài đặt . 64
G.3 Bước đầu làm quen với Android qua project HelloNhatTrungApp . 67
4
G.3.1 Các bước tạo project HelloNhatTrungApp . 67
G.3.2 Cấu trúc của một project Android . 85
G.4 Làm quen với các khung nhìn trên Eclipse qua cái nhìn trên Android
project . 87
G.4.1 Khung nhìn Java . 87
G.4.2 Khung nhìn DDMS . 99
G.4.3 Tìm hiểu Debug . 104
G.5 Làm quen với nền tảng ứng dụng Android . 108
G.5.1 Các thành phần ứng dụng . 109
G.5.2 Activities và Tasks . 114
G.5.3 Tiến trình và luồng . 115
G.5.4 Vòng đời các thành phần ứng dụng Android . 115
G.6 Làm quen với các công cụ hỗ trợ sẵn có của Android SDK . 125
G.6.1 Android Development Tools Plugin (ADT) . 125
G.6.2 Dalvik Debug Monitor Service (DDMS) . 126
G.6.3 Hierarchy Viewer . 128
G.6.4 Draw 9-patch . 130
G.6.5 Android Debug Bridge (ADB) . 134
G.6.6 Các công cụ hỗ trợ khác . 136
Phụ lục H Các vấn đề cơ bản trong lập trình Android . 137
H.1 Các vấn đề và khái niệm cơ bản trong lập trình giao diện . 137
H.1.1 Giới thiệu lập trình giao diện trên Android và các tính năng của nó 137
H.1.2 Các từ khóa thường gặp trong lập trình giao diện . 141
H.1.3 Các đơn vị tính trên giao diện . 142
H.1.4 Các thuộc tính thường gặp trên các View . 143
H.1.5 Tổng quát các View dưới cái nhìn hướng đối tượng . 144
H.1.6 Cách thức xây dựng và thiết kế giao diện . 149
H.1.7 Cách thao tác control trên Java code . 152
H.2 Lập trình với giao diện cơ bản . 153
5
H.2.1 Các điều khiển chứa điều khiển khác (layout) . 153
H.2.2 Các điều khiển thông dụng . 164
H.3 Các chú ý khi lập trình giao diện . 166
Phụ lục I Lập trình theo từng chủ đề . 167
I.1 Lập trình giao diện tùy biến với Adapter . 167
I.1.1 Giới thiệu sơ lược BaseAdapter và các lớp con của nó . 167
I.1.2 Dùng Adapter trên Spinner . 168
I.1.3 Dùng Adapter trên Gallery. 170
I.1.4 Dùng Adapter trên ListView cơ bản . 173
I.1.5 Dùng Adapter trên ListView nâng cao . 175
I.1.6 Dùng Adapter trên GridView cơ bản . 177
I.1.7 Dùng Adapter trên GridView nâng cao . 179
I.1.8 Kinh nghiệm lập trình với Adapter . 182
I.2 Lập trình với hoạt cảnh chuyển động (Animation). 183
I.2.1 Giới thiệu lập trình với Animation . 183
I.2.2 Lập trình với TweenAnimation . 184
I.2.3 Lập trình với FrameByFrameAnimation . 189
I.3 Lập trình với Media. 191
I.3.1 Giới thiệu . 191
I.3.2 Lập trình phát âm thanh trên Android . 193
I.3.3 Lập trình phát Video trên Android . 193
I.3.4 Nhận xét . 194
I.4 Lập trình với thao tác Telephony . 195
I.4.1 Giới thiệu . 195
I.4.2 Thực hiện gọi điện thoại tới một số cho trước . 195
I.4.3 Thực hiện gửi tin nhắn SMS . 197
I.4.4 Thực hiện chức năng rung điện thoại . 198
I.5 Lập trình với luồng (Thread) . 198
I.5.1 Giới thiệu luồng . 198
6
I.5.2 Các đặc tính và cách thức vận hành luồng . 199
I.5.3 Lập trình luồng . 200
I.6 Lập trình với thực đơn (Menu) . 202
I.6.1 Giới thiệu thực đơn . 202
I.6.2 Cách thức lập trình . 203
I.6.3 Nhận xét . 212
I.7 Lập trình với kiểu chữ (Font) . 212
I.7.1 Giới thiệu . 212
I.7.2 Cách lập trình . 213
I.7.3 Nhận xét . 214
I.8 Lập trình với khung thoại (Dialog) . 214
I.8.1 Giới thiệu . 214
I.8.2 Cách thức lập trình . 215
I.9 Lập trình với nhập xuất tập tin. 220
I.9.1 Giới thiệu . 220
I.9.2 Preferences . 221
I.9.3 Files . 222
I.9.4 Databases . 226
I.9.5 Network. 231
I.10 Lập trình với MapView . 233
I.10.1 Giới thiệu . 233
I.10.2 Cách thức lập trình . 235
I.10.3 Nhận xét . 239
I.11 Lập trình thao tác WebKit . 239
I.11.1 Giới thiệu . 239
I.11.2 Cách thức lập trình . 240
I.11.3 Nhận xét . 241
I.12 Lập trình với các widget khác . 241
I.12.1 Widget Date/Time . 241
7
I.12.2 Widget Tab . 242
Phụ lục J Lập trình với EndlessList . 245
J.1 Giới thiệu . 245
J.2 Cách thức tạo EndlessList . 246
J.2.1 Cách thức vận hành của EndlessList: . 246
J.2.2 Cách thức lập trình tạo EndlessList . 247
J.3 Nhận xét . 250
Phụ lục K Cấu trúc và ý nghĩa các thành phần của một project Android . 251
Phụ lục L Hướng dẫn sử dụng, thao tác chính trên chương trình
eSaleShopping . 253
L.1 Sơ đồ liên kết các màn hình chức năng trong ứng dụng eSaleShopping . 253
L.2 Giới thiệu chức năng của màn hình chính . 254
L.2.1 Các chức năng trên màn hình chính . 254
L.2.2 Thực đơn (menu) chức năng của màn hình chính . 255
L.3 Thao tác trên màn hình chụp mã vạch . 256
L.3.1 Sử dụng chức năng chụp mã vạch . 256
L.3.2 Các chức năng thực hiện sau khi chụp được mã vạch hàng hóa . 259
L.4 Thao tác trên màn hình tìm theo danh mục hàng hóa . 262
L.5 Thao tác trên màn hình tìm theo chuỗi . 264
L.6 Thao tác trên màn hình tìm theo hệ thống siêu thị . 265
L.6.1 Thao tác chính. 265
L.6.2 Thao tác trên các chức năng trên một siêu thị được chọn . 267
L.6.3 Tìm hàng hóa siêu thị theo chuỗi . 269
L.6.4 Tìm hàng hóa siêu thị theo mã vạch . 269
L.6.5 Tìm hàng hóa siêu thị theo danh mục . 270
L.7 Thao tác quản lý danh sách hàng hóa ưa thích . 270
L.8 Thao tác quản lý danh sách hàng hóa cần mua . 271
L.8.1 Thao tác thêm hàng cần mua . 272
8
L.8.2 Thao tác xóa hàng cần mua . 272
L.8.3 Thao tác gửi tin nhắn hàng cần mua . 273
Phụ lục M Các cấu trúc, mã lệnh, ứng dụng tham khảo được sử dụng
trong ứng dụng eSaleShopping . 275
M.1 Bộ gõ Tiếng Việt IME . 275
M.2 Chụp mã vạch hàng hóa (barcode). 276
M.3 Ứng dụng bản đồ và vị trí . 279
M.3.1 Các tham số Google Map hỗ trợ tìm kiếm đường đi . 279
M.3.2 Thể hiện đường đi trên bản đồ Google Map . 280
M.3.3 Cách thức tìm vị trí thiết bị thông qua GPS hoặc mạng . 281
M.4 Ứng dụng EndlessList . 282
M.4.1 Giải pháp của M.Murphy . 282
M.4.2 Giải pháp của Evan Charlton . 283
M.5 Mã nguồn android-misc-widgets . 284
M.5.1 Hiệu ứng hoạt cảnh . 285
M.5.2 Các widget mới . 285
việc áp dụng project ZXing này vào ứng dụng cũng là một khó khăn không nhỏ do toàn bộ mã nguồn được công bố hết sức “đồ sộ”. Để nắm bắt và ứng dụng được bộ mã nguồn này thì lượng thời gian bỏ ra để tìm hiểu là không nhỏ. Sau một hồi lần tìm giải pháp trên mạng, nhóm chúng tôi cũng tìm được một giải pháp thay thế đó chính là nhờ chương trình Barcode Scanner chụp phân giải mã vạch và trả kết quả về cho 278 ứng dụng eSaleShopping. Barcode Scanner cũng do nhóm ZXing phát triển (địa chỉ tải về ứng dụng Việc gọi thực thi Barcode Scanner để lấy kết quả mã vạch được thực hiện thông qua gọi Intent cũng được nhóm ZXing hướng dẫn cụ thể tại: public Button.OnClickListener mScan = new Button.OnClickListener() { public void onClick(View v) { Intent intent = new Intent("com.google.zxing.client.android.SCAN"); intent.putExtra("SCAN_MODE", "QR_CODE_MODE"); startActivityForResult(intent, 0); } }; public void onActivityResult(int requestCode, int resultCode, Intent intent) { if (requestCode == 0) { if (resultCode == RESULT_OK) { String contents = intent.getStringExtra("SCAN_RESULT"); String format = intent.getStringExtra("SCAN_RESULT_FORMAT"); // Handle successful scan } else if (resultCode == RESULT_CANCELED) { // Handle cancel } } } Để tiện dụng hơn, nhóm chúng tôi đã dùng lớp IntentIntegrator.java và lớp IntentResult.java (các lớp này được tiết kế bởi các tác giả: Sean Owen, Fred Lin, Isaac Potoczny-Jones) để thực hiện việc gọi Intent kích hoạt chương trình Barcode Scanner chụp ảnh mã vạch và yêu cầu lấy kết quả trả về thông qua các phương thức initiateScan(…) và parseActivityResult(…) trên các Activity gọi và nhận kết quả từ chương trình Barcode Scanner. Cách gọi ứng dụng Barcode Scanner trên Activity ManHinhTimTheoMaVach: việc gọi Intent được thực hiện thông qua sự kiện nhấn nút “Đọc Mã Vạch” // button chụp barcode btnReadBarcode.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { IntentIntegrator.initiateScan(ManHinhTimTheoMaVach.this); IntentIntegrator.initiateScan(ManHinhTimTheoMaVach.this, 279 "Thông Báo", "Đồng ý tải về chương trình Barcode Scanner không?", "Đồng Ý", "Không"); } }); Cách thức lấy kết quả trả về từ ứng dụng Barcode Scanner: protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { case IntentIntegrator.REQUEST_CODE: { if (resultCode != RESULT_CANCELED) { IntentResult scanResult = IntentIntegrator.parseActivityResult( requestCode, resultCode, data); if (scanResult != null) { String upc = scanResult.getContents(); TextView txtBarcodeResult = (TextView) findViewById(R.id.TextViewBarcodeResult); txtBarcodeResult.setText("" + upc); // . . . break; } } Một điểm thú vị của 2 lớp IntentIntegrator.java và lớp IntentResult.java là khi điện thoại không có sẵn chương trình đọc mã vạch là Barcode Scanner thì sẽ xuất hiện thông báo và hỏi người dùng có muốn tải về ứng dụng Barcode Scanner hay không. Nếu đồng ý tải về thì chương trình sẽ tìm kiếm ứng dụng Barcode Scanner thông qua Android Market để tiến hành tải và cài đặt ứng dụng. Nhóm chúng tôi rất hoan nghênh và cám ơn cộng đồng mã nguồn mở cũng như các nhà lập trình đã phát triển và cung cấp những ứng dụng, project thật sự hay và có chất lượng như bộ mã mở ZXing như đã đề cập ở trên. M.3 Ứng dụng bản đồ và vị trí M.3.1 Các tham số Google Map hỗ trợ tìm kiếm đường đi 280 Việc Google mở rộng hỗ trợ chỉ đường đi cho Việt Nam là một điều thuận lợi cho nhóm tích hợp phần chỉ đường đi này vào bản đồ và chỉ ra đường đi tới siêu thị gần nhất. Thông tin yêu cầu đường đi sẽ được gửi lên Google với các tham số theo quy định ( Sau khi tính toán lộ trình đường đi, Google sẽ trả ra kết quả là một tập tin KML có cấu trúc dạng các thẻ XML. Ta chỉ việc phân tích thông tin từ tập tin này để có được hướng dẫn chỉ đường đi từ Google. Sau đây là ví dụ mẫu về yêu cầu tìm đường đi từ 2 điểm có kinh độ và vĩ độ biết trước và gửi yêu cầu lên Google tìm đường đi giữa 2 điểm ấy: 848731,106.773877&ie=UTF8&0&om=0&output=kml. Với saddr là thông tin kinh độ, vĩ độ của điểm xuất phát; dsddr là thông tin kinh độ, vĩ độ của điểm cần đến. Nội dung của một tập tin KML được trả về từ Google <kml xmlns="">Nguyễn Trãi to Unknown road<Style id="roadStyle">7fcf00646</LineSt yle><a href=" r=10.848731,106.773877&ie=UTF8&om=0">Printable view]]>Head east on Nguyễn Trãi toward Nguyen Bieu<![CDATA[go 0.2 km]]>Nguyễn Trãinormal<h ref> <hotSpot x="0.500000" y="0.000000" xunits="fraction" yunits="fraction" /> ALL/mapfiles/kml/paddle/go-lv.png . . . M.3.2 Thể hiện đường đi trên bản đồ Google Map Nhóm đã tham khảo và áp dụng bài viết chỉ dẫn vẽ đường đi lên bản đồ GoogleMap là: Android - Driving Direction (Route Path) tại địa chỉ tw.blogspot.com/2009/06/android-driving-direction-route-path.html để hiện thực hóa chức năng chỉ đường đi đến siêu thị. 281 Hình phụ lục 214 Ứng dụng vẽ đường đi trên bản đồ Google Map trong eSaleShopping Nhóm đã tham khảo 2 lớp là Direction.java (truyền tham số lên Google) và MyOverlay.java (vẽ đường đi trên bản đồ) để áp dụng vào ứng dụng eSaleShopping. Bên cạnh tham khảo 2 lớp này, nhóm đã tiến hành xử lý lại thuật toán đọc tập tin KML để có thể lấy về cũng như tính toán ra đường đi ngắn nhất đến một siêu thị gần nhất. M.3.3 Cách thức tìm vị trí thiết bị thông qua GPS hoặc mạng Để chương trình có thể xác định được vị trí hiện tại nhóm đã tham khảo bài viết “Android Examples - Using Location API”, được viết bởi tác giả Marko Gargenta tại địa chỉ và mã nguồn tham khảo của bài viết tại địa chỉ Đồng thời nhóm cũng có tham khảo bài viết của thành viên có nickname là jagtap.jj1 trên diễn đàn anddev.org với phần bài viết là “app with GPS-enable but the device is indoor” ( enable_but_the_device_is_indoor-t8997.html) để tham khảo 2 phương: 282 startLocationReceiving(), stopLocationReceiving() cho việc khởi động hay dừng các thiết bị nhận tín hiệu xác định vị trí hiện tại. M.4 Ứng dụng EndlessList Khái niệm EndlessList đã được chúng tôi trình bày trong phụ lục J. Ở phần này chúng tôi chỉ trình bày 2 giải pháp tiêu biểu mà chúng tôi có dịp tham khảo và áp dụng vào ứng dụng eSaleShopping. M.4.1 Giải pháp của M.Murphy Mark Murphy hiện làm việc cho Commons Ware, email liên hệ: mmurphy@commonsware.com Tác giả có cung cấp sẵn mã nguồn cũng như hướng dẫn sử dụng project CWAC EndlessAdapter tại địa chỉ Nhóm đã có dịp dùng và ứng dụng EndlessAdapter của M.Murphy vào bài toán EndlessList. Việc ứng dụng EndlessList vào tuy đã giải quyết được vấn dề của EndlessList nhưng bên cạnh đó EndlessAdapter còn tồn tại một lỗi nhỏ đó là vòng tròn xoay thể hiện tiến trình download dữ liệu mới từ server để gắn thêm vào ListView hiển thị bị lỗi. Chúng hiển thị không có kiểm soát trên màn hình ListView. Do mã nguồn của ứng dụng được tác giả đóng gói thành một tập tin .jar nên nhóm chúng tôi không thể hiệu chỉnh lại lỗi này nên đã tiến hành tìm kiếm giải pháp khác cho vấn đề EndlessList. Hình bên dưới thể hiện ứng dụng chạy của EndlessAdapter và bug lỗi của nó. 283 Hình phụ lục 215 Hình minh họa và bug lỗi cũa EndlessAdapter M.4.2 Giải pháp của Evan Charlton Tác giả Evan Charlton hiện là sinh viên năm 4 của học viện công nghệ Rochester ( Trong bài viết công bố trên mạng của tác giả ( nhóm thấy đây là một nguồn tham khảo rất hữu ích. Ứng dụng Magnatune ( của tác giả không những giải quyết rất tốt vấn đề của EndlessList đồng thời cũng có cách giải quyết việc download hình ảnh minh họa về máy một cách linh hoạt và uyển chuyển. Ứng dụng Magnatune sẽ tải về máy thông tin (chuỗi ký tự) tên các bài hát, album, thông tin nhạc sĩ ca sĩ từ server về hiển thị trước trên ListView và hình ảnh sẽ được download về tại thẻ nhớ và khi download được hình nào thì sẽ hiển thị lên trên ListView ngay sau đó như hình minh họa bên dưới. Nhóm chúng tôi đã dùng lại các hàm thiết kế của tác giả để phục vụ cho ứng dụng eSaleShopping là: 284 Dùng lại các lớp HTTPQueue.java, HTTPThread.java, RemoteImageView.java: phục vụ cho việc chạy ngầm tải hình ảnh từ server về dưới dạng danh sách hàng đợi dùng Thread. Hiệu chỉnh lớp MagnatuneAPI.java nhưng có chỉnh sửa lại cho phù hợp để phục vụ việc lưu vết thư mục tạm lưu trữ hình ảnh từ server về. Hiệu chỉnh lớp LazyAdapter.java phục vụ hiển thị một item trên ListView. Hiệu chỉnh lớp LazyActivity.java, đây là lớp mà nhóm tham khảo kỹ nhất và thực hiện viết lại một số tính năng cho phù hợp vì trong lớp này chứa giải pháp giải quyết vấn đề của EndlessList cực kỳ hiệu quả đó là dùng Task không đồng bộ. Vấn đề dùng Task không đồng bộ đã được nhóm trình bày tại phụ lục J. Hình phụ lục 216 Hình minh họa của ứng dụng Magnatune M.5 Mã nguồn android-misc-widgets Đây là một project được viết bởi tác giả có nickname là pskink ( được đăng tải trên Google Code tại địa chỉ 285 Đây là một project chứa một loạt các hiệu ứng chuyển động (animation) và widget mới rất tiện dụng và hữu ích. Nhóm chúng tôi đã áp dụng một số lớp, thiết kế trong projec android-misc-widget để làm phong phú thêm cho ứng dụng eSaleShopping. M.5.1 Hiệu ứng hoạt cảnh Nhóm chúng tôi đã dùng lại hết các lớp tạo hiệu ứng chuyển động vào ứng dụng eSaleShopping. Đó là các ứng với hình minh họa bên dưới. Hình phụ lục 217 Các lớp tạo hiệu ứng chuyển động được dùng lại trong ứng dụng eSaleShopping M.5.2 Các widget mới Nhóm đã dùng lại 2 widget mới đó có tên là Panel và Switcher để làm cho ứng dụng eSaleShopping thêm phần phong phú hơn. 286 Hình phụ lục 218 Ứng dụng Panel tạo khung chỉ đường đi trên bản đồ trong eSaleShopping Hình phụ lục 219 Ứng dụng Switcher tạo lựa chọn hình thức bán hàng trong eSaleShopping
File đính kèm:
- Khóa luận Tìm hiểu hệ điều hành android và xây dựng ứng dụng minh họa.pdf