Ví dụ, một ứng dụng có thể kêu gọi bất kỳ chức năng lõi của điện thoại như thực hiệncuộc gọi, gửi tin nhắn văn bản, hoặc bằng cách sử dụng máy ảnh, cho phép các nhà phát triển để tạo ra
Trang 1KHOA CÔNG NGHỆ THÔNG TIN
Tel (84-511) 736 949, Fax (84-511) 842 771Website: itf.ud.edu.vn, E-mail: cntt@edu.ud.vn
LUẬN VĂN TỐT NGHIỆP KỸ SƯ NGÀNH CÔNG NGHỆ THÔNG TIN
MÃ NGÀNH : 05115
ĐỀ TÀI : XÂY DỰNG HỆ THỐNG GPS TRACKER TRÊN CÁC THIẾT
BỊ DI ĐỘNG
Mã số : 06T3-047 Ngày bảo vệ : 15-16/06/2011
SINH VIÊN : NGÔ VĂN TRUNG
ĐÀ NẴNG, 06/2011
Trang 2Tôi xin chân thành cảm ơn các thầy cô trong khoa Công nghệ thông tin, trường Đại học Bách khoa Đà Nẵng đã truyền đạt những kiến thức quý báu cho tôi trong những năm học vừa qua và nhất là đã tạo điều kiện thuận lợi cho tôi học tập, thực hiện đề tài tốt nghiệp này.
Đặc biệt, tôi xin chân thành cảm ơn Thầy giáo ThS Trịnh Công Duy đã trực tiếp, tận tình giúp đỡ và hướng dẫn chúng tôi trong suốt thời gian thực hiện đề tài.
Và để có được kết quả như ngày hôm nay tôi rất biết ơn gia đình Ông
Bà, Cha Mẹ và những người thân trong gia đình đã động viên, khích lệ, tạo mọi điều kiện thuận lợi nhất về vật chất lẫn tinh thần trong suốt quá trình học tập cũng như quá trình thực hiện đề tài tốt nghiệp này.
Mặc dù đã cố gắng hoàn thành đồ án trong phạm vi và khả năng cho phép nhưng chắc chắn sẽ không tránh khỏi những thiếu sót Tôi rất mong nhận được sự thông cảm, góp ý và tận tình chỉ bảo của quý Thầy Cô và các bạn.
Một lần nữa xin chân thành cám ơn!
Đà Nẵng, ngày 20 tháng 05 năm 2011
Sinh viên thực hiện
Trang 3Tôi xin cam đoan :
1 Những nội dung trong luận văn này là do tôi thực hiện dưới sự hướng dẫn trực tiếp của thầy giáo Ths.Trịnh Công Duy
2 Mọi tham khảo dùng trong luận văn đều được trích dẫn rõ ràng tên tác giả, tên công trình, thời gian, địa điểm công bố.
3 Mọi sao chép không hợp lệ, vi phạm quy chế đào tạo, hay gian trá,
tôi xin chịu hoàn toàn trách nhiệm.
Sinh viên thực hiện, Ngô Văn Trung
Trang 4MỞ ĐẦU 1
I BỐI CẢNH ĐỀ TÀI 1
II MỤC ĐÍCH VÀ Ý NGHĨA 1
III NHIỆM VỤ THỰC HIỆN 1
IV PHƯƠNG PHÁP THỰC HIỆN 1
CƠ SỞ LÝ THUYẾT 3
I Giới thiệu về Android 3
I.1 Tính năng mở của android 3
I.2 Các thành phần cơ bản của Android 5
I.2.1 Các thư viện hỗ trợ trong android 6
I.2.2 Quá trình thực thi một chương trình android 6
I.2.3 Cấu trúc của một ứng dụng android 7
II Nghiên cứu nền tảng android 7
II.1 Bộ khung của một ứng dụng android 7
II.1.1 Android Activity 8
II.1.2 Intent và Broadcast Receiver 11
II.1.3 Android Service 14
II.1.4 Content provider 16
II.1.5 Android SQLite Database 18
II.2 Vòng đời của một ứng dụng android 21
II.3 Các công cụ phát triển một ứng dụng android 23
II.3.1 Bộ giả lập của androidccvc 23
II.3.2 Những công cụ phát triển Android dành cho Eclipse IDE 28
II.3.3 Dalvik Debug Monitor Service (ddms) 28
II.3.4 Android Debug Bridge (adb) 29
II.3.5 Android Asset Packaging Tool (aapt) 29
II.3.6 Android Interface Description Language (aidl) 29
II.3.7 sqlite3 29
II.3.8 Traceview 29
II.3.9 mksdcard 29
II.3.10 dx 29
II.3.11 activityCreator 29
III Các chế độ bảo mật của một ứng dụng android 29
III.1 Truy cập tập tin và các định danh của người dùng 30
III.2 Các quyền đang được sử dụng 30
III.3 Các quyền trong việc khai báo và có tính bắt buột 31
III.4 Những quyền bắt buột có trong AndroidManifest.xml 33
III.5 Việc tuân theo các quyền khi quảng bá các intent 34
III.6 Cho phép thực thi các quyền khác 34
III.7 Các tài nguyên và quốc tế hóa 34
IV Tìm hiểu về GPS 36
IV.1 Khái niệm GPS 36
Trang 5IV.4.1 Phần không gian 38
IV.4.2 Phần kiểm soát 38
IV.4.3 Phần sử dụng 38
IV.5 Tín hiệu Gps 39
IV.6 Nguồn lỗi của tín hiệu GPS 39
IV.7 Ứng dụng GPS trong dân dụng 40
IV.7.1 Ứng dụng trong lĩnh vực giáo dục 40
IV.7.2 Ứng dụng gps trong lĩnh vực tài nguyên thiên nhiên 41
IV.7.3 Ứng dụng GPS trong lĩnh vực Dầu & Khí đốt 42
IV.7.4 Ứng dụng GPS trong Cơ quan chính phủ 42
PHÂN TÍCH VÀ THIẾT KẾ CHƯƠNG TRÌNH 43
I KHẢO SÁT, MÔ TẢ BÀI TOÁN 43
I.1 Xây dựng biểu đồ use case 43
I.1.1 Các tác nhân của hệ thống 43
I.1.2 Phân tích các Use Case 44
I.2 Biều đồ tuần tự 50
I.3 Biều đồ lớp 52
I.3.1 Class gpsdevicesList 52
I.3.2 Class gpsDevices 52
I.3.3 Class gpsHistory 53
II XÂY DỰNG CƠ SỞ DŨ LIỆU 54
CÀI ĐẶT VÀ THỬ NGHIỆM 57
I Yêu cầu đối với hệ thống 57
II Cài đặt Android và Eclipse 58
II.1 Download Android SDK 58
II.2 Tích hợp Android SDK vào Eclipse 60
II.3 Android Virtual Devices 62
II.4 Cài đặt chương trình Gps_Tracker 63
II.4.1 Cài đặt chương trình trên Emulator 63
II.4.2 Cài đặt chương trình vào Eclipse 64
III Kết quả Demo chương trình 66
III.1 Kết quả ở client ( trên thiết bị android) 66
III.1.1 Màn hình khởi động chương trình 66
III.1.2 Màn hình About 67
III.1.3 Màn hình Login 68
III.1.4 Màn hình View Map 69
III.2 Kết quả trên server 71
III.2.1 Giao diện chính của người sử dụng trên server 71
III.2.2 Thêm mới một thiết bị mới 72
III.2.3 Xem lại history của thiết bị 73
III.2.4 Xem lại đường đi của thiết bị 73
III.2.5 Xem vị trí hiện tại của 1 thiết bị 74
Trang 6I Kết quả đạt được 75
II Hướng phát triển 75
Trang 7DANH MỤC HÌNH
Hình 1 Giới thiệu android 3
Hình 2 Kiến trúc android 5
Hình 3 Biểu đồ mô tả activity state 9
Hình 4 Service lifecycle 15
Hình 5 Ví dụ content provider 17
Hình 6 các tác nhân của hệ thống 43
Hình 7 use case người sử dụng ở client 44
Hình 8 Use case người sử dụng ở server 47
Hình 9 Biểu đồ tuần tự người dùng ở client 50
Hình 10 Biểu đồ tuần tự người dùng ở server 51
Hình 11 Biểu đồ lớp 52
Hình 12 Cơ sở dữ liệu 54
Hình 13 Cài đặt SDK 58
Hình 14 Tích hợp SDK vào eclipse 60
Hình 15 Create và start 1 AVD 63
Hình 16 Màn hình khởi động chương trình 66
Hình 17 Màn hình About 67
Hình 18 Màn hình Login 68
Hình 19 Màn hình View Map 69
Hình 20 Màn hình config 70
Hình 21 Giao diện chính của người sử dụng trên server 71
Hình 22 Form thêm mới một thiết bị 72
Hình 23 Trang xem history của thiết bị 73
Hình 24 Trang xem lại đường đi của thiết bị 73
Hình 25 Trang xem vị trí hiện thời của một thiết bị 74
Trang 8I BỐI CẢNH ĐỀ TÀI
Trong nhu cầu thực tế của cuộc sống, việc quản lý và xác định vị trí các thông tin củangười sử dụng đối với các lĩnh vực mình cần quản lý ngày càng lớn Ví dụ như việc quản lýcác loại hang hóa đang được vận chuyển, quản lý con cái, quản lý tiến trình, lộ trình của mộtdịch vụ vận chuyển nào đó như EMS, DHL
Với sự phát triễn của các thiết bị di động Đặt biệt là thiết bị di động chạy trên hệ điều hành Android của google Android đã thu hút được sự chú ý của giới công nghệ khắp toàn cầu khi đứa con của Google sẽ sử dụng giấy phép mã nguồn mở Đó là một sản phẩm kết tinh
từ ý tưởng của Khối Liên minh thiết bị cầm tay mở do Google dẫn đầu, gồm 34 thành viên với các công ty hàng đầu về công nghệ và di động toàn cầu như Qualcomm, Intel, Motorola, Texas Instruments và LG Electronics, các nhà mạng như T-Mobile, Sprint Nextel, NTT DoCoMo và China Mobile Các nhà phát triển có thể sử dụng miễn phí bộ Android Software Development Kit (SDK) để xây dựng các ứng dụng của mình
Android là một lĩnh vực còn khá mới ở Việt Nam, do đó để phục vụ cho nhu cầu thực tếtrên và tìm hiểu công nghệ của Android, em đã chọn đề tài “ Gps – Tracker “
II MỤC ĐÍCH VÀ Ý NGHĨA
Luận văn nhằm mục đích xây dựng một chương trình chạy trên hệ điều hành Android đểcung cấp địa chỉ hiện thời của người sử dụng lên Server Người quản lý các thiết bị đó ởserver có thể đăng nhập để xem vị trí hiện tại của thiết bị mình đang quản lý ở tại vị trí nào,
có thể xem lại lịch trình, đường đi của thiết bị đó
III NHIỆM VỤ THỰC HIỆN
Cần thực hiện hai bước:
Bước 1: Xây dựng chương trình cho client ( các thiết bị di động sử dụng hệ điềuhành android)
Bước 2: Xây dựng một web server để hiển thì các thông tin cho người quản lý
IV PHƯƠNG PHÁP THỰC HIỆN
Nghiên cứu các vấn đề lý thuyết cơ sở của andoid
Tìm hiều về api google map để xây dựng hệ thống gps_tracker dựa vào Api này củagoogle
Xây dựng chương trình trên android để thu thập và cập nhật dữ liệu cho server
Xây dựng trang web sử dụng nền tảng Joomla để hiển thị các thông tin cập được cập nhậtNghiên cứu plugin google map của joomla để vẽ bản đồ và đường đi của các thiết bị
Trang 9I Giới thiệu về Android
Hình 1 Giới thiệu android
Android là tên một nền tảng mở cho thiết bị di động của Google (gồm hệ điều hành –[linux base], middleware và một số ứng dụng cơ bản) Androind sẽ đương đầu với một số hệđiều hành dành cho thiết bị di dộng khác đang hâm nóng thị trường như Windows Mobile,Symbian và dĩ nhiên là cả OS X (iPhone)
Android đã thu hút được sự chú ý của giới công nghệ khắp toàn cầu khi đứa con củaGoogle sẽ sử dụng giấy phép mã nguồn mở Đó là một sản phẩm kết tinh từ ý tưởng củaKhối Liên minh thiết bị cầm tay mở do Google dẫn đầu, gồm 34 thành viên với các công tyhàng đầu về công nghệ và di động toàn cầu như Qualcomm, Intel, Motorola, TexasInstruments và LG Electronics, các nhà mạng như T-Mobile, Sprint Nextel, NTT DoCoMo
và China Mobile Các nhà phát triển có thể sử dụng miễn phí bộ Android SoftwareDevelopment Kit (SDK) để xây dựng các ứng dụng của mình
I.1 Tính năng mở của android
Android được xây dựng để cho phép các nhà phát triển để tạo ra các ứng dụng di độnghấp dẫn tận dụng tất cả một chiếc điện thoại đã cung cấp Nó được xây dựng để được thực sự
mở Ví dụ, một ứng dụng có thể kêu gọi bất kỳ chức năng lõi của điện thoại như thực hiệncuộc gọi, gửi tin nhắn văn bản, hoặc bằng cách sử dụng máy ảnh, cho phép các nhà phát triển
để tạo ra phong phú hơn và nhiều hơn nữa những kinh nghiệm cố kết cho người dùng.Android được xây dựng trên mở Linux Kernel Hơn nữa, nó sử dụng một máy ảo tuỳ chỉnh
Trang 10Android không phân biệt giữa các ứng dụng lõi của điện thoại và các ứng dụng của bên
thứ ba Họ tất cả có thể được xây dựng để có thể truy cập bằng khả năng của một người cungcấp cho người sử dụng điện thoại với một dải rộng các ứng dụng và dịch vụ Với các thiết bịxây dựng trên Hệ điều hành Android, người dùng có thể hoàn toàn thích ứng với điện thoạiđến lợi ích của họ Họ có thể trao đổi trên màn hình của điện thoại, những phong cách củadialer, hoặc bất kỳ ứng dụng Họ thậm chí có thể hướng dẫn điện thoại của họ để sử dụnghình ảnh ưa thích của họ xem các ứng dụng để xử lý xem tất cả các hình ảnh
Android phá bỏ rào cản để xây dựng các ứng dụng mới và sáng tạo Ví dụ, một nhà pháttriển có thể kết hợp thông tin từ các trang web với dữ liệu trên điện thoại di động của một cánhân – ví dụ như địa chỉ liên hệ của người dùng, lịch, hoặc vị trí địa lý – để cung cấp một trảinghiệm người dùng có liên quan hơn Với Android, một nhà phát triển có thể xây dựng mộtứng dụng cho phép người dùng xem vị trí của bạn bè của họ và được cảnh báo khi họ đang
có trong vùng phụ cận cho họ một cơ hội để kết nối
Nền tảng Android cho phép xây dựng các ứng dụng dựa vào các tính chất sau:
- Khung ứng dụng (application framework): cho phép dùng lại và thay thế các thànhphần
- Máy ảo Dalvik: tùy chọn cho các di động.Cơ chế hoạt động của nó tương tự như máy ảo
Java nhưng nó thực thi dex (dalvik executable) bytecode nhờ công cụ dx chuyển đổi mã
bytecode thành dex bytecode
- Trình duyệt được tích hợp (integrated browser): dựa trên công cụ nguồn mở WebKit
- Đồ họa: được trang bị bởi các thư viện 2D thông thường, đồ họa 3D dựa trên sự đặc tảcủa OpenGL ES 1.0 (để máy chạy nhanh hơn có thể tùy chọn phần cứng)
- Cơ sở dữ liệu SQLite: dùng cho cấu trúc bộ lưu trữ dữ liệu
- Môi trường truyền thông: cung cấp tiếng, hình ảnh thông dụng, và một số định dạng ảnhnhư MPEG4, H.264, MP3, AAC, AMR, JPG, PNG, GIF
- Môi trường phát triển đầy đủ: chứa một thiết bị mô phỏng, các công cụ phát hiện lỗi, bộnhớ, hiện trạng thực thi, và một phần mềm cài đặt dùng IDE Eclipse
Ngoài ra còn hỗ trợ các ứng dụng tích hợp các công nghệ mới hiện nay như hệ thốngtruyền thông di động toàn cầu GMS, Bluetooth, EDGE, 3G, WiFi, Camera, GPS, compass,
và accelerometer (các công nghệ này khi dùng còn phụ thuộc vào thiết bị)
Trang 11I.2 Các thành phần cơ bản của Android
Biểu đồ dưới đây thể hiện các thành phần chính của hệ điều hành Android:
Quá trình thực thi của Android cũng được thực hiện tại lớp thư viện này
Nằm trên thư viện chính là các framework, đó là tập hợp các dịch vụ có thể dùng lại được
và những thành phần chung phục vụ cho các ứng dụng Ví dụ, một loại framework là thànhphần cung cấp nội dung cho bất kỳ dịch vụ nào có liên quan đến việc lưu trữ và truy xuất dữliệu Giao diện ứng dụng trong SQLite chính là một thí dụ cụ thể về trình cung cấp nội dungnày
Các ứng dụng chạy ở lớp trên cùng của hệ điều hành với một bộ các nhân ứng dụng baogồm thư điện tử, lịch làm việc, trình duyệt web Khi nhà phát triển viết một ứng dụng dànhcho Android, ta thực hiện các đoạn mã trong môi trường Java Sau đó, các đoạn mã này sẽđược biên dịch sang các bytecode của Java, tuy nhiên để thực thi được ứng dụng này trên
Android thì nhà phát triển phải thực thi một công cụ có tên là dx Đây là công cụ dùng để
Trang 12chuyển đổi bytecode sang một dạng gọi là dex bytecode "Dex" là từ viết tắt của "Dalvikexecutable" đóng vai trò như cơ chế ảo thực thi các ứng dụng Android.
Các thư viện hỗ trợ trong android
Android chứa một tập các thư viện C/C++ được dùng bởi các thành phần khác nhau của
hệ thống Android Các đặc tính này được nhận ra bởi các nhà phát triển qua các mẫu ứngdụng Android Một số thư viện chính được liệt kê dưới đây:
- Thư viện hệ thống C: có nguồn gốc thực thi từ thư viện hệ thống chuẩn C (libc), đượcđiều chỉnh cho phù hợp đối với các thiết bị nhúng vào Linux
- Quản lý bề mặt (Surface Manager): quản lý việc truy cập cách hiển thị hệ thống con và
việc ghép liền nét các tầng đồ họa 2D và 3D từ nhiều ứng dụng
- Các thư viện môi trường truyền thông: dựa trên OpenCORE của PacketVideo, các thưviện này cung cấp việc phát và ghi lại của các định dạng tiếng và hình thông dụng, cũng kháhay như các tập tin hình ảnh tĩnh, chứa MPEG4, H.264, MP3, AAC, AMR, JPG, PNG
- LibWebCore: một bộ duyệt web hiện đại cung cấp nguồn cho cả hai trình duyệt –trình
duyệt web của Android và một khung nhìn web có thể được nhúng vào
- SGL: phần dưới của công cụ đồ họa 2D.
- Các thư viện 3D: một sự thực thi dựa trên các giao diện ứng dụng OpenGL ES 1.0; thưviện này dùng cả phần cứng 3D khá mạnh cũng như phần mềm tạo vạch 3D tùy chọn ở mứccao
- FreeType: sự biểu diễn kiểu chữ của bitmap và vector.
- SQLite: Một công cụ cơ sở dữ liệu có dung lượng nhỏ với sự tương tác về dữ liệu khá
tốt, hỗ trợ cho tất cả các ứng dụng để thực hiện việc lưu trữ dữ liệu
I.2.1 Quá trình thực thi một chương trình android
Android chứa một tập các thư viện chính cung cấp hầu hết các chức năng sẵn có trongngôn ngữ lập trình Java
Mỗi ứng dụng Android chạy trên chính tiến trình của nó, với chính thực thể của máy ảoDalvik Dalvik được viết với mục đích là một thiết bị có thể chạy hiệu quả trên nhiều máy
ảo Máy ảo Dalvik thực thi các tập tin trong Dalvik Executable(.dev), định dạng này đượctùy chọn theo dấu bộ nhớ tối thiểu Máy ảo phải được đăng ký, sau đó mới có thể chạy cácđịnh dạng dex Định dạng này được tạo ra bởi công cụ “dx”, công cụ này chuyển đổi từfile class thành file dex Máy ảo Dalvik dựa vào nhân Linux để tạo các chức năng như tạoluồng và quản lý bộ nhớ cấp độ thấp
I.2.2 Cấu trúc của một ứng dụng android
Các nhà phát triển có toàn quyền truy cập đến cùng các khung giao diện ứng dụng từ cácứng dụng lõi Kiến trúc ứng dụng được thiết kế nhằm đơn giản việc dùng lại các thành phần,
Trang 13bất cứ ứng dụng nào đều có thể đưa ra các dặc tính của nó và các ứng dụng khác bất kì sau
đó đều có thể dùng lại những đặc tính này (tùy thuộc vào các ràng buộc an toàn đòi hỏi từkhung ứng dụng) Người dùng được quyền thay thế các thành phần nếu cùng cơ chế này
Ở dưới các ứng dụng là tập các dịch vụ và hệ thống, hay nói cách khác thì khung ứngdụng bao gồm các thành phần thông dụng sau:
- Có rất nhiều các thành phần có thể mở rộng của Views : có thể được dùng để tạo một
ứng dụng, gồm các list, grid, textbox, button, và ngay cả việc nhúng vào một trình duyệtweb
- Trình cung cấp nội dung (Content Providers) : cho phép các ứng dụng truy cập dữ liệu
từ các ứng dụng khác (như Contacts), hay để chia sẻ chính dữ liệu của ứng dụng đó
- Trình quản lý tài nguyên (Resourse Manager) : cung cấp sự truy cập đến các tài nguyên
không có mã hóa như các string riêng lẻ, đồ họa, các tập tin layout
- Trình quản lý thông báo (Notification Manager) : cho phép tất cả các ứng dụng hiển thị
các cảnh báo thông dụng trên thanh trạng thái
- Trình quản lý hoạt động (Activity Manager) : quản lý vòng đời của các ứng dụng và
cung cấp một sự điều hướng thông dụng để khi thực thi Android có thể nhận biết được danhsách các hoạt động cần được tạo ra trong một ứng dụng
Ngoài ra còn có một số dịch vụ khác như Package Manager, Window Manager,Telephony Manager, Location Manager, XMPP Service
II Nghiên cứu nền tảng android
II.1 Bộ khung của một ứng dụng android
Để tạo nên một ứng dụng android thì bao gồm nhiều thành phần Các thành phần nàyđược chia làm 6 loại cơ bản sau:
Activity: là nền của 1 ứng dụng Khi khởi động 1 ứng dụng Android nào đó thì
bao giờ cũng có 1 main Activity được gọi, hiển thị màn hình giao diện của ứngdụng cho phép người dùng tương tác
Service: thành phần chạy ẩn trong Android Service sử dụng để update dữ liệu,
đưa ra các cảnh báo (Notification) và không bao giờ hiển thị cho người dùng thấy
Content provider: kho dữ liệu chia sẻ Content Provider được sử dụng để quản lý
và chia sẻ dữ liệu giữa các ứng dụng
Trang 14 Intent: nền tảng để truyền tải các thông báo Intent được sử dụng để gửi các thông
báo đi nhằm khởi tạo 1 Activity hay Service để thực hiện công việc mong muốn.VD: khi mở 1 trang web, thì gửi 1 intent đi để tạo 1 activity mới hiển thị trang webđó
Broadcast Receiver: thành phần thu nhận các Intent bên ngoài gửi tới VD: khi
viết 1 chương trình thay thế cho phần gọi điện mặc định của Android, khi đó cần 1
BR để nhận biết các Intent là các cuộc gọi tới
Notification: đưa ra các cảnh báo mà không làm cho các Activity phải ngừng hoạt
động
Trong đó Activity, Service, Broadcast Receiver và Content Provider mới là những thành
phần chính cấu thành nên ứng dụng Android, bắt buộc phải khai báo trong AndroidManifest
II.1.1 Android Activity
Các Activity là hoạt động cơ bản nhất trong 4 khối xây dựng nên một ứng dụng Adroid.Một Activity là luôn luôn là một màn hình đơn trong ứng dụng Mỗi Activity thực thi như
một lớp đơn được dẫn xuất từ lớp cơ sở Activity Lớp này sẽ hiển thị giao diện người dùng
chứa các Views và phản hồi lại những sự kiện Hầu hết các ứng dụng đều có nhiều màn hình
Ví dụ, một đoạn tin nhắn ứng dụng có khả năng hiển thị trên một màn hình sẽ chỉ ra một
danh sách của các contacts để gởi tin nhắn, màn hình thứ hai dùng để viết tin nhắn theo các
contact đã chọn, các màn hình khác dùng để xem lại các tin nhắn hoặc thay đổi chế độ thiết
lập Mỗi màn hình sẽ được thực thi như là một Activity Di chuyển tới một màn hình hiển thịkhác khác với màn hình hiện hành bằng cách bắt đầu một hoạt động mới, nhưng màn hìnhhiện hành phải thực hiện xong các Activity của nó (điều này có nghĩa là giao diện ứng dụngcủa Activity phải được hoàn thành) Trong một số trường hợp một hoạt động có thể trả vềmột giá trị cho hoạt động liền trước - ví dụ, một hoạt động đó cho phép người dùng chọn mộthình ảnh sẽ trả về hình ảnh được chọn từ đối tượng gọi
Hệ điều hành Android quản lý Activity theo dạng stack: khi một Activity mới được khởi
tạo, nó sẽ được xếp lên đầu của stack và trở thành running activity, các Activity trước đó sẽ
bị tạm dừng và chỉ hoạt động trở lại khi Activity mới được giải phóng
Một Activity gồm có 4 trạng thái sau:
Paused: Activity vẫn hiển thị (visible) nhưng không thể tương tác VD: một
activity mới xuất hiện hiển thì giao diện đè lên trên activity cũ, nhưng giao diệnnày nhỏ hơn giao diện của activity cũ, do đó ta vẫn thấy được 1 phần giao diện củaactivity cũ nhưng lại không thể tương tác với nó
Trang 15 Stop: Activity bị thay thế hoàn toàn bởi Activity mới sẽ tiến đến trạng thái stop
tắc ưu tiên Các Activity ở trạng thái stop hoặc paused cũng có thể bị giải phóng
và khi nó được hiển thị lại thì các Activity này phải khởi động lại hoàn toàn vàphục hồi lại trạng thái trước đó
Biểu đồ mô tả activity state:
Hình 3 Biểu đồ mô tả activity state
Có 3 looper chính mà bạn có thể quan tâm để giám sát các Activity của mình:
Toàn bộ thời gian sống của một hoạt động xảy ra giữa lần gọi đầu tiên
onCreat(Bundle) và lần gọi cuối cùng onDestroy() (giữa phương thức khởi tạo và
Trang 16xóa bỏ của một Activity) Một hoạt động khởi tạo tất cả các trạng thái “toàn cục”
trong onCreat(), và giải phóng tất cả mọi tài nguyên còn lại trong onDestroy().
Cho ví dụ, nếu có một luồng thread đang chạy trên nền nhằm tải dữ liệu từ mạng,
nó có thể bắt đầu thread trong onCreate() và sau đó dừng thread trong
onDestroy().
Thời gian sống chính của một hoạt động xảy ra giữa một lần gọi onStart() đến
khi xuất hiện một cuộc gọi tương ứng đến onStop() Trong suốt thời gian này
người dùng có thể nhìn thấy Activity này trên màn hình, và tương tác trực tiếp với
nó Giữa hai phương thức bạn có thể duy trì nguồn tài nguyên, điều đó là điều cầnthiết để hiển thị Activity đến người sử dụng Cho ví dụ, bạn có thể đăng ký một
IntentReceiver tại onStart() để giám sát các thay đổi ảnh hưởng đến giao diện mà
bạn đang tạo ra, và khi bạn không đăng ký trên onStop() thì người dùng không duy
trì được giao diện mà bạn đang hiển thị theo ý muốn của họ Các phương thức
onStart() và onStop() có thể đã được gọi nhiều lần, khi Activity là trực quan hay
ẩn đi đối với người sử dụng
Tiền cảnh thời gian sống của một Activity xảy ra giữa một cuộc gọi onResume()
trước khi có một cuộc gọi tương ứng đến onPause() Trong suốt thời gian này
Activity này ở phía trước của tất cả những hoạt động khác và ảnh hưởng đến người
sử dụng Một Activity có thể thường xuyên xảy ra giữa lúc những trạng thái hồiphục lại và tạm dừng – cho ví dụ khi thiết bị đang nghỉ, khi đó là kết quả của một
Activity đã được sinh ra, từ một intent mới đã được tạo – vì thế đoạn mã trong
những phương thức này khá gọn nhẹ
Toàn bộ vòng đời của một Activity đều được định nghĩa bởi những phương thức của
Activity Tất cả các phương thức này đều riêng biệt, bạn có thể ghi đè lên chúng cho phù hợp
khi Activity thay đổi trạng thái Tất cả mọi Activity đều thực thi onCreate(Bundle) để thực hiện thiết lập lúc ban đầu, đôi lúc Activity sẽ cũng thực thi onPausse() giữ các thay đổi của
dữ liệu và mặt khác phải chuẩn bị để ngừng tương tác với người dùng Cũng có nhiều hoạt
động cũng thực thi onFreeze() và thực hiện việc lấy lại trạng thái tương ứng trong
onCreate(Bundle) Những phương thức khác có thể thực thi khi cần Bạn nên luôn luôn gọi
lớp cha Activity khi thực thi những phương thức này
public class Activity extends ApplicationContext {
Trang 17protected void onCreate(Bundle icicle);
protected void onStart();
protected void onRestart();
protected void onResume();
protected void onFreeze(Bundle outIcicle);
protected void onPause();
protected void onStop();
protected void onDestroy();
}
II.1.2 Intent và Broadcast Receiver
1 Khái niệm intent
Theo định nghĩa của Google, Intent là một miêu tả về một hoạt động cần được thực hiện.Còn nói một cách đơn giản và dễ hiểu hơn, Intent là một cơ cấu cho phép truyền thông điệpgiữa các thành phần của 1 ứng dụng và giữa các ứng dụng với nhau
2 Các thuộc tính của intent
data: là dữ liệu sẽ được xử lý trong action, thường được diễn tả là một Uri
(Uniform Resource Identifier)
Trang 18 Category: bổ sung thêm thông tin cho action của Intent VD:
CATEGORY_LAUNCHER thông báo sẽ thêm vào Launcher như là một ứngdụng top-level
xác định thì các thuộc tính khác sẽ trở thành thuộc tính phụ
3 Phân loại intent
Intent được chia ra làm 2 loại:
Explicit Intents: intent đã được xác định thuộc tính component, nghĩa là đã chỉ rõ
thành phần sẽ nhận và xử lý intent Thông thường intent dạng này sẽ không bổsung thêm các thuộc tính khác như action, data Explicit Intent thương được sửdụng để khởi chạy các activity trong cùng 1 ứng dụng
Implicit Intents: Intent không chỉ rõ component xử lý, thay vào đó nó bổ sung
thông tin trong các thuộc tính Khi intent được gửi đi, hệ thống sẽ dựa vào nhữngthông tin này để quyết định component nào thích hợp nhất để xử lý nó
VD:
ACTION_DIAL tel:123 thông thường sẽ được hệ thống giao cho activity Phone
Dialer mặc định của Android xử lý
4 Một số action thường dùng trong intent
ACTION_ANSWER - mở Activity để xử lý cuộc gọi tới, thường là Phone Dialer
của Android
ACTION_CALL - mở 1 Phone Dialer (mặc định là PD của Android) và ngay lập
tức thực hiện cuộc gọi dựa vào thông tin trong data URI
ACTION_DELETE - mở Activity cho phép xóa dữ liệu mà địa chỉ của nó chứa
trong data URI
Trang 19 ACTION_DIAL - mở 1 Phone Dialer (mặc định là PD của Android) và điền
thông tin lấy từ địa chỉ chứa trong data URI
ACTION_EDIT - mở 1 Activity cho phép chỉnh sửa dữ liệu mà địa chỉ lấy từ data
URI
ACTION_SEND - mở 1 Activity cho phép gửi dữ liệu lấy từ data URI, kiểu của
dữ liệu xác định trong thuộc tính type
ACTION_SENDTO - mở 1 Activity cho phép gửi thông điệp tới địa chỉ lấy từ
data URI
ACTION_VIEW - action thông dụng nhất, khởi chạy activity thích hợp để hiển
thị dữ liệu trong data URI
ACTION_MAIN - sử dụng để khởi chạy 1 Activity.
5 Intent Filter
Activity, Service và BroadCast Receiver sử dụng Intent Filter để thông báo cho hệ thốngbiết các dạng Implicit Intent mà nó có thể xử lý Nói cách khác, Intent Filter là bộ lọc Intent,chỉ cho những Intent được phép đi qua nó
Intent Filter mô tả khả năng của component định nghĩa nó Khi hệ thống bắt được 1Implicit Intent (chỉ chứa 1 số thông tin chung chung về action, data và category ), nó sẽ sửdụng những thông tin trong Intent này, kiểm tra đối chiếu với Intent Filter của cáccomponent các ứng dụng, sau đó quyết định khởi chạy ứng dụng nào thích hợp nhất để xử lýIntent bắt được Nếu có 2 hay nhiều hơn ứng dụng thích hợp, người dùng sẽ được lựa chọnứng dụng mình muốn
Trang 20II.1.3 Android Service
Service là 1 trong 4 thành phần chính trong 1 ứng dụng Android ( Activity, Service,BroadcastReceiver, ContentProvider) thành phần này chạy trong hậu trường và làm nhữngcông việc không cần tới giao diện như chơi nhạc, download, xử lí tính toán…
Một Service có thể được sử dụng theo 2 cách:
Nó có thể được bắt đầu và được cho phép hoạt động cho đến khi một người nào đódừng nó lại hoặc nó tự ngắt Ở chế độ này, nó được bắt đầu bằng cách gọi
Trang 21được thiết lập bằng cách gọi lệnh Context.bindService() và được đóng lại bằngcách gọi lệnh Context.unbindService() Nhiều người dùng có thể kết nối tới cùngmột thiết bị Nếu Service vẫn chưa được khởi chạy, lệnh bindService() có thể tùy ýkhởi chạy nó Hai chế độ này thì không tách biệt toàn bộ Bạn có thể kết nối vớimột Service mà nó đã được bắt đầu với lệnh startService().
Biểu đồ mô tả Service lifecycle
Hình 4 Service lifecycle
Giống như một Activity, một Service cũng có các phương thức chu kỳ thời gian mà bạn
có thể cài đặt để kiểm soát những sự thay đổi trong trạng thái của nó Những những phươngthức của Service thì ít hơn là của Activity – chỉ có 3- và chúng thì được sử dụng rộng rãi,không được bảo vệ
void onCreate() void onStart(Intent intent) void onDestroy()
Trang 22 Entire lifetime của một Service diễn ra giữa thời gian onCreate() được gọi ra và thời gian mà onDestroy() trả lại Giống như một Activity, một Service lại tiết hành cài đặt ban đầu ở onCreate(), và giải phóng tát cả các tài nguyên còn lại ở
onDestroy().
Active lifetime của một Service bắt đầu bằng một lệnh tới onStart() Đây là
phương thức được chuyển giao đối tượng Intent mà đã được thông qua để tới
startService().
Không có callback tương đương nào cho thời điểm service dừng lại, không cóphương thức onstop() Các phương thức onCreate() và onDestroy() được gọi chotất cả các Service dù chúng có được bắt đầu bằng Context.startService() hoặcContext.bindService() hay không Tuy nhiên thì, onStart() chỉ được gọi ra đối vớicác Service bắt đầu bằng startService().Nếu một Service cho phép những Servicekhác kết nối với nó thì sẽ có thêm các phương thức callback dành cho Service đó
để thực hiên
II.1.4 Content provider
Một Content Provider cung cấp một tập chi tiết dữ liệu ứng dụng đến các ứng dụng khác.Thường được sử dụng khi chúng ta muốn tạo cơ sở dữ liệu dưới dạng public ( các ứng dụngkhác có thể truy xuất)
Dữ liệu thường được lưu trữ ở file hệ thống, hoặc trong một SQLite database
Đơn giản để các bạn có thể hình dung như : Danh bạ, Call log, cấu hình cài đặt trên điệnthoại là dữ liệu dưới dạng Content Provider
Content Provider hiện thực một tập phương thức chuẩn mà các ứng dụng khác có thể truyxuất và lưu trữ dữ liệu của loại nó điều khiển
Tuy nhiên, những ứng dụng không thể gọi các phương thức trực tiếp Hơn thế chúng dùnglớp Content Resolver và gọi những phương thức đó
Một Content Resolver có thể giao tiếp đến nhiều content provider; nó cộng tác với cácprovider để quản lý bất kỳ giao tiếp bên trong liên quan
Trang 23Ví dụ một ứng dụng nhỏ để lấy tất cả thông tin cấu hình load lên list view.
Hình 5 Ví dụ content provider.
Trang 24II.1.5 Android SQLite Database
Android sử dụng SQLite làm nền tảng database cho việc truy xuất và khai thác dữ liệu,SQLitevốn là Hệ CSDL quan hệ đơn giản dễ dùng và gọn nhẹ, nên được sử dụng trên rấtnhiều nền tảng di động
Cách tạo và sử dụng cơ sở dữ liệu SQLite Ví dụ tạo một cơ sở dữ liệu đơn giản user
gồm 2 trường ID và name, ngoài ra còn có các thao tác thêm, sửa, xóa
Tạo cơ sở dữ liệu:
Đầu tiên 1 class DBAdapter để xử lý tất cả các thao tác liên quan đếnCSDL
public static final String KEY_ID = "_id";
public static final String KEY_NAME = "name";
private DatabaseHelper mDbHelper;
private SQLiteDatabase mDB;
private static final String DATABASE_CREATE = "create table users
(_id integer primary key autoincrement, "
+ "name text not null);";
private static final String DATABASE_NAME = "Database_Demo";
private static final String DATABASE_TABLE = "users";
private static final int DATABASE_VERSION = 2;
private final Context mContext;
Tạo 1 lớp bên trong DBAdapter được extend từ lớpSQLiteOpenHelper, override 2 phương thức onCreate() và onUpgrade() để quản lýviệc tạo CSDL và version của CSDL đó
Trang 25private static class DatabaseHelper extends SQLiteOpenHelper{
public DatabaseHelper(Context context, String name,
CursorFactory factory, int version) { super(context, name, factory, version);
Trang 26mDB = mDbHelper.getWritableDatabase();
return this;
}
Thêm giá trị vào cơ sở dữ liệu
public long createUser(String name){
ContentValues inititalValues = new ContentValues();
inititalValues.put(KEY_NAME, name);
return mDB.insert(DATABASE_TABLE, null, inititalValues);
}
Truy vấn cơ sở dữ liệu
public Cursor getAllUsers(){
return mDB.query(DATABASE_TABLE, new String[] {KEY_ID, KEY_NAME}, null, null, null, null, null);
Trang 27String[] from = new String[]{DBAdapter.KEY_NAME};
int[] to = new int[] {R.id.text1};
SimpleCursorAdapter users = new SimpleCursorAdapter(this,
R.layout.users_row, mCursor, from, to);
setListAdapter(users);
}
II.2 Vòng đời của một ứng dụng android
Trong hầu hết các trường hợp, mỗi ứng dụng Android chạy trên chính tiến trình Linux.Tiến trình này được tạo ra khi ứng dụng chạy, và vẫn sẽ còn đang hoạt động cho đến khi nókhông cần thiết nữa, khi đó hệ thống cần cải tạo bộ nhớ cho các ứng dụng khác
Một điểm đặc trưng chủ yếu của Android là khoảng thời gian tồn tại của quá trình khôngđược điều khiển ngay lập tức bởi ứng dụng mà chính nó tạo ra.Vì thế, vòng đời được xácđịnh bởi hệ thống thông qua sự kết hợp các phần của ứng dụng từ hệ thống đang chạy, từnhững vấn đề quan trọng đối với người dùng, và từ tất cả bộ nhớ có sẵn để dùng trong hệthống
Điều quan trọng đối với những nhà phát triển ứng dụng là hiểu các thành phần ứng dụngkhác nhau như thế nào (trong sự riêng biệt của Activity, Service, và IntentReceiver), cóảnh hưởng thế nào đến vòng đời của quá trình ứng dụng Khi dùng không phù hợp cácthành phần, kết quả có thể chính là hệ thống đang phá hủy các quá trình ứng dụngtrong khi các tiến trình này đang làm những công việc quan trọng
Ta lấy ví dụ, một IntentReceiver bắt đầu một tuyến khi nó nhận một Intent qua phươngthức onReceiveIntent(), và sau đó quay trở lại Một khi quay trở lại, hệ thống xem
IntentReceive không hoạt động nữa.Và như vậy số đông các quá trình không cần thiết nữa
( trừ khi các thành phần ứng dụng khác hoạt động trong nó ) Theo cách đó, hệ thống có thểlàm phá hủy quá trình này bất cứ lúc nào để được phục hồi lại bộ nhớ, chấm dứt sự xuất hiện
Trang 28của tuyến đang chạy trên nó Giải quyết vấn đề này phải bắt đầu một Service từIntentReceiver, vì thế hệ thống được biết là vẫn đang tích cực xử lý quá trình này.
Để xác định xem quá trình nào bị phá hủy khi bộ nhớ thấp, Android đặt chúng vào trong
“hệ thống cấp bậc quan trọng” dựa trên các thành phần đang chạy và trạng thái của các thànhphần Đây là trình tự của tầm quan trọng này:
Forceground process: đang chạy một ứng dụng Activity ở trên đầu màn hình màngười sử dụng đang tương tác với nó (khi đó phương thức onResume() đã đượcgọi) hay là một IntentReceiver hiện tại đang chạy (phương thức
onReceiveIntent() đang thực thi) Chỉ có một vài tiến trình trong hệ thống và cáctiến trình này chỉ bị hủy khi việc sắp xếp mới nhất xảy ra, cũng là khi bộ nhớ quáthấp đến nỗi các tiến trình này không thể thực thi Thông thường lúc này thiết bị sẽtiến hành phân trang bộ nhớ, vì thế mà hành động này được yêu cầu để giữ chogiao diện người dùng phản hồi
Visible process: là quá trình chứa một Activity hiển thị trên màn hình của người
sử dụng nhưng không nổi bật lên (phương thức onPause() đã được gọi) Điều này
có thể xảy ra, cho ví dụ, nếu hoạt động trước đó vừa mới hiển thị với hộp thoạixuất hiện cho phép hoạt động sau đó có thể nhìn thấy ở phía sau nó Nếu một quátrình đã coi là vô cùng quan trọng và sẽ không bị phá hủy trừ khi công việc đanglàm là yêu cầu giữ cho tất cả các quá trình forceground chạy
Service process: giữ một Service vừa mới bắt đầu với phương thức
startService() Dẫu cho các quá trình không lập tức thấy được từ người sử dụng,chúng thực hiện những điều mà người dùng quan tâm (như là nền mp3 lặp lại haynền hệ thống mạng dữ liệu được upload hoặc được download ), nên hệ thống sẽluôn giữ cho các quá trình này chạy trừ khi nó không đủ bộ nhớ để giữ lại tất cảcác quá trình forceground và visible
Background process: chứa một Activity tức mà hiện tại là không trực quan vớingười sử dụng (phương thức onStop() đã được gọi) Quá trình này không ảnhhưởng đến kinh nghiệm của người sử dụng Các tiến trình này thực thi vòng đờihoạt động một cách chính xác, hệ thống có thể phá hủy như các quá trình bất cứlúc nào để phục hồi bộ nhớ cho một trong 3 loại quá trình trước đó Theo cáchthông thường có nhiều các quá trình đang chạy, nên hệ thống đã giữ chúng trong
Trang 29một danh sách LRU để bảo đảm rằng các quá trình hầu hết gần đây đều được xemxét bởi người sử dụng lần cuối cùng để có thể phá hủy các quá trình này nếu bộnhớ ở chế độ thấp
Empty process:là không chứa bất kỳ thành phần hoạt động ứng dụng nào Lý do
để giữ lại một quá trình lân cận như là một cache nhằm cải thiện thời gian khởiđộng là thời gian kế tiếp mà một thành phần của ứng dụng cần thiết có thể thực thi.Như là, hệ thống sẽ thường phá hủy các tiến trình trong một tầng lớp để tạo nên sựcân bằng bao gồm tất cả các tài nguyên hệ thống giữa các nơi lưu trữ các quá trìnhcache rỗng và cache lưu trữ bên trong nhân
II.3 Các công cụ phát triển một ứng dụng android
Android SDK bao gồm một sự đa dạng với những công cụ tùy chọn giúp bạn phát triểncác ứng dụng trên mobile trên nền tảng Adroid Quan trọng nhất là Android Emulator vàAndroid Development Tools plugin dành cho Eclipse, nhưng ngoài ra SDK còn chứa mộttrong số những công cụ khác cho bộ gỡ lỗi, đóng gói và khởi tạo các ứng dụng của bạn trên
bộ giả lập
II.3.1 Bộ giả lập của androidccvc
Một thiết bị ảo dành cho mobile được chạy trên máy tính của bạn Bạn sẽ sử dụng bộ giảlập để thiết kế, gỡ lỗi và kiểm tra các ứng dụng của bạn trong môi trường thực thi củaAndroid
Android SDK chứa một bộ mô phỏng điện thoại — một thiết bị ảo chạy trên máy của bạn
Bộ này cho bạn mẫu ban đầu, sự hướng dẫn và kiểm tra các ứng dụng của Android mà khôngcần đến một thiết bị thật
Bộ mô phỏng của Android bắt chước các chức năng cơ bản và cách hành xử của một thiết
bị điện thoại, ngoại trừ nó không nhận và đặt các cuộc gọi Ở bên trái bộ mô phỏng cung cấpmột sự điều hướng khác biệt và các phím điều khiển, mà bạn có thể "nhấn" bằng cách dùngchuột hay bàn phím của máy bạn để phát sinh các sự kiện cho ứng dụng của mình Nó cũngcung cấp một màn hình để ứng dụng bạn hiển thị, cùng với bất kì ứng dụng Android nàokhác đang chạy
Để giúp bạn tạo mô hình và kiểm tra ứng dụng của mình, bộ mô phỏng cho phép ứngdụng của bạn dùng các dịch vụ của nền tảng Android để kết nối với các ứng dụng khác, truycập mạng, nghe nhạc, xem phim, lưu trữ và truy lục dữ liệu, thông báo cho người dùng, hoàntrả các kiểu chuyển đổi đồ họa và giao diện
Bộ mô phỏng cũng chứa một khả năng gỡ lỗi riêng biệt, như là một console mà bạn có thểghi từ kết quả hiển thị của nhân, giả lập các ngắt của ứng dụng (Như là các tin nhắn SMS đếnhay là các cuộc gọi điện thoại), giả lập các ảnh hưởng của góc trễ và các phím trên kênh
Trang 301 Bắt đầu và dừng bộ mô phỏng
Để bắt đầu bộ mô phỏng, thay đổi thư mục tools/ của SDK và đưa vào emulator hay./emulator Điều này là công việc nhằm khởi tạo hệ thống Android, bạn sẽ thấy cửa sổ bộ môphỏng xuất hiện trên màn hình của bạn
Để ngừng bộ mô phỏng, thì đóng cửa sổ bộ mô phỏng lại
2 Điều khiển bộ mô phỏng
Bạn có thể dùng bộ mô phỏng để bắt đầu các công đoạn tùy chọn và thiết lập những lệnh
console để điều khiển cách hành xử và tiêu biểu chính là môi trường được giả lập Một khi
bộ mô phỏng chạy, bạn có thể điều khiển nó bằng cách dùng con trỏ chuột hay bàn phím để
"nhấn" các phím thiết bị được giả lập
Trang 31Bảng dưới tóm tắt các ánh xạ giữa các phím của b mô phỏng và các phím trên bàn phím
Disable/enable all networking F8
Start tracing F9 (only with -trace flag)
Stop tracing F10 (only with -trace flag)
DPad left/up/right/down Keypad 4/8/6/2
+/-Onion alpha increase/decrease Keypad * / /
Trang 32Toggle Unicode/raw key mode Ctrl-K
Bảng 1 Bảng ánh xạ giữa các phím của bộ mô phỏng và bàn phím
3 Dùng các hình dạng của bộ mô phỏng
Bạn có thể chạy bộ mô phỏng với bất kì hình thái nào trong bốn kiểu được mô tả dướibảng sau Để xác định một hình dạng nào đó, bạn dùng cú pháp:
“-skin <skinID> ”, khi bắt đầu bộ mô phỏng
Ví dụ: emulator -skin HVGA-L
Chú ý rằng bạn phải nhập vào <skinID> với các kí tự hoa (Nếu máy bạn phân biệt dạngchữ)
Định danh của
hình dạng
HVGA-L 480x320, nằm ngang
Trang 34II.3.2 Những công cụ phát triển Android dành cho Eclipse IDE
ADT plugin thêm chức năng vào môi trường tích hợp Eclipse, để có thể khởi tạo và gỡ lỗicác ứng dụng của Android một cách dễ hơn và nhanh hơn Nếu bạn sử dụng Eclipse, ADTplugin đưa ra cho bạn một sự nổi tiếng không thể tin được trong sự phát triển các ứng dụngcủa Android :
Nó giúp bạn có thể truy cập đến các công cụ phát triển khác của Android từbên trong Eclipse IDE Cho ví dụ, ADT cho phép bạn truy cập rất nhiều khảnăng của công cụ DDMS — giao tiếp được với screenshots, quản lý port-forwarding, thiết lập các điểm dừng, và quan sát tiến trình và quá trình thôngtin — trực tiếp từ Eclipse
Nó cung cấp một New Project Wizard, điều này giúp cho bạn tạo một cáchnhanh chóng và cài đặt tất cả những file cơ bản mà bạn cần cho một ứng dụngmới của Android
Nó tự động và đơn giản hơn quá trình của việc bạn đang xây dựng ứng dụngcủa Android
Nó cung cấp một trình soạn thảo mã hóa Android, do đó nó giúp bạn viết sẵnXML cho bản kê khai Android của bạn và những file tài nguyên
II.3.3 Dalvik Debug Monitor Service (ddms)
Tích hợp với máy ảo Dalvik trên nền tảng của Android, công cụ này cho phép bạn quản lýtrên một bộ giả lập hoặc thiết bị và sự trợ giúp trong bộ gỡ lỗi Bạn có thể sử dụng nó để phá
bỏ quá trình, chọn một quá trình để gỡ lỗi, phát sinh dữ liệu trace, quan sát heap, và xemthông tin về các tiến trình, nắm bắt screenshots của bộ giả lập hoặc thiết bị, và rất nhiều điềunữa
Công việc gỡ lỗi với công cụ gỡ lỗi được gọi là Dalvik Debug Monitor Service (DDMS),cung cấp sự phục vụ phía trước cổng, lưu giữ lại hình ảnh trên thiết bị, truyền thông tin vàlưu thông tin trên thiết bị… DDMS nằm trong thư mục tools/ của SDK DDMS sẽ làm việcvới cả emulator và thiết bị, nếu cả hai đã kết nối và đang chạy đồng thời, DDMS mặc định là
xử lý emulator
Bạn có thể thiết lập một số của ưu tiên của DDMS trong File->Preferences Sự ưu tiênđược lưu ở "$HOME/.ddmsrc"
Trang 35II.3.4 Android Debug Bridge (adb)
Công cụ adb cho phép bạn khởi tạo những file apk của ứng dụng của bạn trên bộ giả lậphoặc thiết bị và truy xuất tới bộ giả lập hoặc thiết bị từ một dòng lệnh Bạn có thể sử dụngfile này liên kết tới bộ gỡ lỗi chuẩn để chạy những đoạn mã ứng dụng trên bộ giả lập hoặcthiết bị của Android
II.3.5 Android Asset Packaging Tool (aapt)
Công cụ aapt cho phép bạn tạo những file apk chứa những bảng nhị phân và tài nguyêncủa các ứng dụng Android
II.3.6 Android Interface Description Language (aidl)
Cho phép bạn phát sinh đoạn mã cho một giao diện ở bên trong quá trình, như là một dịch
III Các chế độ bảo mật của một ứng dụng android
Tăng sự truy cập đến các đặc tính và tài nguyên của hệ thống một cách an toàn, khai báocác quyền xử lý truy cập đến những đặc tính an toàn cho chính bạn Nếu được phép truy cậpthì khi đó ứng dụng mới có thể truy cập đến từng chức năng được cung cấp bởi các ứng dụng
Trang 36III.1 Truy cập tập tin và các định danh của người dùng
Mỗi gói tập tin của Android (Android package: apk) cài trên thiết bị được cho bởi địnhdanh người dùng Linux duy nhất của chính nó, việc tạo một sandbox dành cho mỗi tập tin vàngăn nó tiếp xúc với các ứng dụng khác (hay các ứng dụng khác tiếp xúc với nó) Định danhngười dùng này được gán cho mỗi tập tin khi ứng dụng được cài trên thiết bị, và thường cònlại trong khi tập tin vẫn còn tồn tại trên thiết bị
Bởi sự tuân theo chế độ bảo mật xảy ra ở cấp độ tiến trình, mã của hai gói apk bất kìkhông thể tự động thực thi trong cùng một tiến trình, lúc này chúng cần thực thi như haingười dùng khác biệt của Linux Bạn có thể dùng thuộc tính sharedUserId trong thẻAndroidManifest.xml của tập tin manifest của mỗi gói để có thể gán cho chúng cùng với ID.Làm như vậy, với mục đích là bảo mật hai gói sau khi xem xét là cùng một ứng dụng, vớicùng ID của người dùng và các sự chấp nhận của tập tin Chú ý rằng để giữ lại sự an toàn,chỉ có hai ứng dụng được gán với cùng kí hiệu (và yêu cầu cùng sharedUserld) sẽ được chogiống ID của người dùng
Bất kì tập tin nào được tạo ra bởi một ứng dụng sẽ được gán cho ID của người dùng ứngdụng, và không thể truy cập thông thường đến các gói khác.Khi tạo một tập tin mới với cácphương thức getSharedPreferences(String, int), openFileOutput(String, int), hay
createDatabase(String, int, int, SQLiteDatabase.CursorFactory), bạn có thể dùng cờ
MODE_WORLD_READABLE và/hoặc cờ MODE_WORLD_WRITEABLE để chophép bất cứ gói nào khác đọc/ghi các tập tin Khi thiết lập những cờ này, tập tin vẫn cònthuộc về ứng dụng nhưng các quyền đọc và/hoặc ghi toàn cục vừa mới được thiết lập mộtcách phù hợp để bất kì ứng dụng nào khác có thể xem nó
III.2 Các quyền đang được sử dụng
Một ứng dụng Android cơ bản không có các quyền tương thích với nó, nghĩa là nó khôngthể làm bất cứ điều gì gây bất lợi cho kinh nghiệm của người dùng hay bất cứ dữ liệu nàotrên thiết bị Để giúp bảo vệ các đặc tính của thiết bị, bạn phải chứa trong tập tinAndroidManifest.xml một hay nhiều hơn các thẻ <uses-permission> để khai báo các sự cho
Trang 37Tại thời điểm cài ứng dụng, các quyền phải yêu cầu ứng dụng đã được chấp nhận bởi cácgói cài đặt, dựa trên các kiểm tra về độ tin cậy của bản quyền và sự tương tác với người
dùng Không kiểm tra người dùng làm gì trong khi một ứng dụng đang thực thi: quá trìnhnày cũng được xác nhận là một sự cho phép đặc biệt to lớn khi cài đặt, và có thể dùng đặctính này khi được yêu cầu (đề nghị), hay sự cho phép này không được chấp nhận và mọi nỗlực để dùng đặc tính này sẽ báo lỗi mà không xuất hiện dấu nhắc dành cho người dùng.Thông thường một sự cho phép không được thực hiện như mong đợi sẽ đưa kết quả vàotrong một biệt lệ SecurityException được ném trở lại cho ứng dụng.Tuy nhiên, điều nàykhông đảm bảo xảy ra mọi nơi.Ví dụ, phương thức broadcastIntent (Intent) kiểm tra cácquyền khi dữ liệu được phân phát cho mỗi người nhận, sau khi phương thức gọi trả về, vì thếbạn sẽ không nhận được một biệt lệ nếu có các lỗi của các quyền.Trong hầu hết tất cả cáctrường hợp, tuy nhiên, một lỗi trong sự cho phép sẽ được in ra cho hệ thống log
Các quyền được cung cấp bởi hệ thống Android có thể được tìm thấy ở gói
Manifest.permission Bất kì ứng dụng nào cũng có thể định nghĩa và tuân theo những sựcho phép bởi chính nó, vì thế đây không phải là danh sách đầy đủ của tất cả các quyền.Một sự cho phép thông thường có thể bị ngăn cấm tại một nhóm các vị trí trong suốt thaotác chương trình của bạn khi:
Tại thời điểm một cuộc gọi đến hệ thống, để ngăn cản hệ thống thực thi các chứcnăng nào đó
Khi bắt đầu một hoạt động, để chống lại tiến trình khởi chạy các hoạt động củanhững ứng dụng khác
Cả việc gởi và nhận intent phát bá, để điều khiển người có thể nhận phát bá củabạn hay người có thể gởi một phát bá cho bạn
Khi truy cập và thao tác trên một trình nội dung
Kết nối hoặc bắt đầu một dịch vụ
III.3 Các quyền trong việc khai báo và có tính bắt buột
Để tuân theo những điều cho phép chính bạn đưa ra, đầu tiên bạn phải khai báo chúngtrong tập tin AndroidManifest.xml, bạn dùng một hay nhiều thẻ <permission>
Ví dụ một ứng dụng muốn điều khiển người bắt đầu một trong các hoạt động có thể khaibáo một sự cho phép bởi thao tác này như sau:
Trang 38<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.google.android.app.myapp" >
<permissionid="com.google.android.app.myapp.permission.DEADLY_ACTIVITY"
android:label="@string/permlab_deadlyActivity"
android:description="@string/permdesc_deadlyActivity" />
</manifest>
Chú ý rằng cả nhãn và phần mô tả sẽ được đáp ứng bởi sự cho phép Chuỗi tài nguyên đã
hiển thị đến người dùng khi họ đang xem một danh sách các quyền (android:label ) hoặc
những chi tiết trên một sự cho phép độc lập (android:description ) Nhãn này ngắn, một vài
từ mô tả từng phần chính về chức năng của quyền được bảo vệ Phần mô tả này sẽ là một cặpcâu mô tả điều cho phép người giữ nó thực hiện Theo quy ước của chúng ta về phần mô tả làhai câu, phần đầu là sự cho phép, phần thứ hai là khuyến cáo người dùng về các vấn đềkhông hay có thể xảy ra nếu một ứng dụng được cứ cho là đã được cho phép
Đây là một ví dụ về một nhãn và sự mô tả sự cho phép CALL_PHONE:
<string name="permlab_callPhone">Call Phone Numbers</string>
<string name="permdesc_callPhone">Allows application to call
phone numbers without your intervention Bad applications may
cause unexpected calls on your phone bill.</string>
Trang 39III.4 Những quyền bắt buột có trong AndroidManifest.xml
Những quyền nằm ở cấp độ cao hạn chế việc truy cập đến các thành phần đầu vào của hệ
thống hay ứng dụng có thể được cung cấp bởi tập tin AndroidManifest.xml của bạn Tất cả
những yêu cầu này đều chứa trong một thuộc tính android:permission trên các thành phầnđược đề nghị, việc đặt tên cho quyền sẽ được dùng để điều khiển truy cập đến nó
Các quyền Activity (cung cấp thẻ <activity>) hạn chế những ai có thể bắt đầu hoạt động
kết hợp Quyền này được kiểm tra trong suốt phương thức Context.startActivity() vàphương thức Activity.startSubActivity(); nếu những cuộc gọi không có yêu cầu của sự chophép thì biệt lệ SecurityException sẽ được ném đi khỏi cuộc gọi
Các quyền Service (cung cấp thẻ <service>) hạn chế những ai có thể bắt đầu hay kết nốivới các dịch vụ kết hợp Quyền này được kiểm tra qua các phương thức
Context.startService(), Context.stopService() và phương thức Context.bindService(), nếu
những cuộc gọi không có sự cho phép thì biệt lệ SecurityException sẽ được ném đi khỏi
cuộc gọi
Các quyền IntentReceiver (cung cấp thẻ <receiver>) hạn chế những ai có thể quảng bácác đối tượng intent cho những người nhận liên quan Quyền này được kiểm tra sau khiphương thức Context.broadcastIntent() trả về, khi hệ thống cố gắng phân phát các intentđược chấp nhận đến những người nhận nhất định Khi có kết quả, một lỗi của quyền bởiquyền này sẽ không trả lại kết quả vào trong một biệt lệ được ném đến cuộc gọi; nó chỉkhông giải phóng intent Theo cùng cách đó, một sự cho phép có thể được cung cấp bởiphương thức Context.registerReceiver() để điều khiển người có thể quảng bá đến mộtngười nhận đã đăng ký chương trình một cách tự động Theo cách khác, một quyền có thểđược cung cấp khi gọi phương thức Context.broadcastIntent() để hạn chế các đối tượng IntentReceiver được phép nhận sự quảng bá
Các phương thức ContentProvider (cung cấp thẻ <provider>) hạn chế ai đó có thể truycập dữ liệu trong một ContentProvider Không giống như các thành phần khác, có hai thuộctính riêng của quyền mà bạn có thể thiết lập: android:readPermission hạn chế ai đó đọc từtrình cung cấp; và android:writePermission hạn chế ai đó có thể ghi lên nó Chú ý rằngmột trình cung cấp là được bảo vệ với cả quyền đọc và viết, chỉ quản lý quyền ghi không cónghĩa là bạn có thể đọc từ một trình cung cấp Các quyền này được kiểm tra khi lần đầu tiên
bạn nhận một trình cung cấp(nếu bạn không có quyền nào,thì một biệt lệ SecurityException
sẽ được ném), và khi bạn thực thi các thao tác trên trình này Dùng phương thức
ContentResolver.query() yêu cầu sự quản lý quyền viết; dùng các phương thức ContentResolver.insert(), ContentResolver.update(), ContentResolver.delete(), hay
phương thức Cursor.commitUpdates() yêu cầu quyền ghi Trong tất cả các trường hợp này,không quản lý các kết quả của quyền được yêu cầu trong một biệt lệ SecurityException
được ném đi từ cuộc gọi
III.5 Việc tuân theo các quyền khi quảng bá các intent
Sự cho phép tuân theo đối tượng gởi các intent đến một IntentReceiver được đăng ký có
Trang 40Context.broadcastIntent() với một sự cho phép dạng String, bạn nên đề nghị một ứng dụng
của bên nhận phải quản lý các quyền để nhận intent của bạn
Chú ý rằng cả bên nhận và bên quảng bá đều có thể yêu cầu cùng một sự cho phép Khiđiều này xảy ra, sự kiểm tra cả hai quyền cho phép đó đều phải đưa đến intent để được phânphát đến đích kết nối
III.6 Cho phép thực thi các quyền khác
Tùy tiện chia nhỏ sự cho phép có thể bắt buột bất kì cuộc gọi nào đến vào trong một dịch
vụ Nó được hoàn thành bởi phương thức Context.checkCallingPermission() Gọi một sựcho phép yêu cầu dạng String và nó sẽ trả về một số nguyên nhằm có thể xem sự cho phépnày là tiến trình gọi tức thời Chú ý rằng điều này chỉ có thể được dùng khi bạn đang thực thimột cuộc gọi đến từ một tiến trình khác, thường thông qua một giao diện IDL được tạo ra từmột dịch vụ hay theo một số cách được cho bởi các tiến trình khác
Có một vài cách hữu dụng để kiểm tra những sự cho phép này Nếu bạn có pid của tiếntrình khác, bạn có thể dùng Context.checkPermission (String, int, int) của phương thứcContext để cho phép kiểm tra ngược pid này Nếu bạn có tên gói của ứng dụng khác, bạndùng để điều khiển PackageManager.checkPermission(String, String) của phương thứcPackageManager để loại ra những gói cụ thể vừa mới được xem như là một sự cho phép mộtcách phép rõ ràng
III.7 Các tài nguyên và quốc tế hóa
Việc mô tả chi tiết các ứng dụng Android, cụ thể là hệ thống quản lý tài nguyên, (gồmcách nó dùng nhằm mục đích quốc tế hóa (internationalization) và cục bộ hóa (localization))bao hàm cách dùng theo từng quốc tế và khu vực "Tài nguyên" là các tài sản ứng dụng (nhưhình ảnh, các chuỗi được xác định, cách thể hiện XML), cái cần được giải quyết lúc thực thi.Trong phần này mô tả cách Android giải quyết như thế nào đối với tài nguyên lấy từ chínhmột sự lựa chọn của chúng, nó cũng tốt như khi tạo và sử dụng các tài nguyên
Tài nguyên và các tập tin mở rộng (và vì thế nó không phải là tập tin nguồn) thường đượcdùng trong mã nguồn và biên dịch trong ứng dụng của bạn khi thực thi Android cung cấpmột nhóm các loại tập tin tài nguyên khác nhau, gồm cả tập tin XML, PNG, JPEG Tập tinXML có rất nhiều định dạng khác nhau phụ thuộc vào thứ mà nó được mô tả