Tài liệu Lập trình mạng trên android: TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT HƯNG YÊN 
KHOA CÔNG NGHỆ THÔNG TIN 
*** 
HỌC PHẦN: CHUYÊN ĐỀ 3 
LẬP TRÌNH MẠNG TRÊN ANDROID 
HỆ: ĐẠI HỌC 
(tài liệu lưu hành nội bộ) 
Hưng Yên – Tháng 1 năm 2017 
Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android 
Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 1 
MỤC LỤC 
Bài 1 Tổng quan về module .................................................................................................. 1 
1.1. Tổng quan về module ................................................................................................... 1 
1.2. Một số thư viện thường dùng trong android .................................................................. 1 
1.2. Tiến trình và luồng ....................................................................................................... 3 
1.2.1 Tiến trình ................................................................................................................ 3 
1.2.2. Luồng ............
                
              
                                            
                                
            
 
            
                 190 trang
190 trang | 
Chia sẻ: putihuynh11 | Lượt xem: 664 | Lượt tải: 0 
              
            Bạn đang xem trước 20 trang mẫu tài liệu Lập trình mạng trên android, để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT HƯNG YÊN 
KHOA CÔNG NGHỆ THÔNG TIN 
*** 
HỌC PHẦN: CHUYÊN ĐỀ 3 
LẬP TRÌNH MẠNG TRÊN ANDROID 
HỆ: ĐẠI HỌC 
(tài liệu lưu hành nội bộ) 
Hưng Yên – Tháng 1 năm 2017 
Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android 
Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 1 
MỤC LỤC 
Bài 1 Tổng quan về module .................................................................................................. 1 
1.1. Tổng quan về module ................................................................................................... 1 
1.2. Một số thư viện thường dùng trong android .................................................................. 1 
1.2. Tiến trình và luồng ....................................................................................................... 3 
1.2.1 Tiến trình ................................................................................................................ 3 
1.2.2. Luồng .................................................................................................................... 3 
1.2.3. Lớp Hander ........................................................................................................... 3 
1.2.4. Giới thiệu đa luồng ................................................................................................ 6 
1.3. AsyncTask ................................................................................................................... 7 
1.3.1. Tổng quan về lớp AsyncTask ................................................................................. 7 
1.3.2. Mô tả lớp AsyncTask ............................................................................................. 7 
1.3.3. Ứng dụng tải ảnh từ internet .................................................................................. 9 
1.3.4. Ứng dụng ProgressBar với AsyncTask ................................................................. 11 
Bài 2 Tin nhắn ...................................................................................................................... 14 
2.1. SmsManager .............................................................................................................. 14 
2.1.1. Giới thiệu SmsManager ....................................................................................... 14 
2.1.2. Để thực hiện xây dựng ứng dụng với SmsManager qua các bước sau: .................. 14 
2.2. Telephony .................................................................................................................. 17 
2.2.1. Giới thiệu Telephony Manager ............................................................................ 17 
2.2.2. Thao tác với Telephony Manager ......................................................................... 17 
2.3. Intent ......................................................................................................................... 19 
2.3.1. Định nghĩa ........................................................................................................... 19 
2.3.2. Phương thức và mô tả Intent ................................................................................ 19 
2.3.3. Thao tác với intent ............................................................................................... 20 
2.4. BroadcastReceiver ..................................................................................................... 20 
2.4.1. Giới thiệu về Broadcast Receiver ......................................................................... 20 
2.4.2. Ứng dụng thông báo thay đổi trạng thái wifi ........................................................ 21 
2.4.3. Ví dụ ứng dụng BroadCast tự định nghĩa ............................................................. 22 
Bài 3 Thư điện tử ................................................................................................................. 25 
3.1. Gửi email ................................................................................................................... 25 
3.1.1. Intent Object – Những hỗ trợ để sử dụng tính năng Email .................................... 25 
3.1.2. Intent ứng dụng trong gửi email ........................................................................... 26 
3.2. Gmail API .................................................................................................................. 26 
3.3. Một số chức năng của email ....................................................................................... 27 
3.3.1. Xem email ........................................................................................................... 27 
3.3.2 Tạo thư nháp ......................................................................................................... 28 
3.3.3 Cập nhật thư rác .................................................................................................... 30 
3.3.4 Gửi thư rác ........................................................................................................... 30 
Bài 4 Ứng dụng tin nhắn và ứng dụng thư điện tử ................................................................. 31 
4.1. Tổng hợp kiến thức liên quan ..................................................................................... 31 
4.2. Ứng dụng tin nhắn SMS ............................................................................................. 31 
4.3. Ứng dụng thư điện tử ................................................................................................. 40 
Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android 
Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 2 
Bài 5 Một số dịch vụ trên google .......................................................................................... 43 
5.1. Giới thiệu Google service .......................................................................................... 43 
5.2. Google Map Service .................................................................................................. 43 
5.2.1. Một số ứng dụng của Google Map API ................................................................ 45 
5.2.2 Yêu cầu để hiển thị bản đồ sử dụng google map ................................................... 45 
5.3. Mapview .................................................................................................................... 48 
5.3.1. Giới thiệu Mapview ............................................................................................. 48 
5.3.2. Sử dụng Mapview cơ bản .................................................................................... 48 
5.3.3. Xây dựng ứng dụng hiển thị vị trí của 1 địa điểm trên bản đồ .............................. 48 
5.4. Location Base Service ............................................................................................... 55 
5.4.1 The Location Object ............................................................................................. 56 
5.4.2. LocationManager ................................................................................................ 57 
5.4.3. Ứng dụng vị trí .................................................................................................... 58 
Bài 6 Ứng dụng Location Base service ................................................................................. 63 
6.1. Tìm tọa độ của 1 địa điểm .......................................................................................... 63 
6.1.1. Tìm tọa độ của 1 địa điểm với google map .......................................................... 63 
6.1.2. Tìm tọa độ của 1 địa điểm với Google Earth ........................................................ 63 
6.2. Các phương thức của lớp Map ................................................................................... 65 
6.3. Ứng dụng tìm đường đi giữa 2 vị trí dung Google Map Direction API ....................... 67 
Bài 7 Kết nối với tài nguyên Internet .................................................................................... 68 
7.1. Giới thiệu WebView .................................................................................................. 68 
7.1.1. Giới thiệu WebView ............................................................................................ 68 
7.1.2. Thao tác với WebView qua các bước sau: ........................................................... 68 
7.1.3. Ví dụ ................................................................................................................... 68 
7.2. Giới thiệu ConnectionReceiver và NetworkInfo ......................................................... 70 
7.2.1. Lớp ConnectivityManager ................................................................................... 70 
7.2.2 Lớp NetworkInfo.................................................................................................. 71 
7.3. Quản lý mạng và kết nối mạng ................................................................................... 71 
7.3.1. Kiểm tra trạng thái kết nối mạng.......................................................................... 71 
7.3.2. Ứng dụng cảnh báo khi trạng thái kết nối mạng thay đổi với BroadcashReceiver . 74 
Bài 8 Sử dụng nguồn dữ liệu từ internet ............................................................................... 76 
8.1. Định vị tài nguyên ..................................................................................................... 76 
8.1.1. Liên kết ............................................................................................................... 76 
8.1.2. Định nghĩa URL .................................................................................................. 76 
8.1.3. Cấu trúc của URL ................................................................................................ 76 
8.2. HTML và RSS ........................................................................................................... 77 
8.2.1. Định nghĩa HTML ............................................................................................... 77 
8.2.2. Cấu trúc cây HTML cơ bản ................................................................................. 77 
8.2.3. HTML và CSS .................................................................................................... 78 
8.2.4. Một số thể hay dùng trong HTML ....................................................................... 79 
8.2.5. RSS ..................................................................................................................... 79 
8.2.6. Đặc tả RSS .......................................................................................................... 80 
8.2.7. Một số phần tử của RSS ...................................................................................... 81 
8.3. Một số lớp liên quan tới ............................................................................................. 81 
8.3.1. Giới thiệu lớp URL ............................................................................................. 81 
Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android 
Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 3 
8.3.2. Giới thiệu lớp URLConnection ............................................................................ 82 
8.3.3. Giới thiệu lớp HttpURLConnection ..................................................................... 83 
8.4. Lấy dữ liệu đơn giản từ URL trên internet .................................................................. 84 
8.4.1. Load dữ liệu văn bản từ internet về điện thoại ...................................................... 84 
8.4.2. Load ảnh từ internet ............................................................................................. 86 
8.4.3. Load nhạc từ internet ........................................................................................... 89 
Bài 9 Ứng dụng duyệt web Webmini và đọc tin tức .............................................................. 89 
9.1. Tổng hợp kiên thức liên quan ..................................................................................... 89 
9.2. Ứng dụng duyệt web Webmini ................................................................................... 89 
9.3. Ứng dụng đọc báo ...................................................................................................... 94 
Bài 10 Một số khái niệm cơ bản về dịch vụ mạng ................................................................. 95 
10.1. Một số khái niệm cơ bản .......................................................................................... 95 
10.1.1. Mô hình OSI ...................................................................................................... 95 
10.1.2. Giao thức ........................................................................................................... 96 
10.1.3. Địa chỉ IP........................................................................................................... 97 
10.1.4. Cổng (Port) ........................................................................................................ 98 
10.1.5. Mô hình hướng kết nối TCP/IP .......................................................................... 98 
10.1.6. So sánh sự khác nhau giữa TCP và UDP .......................................................... 100 
10.1.6. Mô hình OSI và TCP/IP ................................................................................... 101 
10.2. Giới thiệu WebService ........................................................................................... 101 
10.2.1. Giới thiệu WebService ..................................................................................... 101 
10.2.2. Định nghĩa WebService ................................................................................... 101 
10.2.3. Đặc điểm của Web service ............................................................................... 102 
10.2.4. Ưu và nhược điểm ........................................................................................... 102 
10.3. Kiến trúc của Web service ...................................................................................... 103 
10.3.1. Kiến trúc của Web service ............................................................................... 103 
10.3.2.Thành phần cơ bản của Web service ................................................................. 104 
10.4. Xây dựng và triển khai dịch vụ mạng cho ứng dụng di động................................... 105 
10.4.1. Giới thiệu......................................................................................................... 105 
10.4.2. Các bước chính trong triển khai dịch vụ mạng cho ứng dụng di động ............... 106 
10.4.3. Giao tiếp client và server ................................................................................. 106 
10.5. Một số công nghệ lập trình mạng ........................................................................... 106 
10.5.1. Công nghệ Web Service ................................................................................... 107 
Bài 11 Định dạng dữ liệu XML .......................................................................................... 110 
11.1. Tổng quan về XML ................................................................................................ 110 
11.1.1. Giới thiệu XML ............................................................................................... 110 
11.1.2. XML và HTML ............................................................................................... 110 
11.1.3. XML đã làm cải thiện dịch vụ Web .................................................................. 111 
11.2. Đặc tả cấu trúc và nội dung tài liệu XML ............................................................... 112 
11.2.1. Các quy tắc văn bản XML ............................................................................... 112 
11.2.2. Cú pháp của XML ........................................................................................... 114 
11.2.3. Đặc tả tài liệu XML ......................................................................................... 116 
11.2.4. Ví dụ đặc tả tệp XML ...................................................................................... 117 
11.2.5. Tài liệu XML hợp lệ ........................................................................................ 118 
11.2.6 Tạo tài liệu XML hợp lệ ................................................................................... 120 
Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android 
Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 4 
11.3. Phân tích dữ liệu XML ........................................................................................... 121 
13.3.1. Phân tích XML bằng kỹ thuật DOM ................................................................ 122 
13.3.2. Phân tích XML bằng kỹ thuật SAX ................................................................. 123 
13.3.3. Kỹ thuật DOM và kỹ thuật SAX ...................................................................... 124 
11.4. Tạo một tài liệu XML trên android ......................................................................... 124 
Bài 12 Định dạng dữ liệu JSON ......................................................................................... 129 
12.1. Giới thiệu JSON .................................................................................................... 129 
12.1.1. Giới thiệu về JSON ......................................................................................... 129 
12.1.2. Định nghĩa JSON ............................................................................................ 129 
12.1.3. Ưu điểm của Json ............................................................................................ 129 
12.2. Cấu trúc tệp JSON ................................................................................................. 129 
12.2.1. Cấu trúc tệp JSON ........................................................................................... 129 
12.2.2. Ví dụ mô tả JSON ........................................................................................... 131 
12.3. Thao tác với tệp định dạng JSON ........................................................................... 132 
12.3.1. Tổng quan về thao tác với tệp JSON ................................................................ 132 
12.3.2. Các bước thực hiện thao tác với URL định dạng JSON .................................... 132 
12.3.3. Đọc databse dạng jSON ................................................................................... 133 
12.4. JSON và XML ....................................................................................................... 134 
Bài 13 Dịch vụ Web với WebService ................................................................................. 136 
13.1. Cấu hình IIS và SQL .............................................................................................. 136 
13.1.1. Cài đặt IIS ....................................................................................................... 136 
13.1.2. Cấu hình SQL .................................................................................................. 137 
13.2. Khởi tạo WebService ............................................................................................. 138 
13.2.1. Các bước xây dựng WebService ...................................................................... 138 
13.2.2. Xây dựng WebService hỗ trợ các phép tính cộng ............................................. 139 
Bài 14 Lập trình dịch vụ mạng Xây dựng ứng dụng di động ............................................... 142 
14.1. Tổng hợp một số kiến thức liên quan ..................................................................... 142 
14.1.1. Sử dụng AsyncTask ......................................................................................... 142 
14.1.2. Thư viện KSOAP 2 ......................................................................................... 142 
14.1.3. Thư viện Retrofit ............................................................................................. 142 
14.2. Ứng dụng WebService ........................................................................................... 142 
Bài 15 Dịch vụ Web với WebAPI ...................................................................................... 152 
15.1 Tổng quan về Web API ........................................................................................... 152 
15.1.1. Giới thiệu API ................................................................................................. 152 
15.1.2 Giới thiệu Web API .......................................................................................... 152 
15.1.3. Đặc điểm Web API (.NET 4.0 trở lên) ............................................................. 153 
15.1.4. Công cụ phát triển Web API ............................................................................ 153 
15.2. Khởi tạo và cấu hình Web API ............................................................................... 154 
15.2.1 Tạo ứng dụng Web API bằng Visual Studio ..................................................... 154 
15.2.2 Tạo ứng dụng Web API đầu tiên ....................................................................... 156 
Bài 16 Ứng dụng Dịch vụ Web theo công nghệ WebAPI ................................................... 160 
16.1. Tổng hợp một số khái niệm lien quan với WebAPI ................................................ 160 
16.1.1. Tạo Web API: ................................................................................................. 160 
16.1.2. TẠO WEB API BẰNG NODEJS, CSDL MONGODB(NoSQL) ..................... 160 
16.2. Ứng dụng quản lý account với Web API ................................................................ 161 
Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android 
Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 5 
16.3. Xây dựng app android đọc account từ Web API ..................................................... 166 
Bài 17 Giới thiệu về bảo mật trên mobile ............................................................................ 171 
17.1.Giới thiệu ................................................................................................................ 171 
17.2. Các mức bảo vệ trên mạng ..................................................................................... 171 
17.2.1. Bảo vệ Quyền truy nhập ................................................................................... 171 
17.2.2. Đăng ký tên /mật khẩu. .................................................................................... 171 
17.2.3. Mã hoá dữ liệu ................................................................................................. 172 
17.2.4. Bảo vệ vật lý .................................................................................................... 172 
17.2.5. Tường lửa ........................................................................................................ 172 
17.2.6. Quản trị mạng .................................................................................................. 172 
17.2.7. An toàn thông tin bằng mật mã ........................................................................ 173 
17.3. Một số phương pháp bảo mật ứng dụng Android .................................................... 173 
17.3.1. Lưu trữ nội bộ .................................................................................................. 174 
17.3.2. Mã hóa dữ liệu trên bộ nhớ ngoài ..................................................................... 174 
17.3.3. Sử dụng Intents cho IPC .................................................................................. 174 
17.3.4. Sử dụng HTTPS............................................................................................... 175 
17.3.5. Sử dụng GCM thay cho SMS ........................................................................... 176 
17.3.6. Tránh Yêu cầu dữ liệu cá nhân ......................................................................... 176 
17.3.7. Xác nhận User Input ........................................................................................ 176 
17.3.8. Sử dụng ProGuard Trước khi Publishing .......................................................... 177 
17.4. Tạo chữ ký kỹ thuật số trong ứng dụng Android ..................................................... 177 
17.4.1 Giới thiệu ......................................................................................................... 177 
17.4.2. Tạo chữ ký kỹ thuật số trong ứng dụng Android .............................................. 178 
Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android 
Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 2 
DACH MỤC TỪ VIẾT TẮT 
STT Từ viết tắt Cụm từ đầy đủ 
1 API Application Programming Interface 
2 CSS Cascading Style Sheets 
3 DB DataBase 
4 GCM Google Cloud Messaging
5 GPS Global Positioning Service 
6 GUI Graphical User Interface 
7 HTML Hyper Text Markup Language 
8 HTTP Hyper Text Transfer Protocol 
9 HTTPS Secure Hyper Text Transfer Protocol 
10 IP Internet Protocol 
11 JDBC Java Database Connectivity 
12 JSON JavaScript Object Notation 
13 LINQ Language Integrated Query 
14 REST Representational State Transfer 
15 RESTFul Representational State Transfer 
16 RPC Remote Procedure Calls 
17 RSS Really Simple Syndication 
18 SOAP Simple Object Access Protocol 
19 SQL Structured Query Language 
20 SSL Secure Sockets Layer 
21 TCP Transmission Control Protocol 
22 
TCP/IP 
Transmission Control Protocol/Internet 
Protocol 
23 URI Uniform Resource Identifier 
24 URL Uniform Resource Locator 
25 WCF Windows Communication Foundation 
26 WSDL Web Service Description Language 
27 XML Extensible Markup Language 
Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android 
Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 3 
DANH MỤC HÌNH VẼ, BẢNG 
Hình 1. Hình ảnh mô phòng MultiThreading. ........................................................................ 7 
Hình 2. Lớp kế thừa từ lớp AsyncTask .................................................................................. 8 
Hình 3. Mô hình làm việc AsyncTask ................................................................................... 8 
Hình 4. Thứ tự thực hiện các phương thức của lớp AsyncTask .............................................. 9 
Hình 5. Kết quả ứng dụng ProgressBar ............................................................................... 13 
Hình 6. Hoạt động Broadcast Receiver................................................................................ 21 
Hình 7. Các kiểu giao diện hiển thị bản đồ mà Google Maps cung cấp ................................ 44 
Hình 8. API key và google service ...................................................................................... 45 
Bảng 1. Bảng một số phương thức hay sử dụng lớp Location .......................................... 56 
Bảng 2. Các tham số của phương thức locationManager.requestLocationUpdates ............ 57 
Hình 9. Lấy tọa độ của 1 địa điểm với google map .............................................................. 63 
Hình 10. Lấy tọa độ của 1 địa điểm với google Earth ........................................................ 64 
Bảng 3. Các phương thức của lớp Map ............................................................................ 65 
Bảng 4. Các thuộc tính của lớp Map ................................................................................ 66 
Bảng 5. Sự kiện của Map ................................................................................................. 66 
Bảng 6. Các điều khiển của Map ...................................................................................... 66 
Hình 11. Cấu trúc trang web theo định dạng HTML .......................................................... 78 
Hình 12. Cấu trúc trang web theo định dạng HTML5 ........................................................ 78 
Bảng 7. Bảng các phương thức khởi tạo của lớp URL ...................................................... 81 
Bảng 8. Bảng một số phương thức trong lớp URL ........................................................... 82 
Bảng 9. Bảng mô tả các chức năng trong mô hình OSI..................................................... 96 
Hình 13. Phương thức hoạt động của bộ giao thức TCP/IP ................................................ 99 
Hình 14. Mô hình OSI và cụm giao thức TCP/IP ............................................................. 101 
Hình 15. Kiến trúc của Web service ................................................................................ 103 
Hình 16. Mô hình giao tiếp client và server ..................................................................... 106 
Hình 17. Kiến trúc WCF ................................................................................................. 107 
Hình 18. Kiến trúc WebAPI ............................................................................................ 109 
Hình 19. Phân tích cú pháp của XML .............................................................................. 114 
Hình 20. Phân tích XML bằng kỹ thuật DOM ................................................................. 122 
Hình 21. Cấu trúc tệp JSON ............................................................................................ 131 
Hình 22. Cài đặt IIS ........................................................................................................ 137 
Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android 
Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 1 
Bài 1 Tổng quan về module 
1.1. Tổng quan về module 
Module này giới thiệu cho người học về dịch vụ mạng và các đối tượng thư viện hỗ 
trợ việc lập trình dịch vụ mạng trên android. Dịch vụ và dịch vụ mạng được giới thiệu trong 
module gồm: Các dịch vụ trên điện thoại, dịch vụ của google, dịch vụ trên web. Một số vấn 
đề liên quan được giới thiệu như: khái niệm webservice, cụm giao thức mạng, các loại dữ liệu 
XML, JSON lưu trữ dữ liệu trên internet. 
1.2. Một số thư viện thường dùng trong android 
1. Gson 
Gson là thư viện Android dùng để tạo ra Json từ Java Object hoặc gắn giá trị cho Java 
Object từ Json. Thư viện này thường được sử dụng khi tương tác với APIs. Chúng ta thường 
sử dụng Json bởi vì nó nhẹ và đơn giản hơn so với XML. 
2. Retrofit 
Trên trang chủ của Retrofit có câu: “Retrofit turns your REST API into a Java 
interface” nói lên đầy đủ chức năng của nó. Đây là một giải pháp tuyệt vời để tổ chức các lời 
gọi API trong một dự án. Các lời gọi request được thêm đơn giản và tiện dụng. Ta sử 
dụng Callback để lấy kết quả các request gửi lên. 
Sử dụng thư viện Retrofit Trang chủ:  
Retrofit là một Rest Client (Tìm hiểu thêm về chuẩn RESTFul dưới link tham khảo) 
cho Android và Java và được tạo ra bởi Square. Họ làm cho việc nhận và tải lên JSON (hoặc 
dữ liệu khác) một cách khá dễ dàng tới một WebService dựa trên mô hình REST. 
Để làm việc với Retrofit cần triển khai cơ bản 3 lớp: 
– Model class to map JSON Data 
– Interfaces để định nghĩa các API cho Webservice 
– Retrofit.Builder Lớp để định nghĩa URL Endpoint cho các hoạt động liên quan tới 
Http 
3. EvenBus 
EvenBus là thư viện làm đơn giản giao tiếp giữa các phần trong ứng dụng của bạn. Ví 
dụ, để gửi dữ liệu từ Activity tới Service đang chạy, hoặc gửi dữ liệu giữa các Fragment. 
4. ActiveAndroid 
ActiveAndroid là một ORM dành cho Android. Nó là một trừu tượng của SQLite cho 
phép bạn giao tiếp với database trong một device khi không phải viết câu lệnh SQL. 
5. Universal Image Loader 
UIL là thư viện cung cấp asynchronous, caching hình ảnh  
6. KSOAP 
KSOAP2 là một thư viện nhẹ để sử dụng trong các thiết bị bị ràng buộc. Nó không 
phải là một thư viện bao gồm tất cả thư viện do-it-all. Tuy nhiên nó có nghĩa là để tương tác 
với hầu hết các động cơ SOAP phổ biến. 
SOAP đưa ra một số chi phí đáng kể cho các dịch vụ web có thể là vấn đề đối với các 
thiết bị di động. Nếu bạn có toàn quyền kiểm soát máy khách và máy chủ, kiến trúc dựa trên 
REST / JSON đơn giản có thể đầy đủ hơn. KSOAP2 được tạo thành từ một trình phân tích cú 
pháp XML, một bộ phân tách de / và một lớp vận chuyển. 
Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android 
Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 2 
7. Piccaso 
Khi tải hình ảnh từ web, thì bạn nên sử dụng Picasso vì nó đơn giản và dễ dàng và tôi 
thực sự như thế nào API được viết. 
Các bước bạn cần thực hiện để tải xuống hình ảnh chỉ với các API Android chuẩn: 
– Nhận URL Hình ảnh 
– Tạo AsyncTask để tải hình ảnh 
– Thực thi AsyncTask 
– Lưu trữ kết quả trong Bitmap 
– Đặt bitmap làm nguồn 
– Hình ảnh Cache cho tương lai 
8.Dagger 
Dagger được biết đến và sử dụng là một thư viện dependency injection trong Android. 
Nó là một dependency injection đơn giản và nhanh cho cả Android và Java, bao gồm 2 phần: 
thư viện Dagger (size 100kb) và trình biên dịch Dagger. 
Thư viện này chứa tất cả những logic cần thiết và một số chú thích.Nó cũng sử dụng 
chuẩn chú thích javax.inject, làm code của bạn khác với các dependency injection khác của 
framework như Spring hay Guice. 
Dagger được cấp phép theo Apache License 2.0, được phát triển và điều hành bởi 
Square và Google và có thể tìm được ở đây:  
9. LeakCanary 
Bạn có biết những người thợ mỏ sử dụng một con chim hoàng yến nhốt trong một 
chiếc lồng, nếu khí gas nhiều đến mức con hoàng yến chết, đó sẽ là dấu hiệu để họ rời khỏi 
mỏ. LeakCanary dễ dàng phát hiện các đối tượng bị rò rỉ bằng cách thêm một vài dòng code 
Java vào code đã có sẵn. Nó miễn phí và dễ dàng sử dụng. 
LeakCanary được cấp phép theo Apache License 2.0, được phát triển và điều hành bởi 
Square và có thể tìm được ở đây: https://github.com/square/leakcanary. 
10. ZXing 
Sử dụng mã vạch và mã QR làm tiêu chuẩn trong các thiết bị đọc dữ liệu. Ban đầu 
được viết bằng Java, nó có thể đọc và tạo mã vạch trên nhiều nền tảng, và nó đã được chuyển 
sang nhiều ngôn ngữ khác. Thư viện này đã được phát triển một thời gian và có cơ sở người 
dùng tốt. Trình đọc mã QR được dùng trên smartphone cũng sử dụng thư viện này. Nó làm 
việc hiệu quả và có lịch sử tốt. 
ZXing được phát triển bởi Sean Oven,Daniel Switkin, ZXing Team và được cấp phép 
theo Apache License 2.0. Nó có thể tìm được ở đây: https://github.com/zxing/zxing 
11. Libphonenumber 
Khi phân tích cú pháp và định dạng số điện thoại, không có nhiều giải pháp sẵn có tốt 
và miễn phí. Rất may, Google team đã đưa ra một thư viện có tên Libphonenumber. Đây có lẽ 
là thư viện tốt và toàn diện nhất để phân tích cú pháp, xác nhận và định dạng số điện thoại. 
Nó khá đơn giản và dễ dàng để sử dụng API và cũng đã được chuyển sang các ngôn 
ngữ khác ngoài JVM như C# và PHP. Libphonenumber được phát triển và điều hành bởi 
Google và được cấp phép Apache License 2.0. Download tại đây: 
https://github.com/googlei18n/libphonenumber 
12.Tape 
Đây là một thư viện khác của Square. Tape là một tập hợp của các lớp để xử lý hàng 
đợi. Thật tuyệt khi xử lý luồng dữ liệu và download dữ liệu trong môi trường không ổn 
định.Thay vì code xử lý hàng đợi bằng tay, Tape sẽ làm thay bạn. Nếu có lỗi nào đó, Tape sẽ 
Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android 
Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 3 
tự động chạy lại lệnh hoặc hoạt động lại một lần nữa. Ngoài ra, tất cả các kết quả trung gian 
sẽ được tự đọng o lưu trữ, đây cũng là một tính năng hữu ích của Tape. 
Tape được được cấp phép Apache License 2.0, bạn có thể tìm tại đây: 
https://github.com/square/tape 
13.Jitpack.io 
Jitpack.io được phát triển bởi nhóm nghiên cứu của Streametry Ltd. Jitpack có thể 
built bất kỳ project GitHub nào và phát hành tới repo Maven công cộng. Nó giúp tiết kiệm 
thời gian và rắc rối khi xây dựng dependency. Nó là một trong những cách đơn giản nhất để 
xuất bản bất kì project GitHub nào như một Maven dependency 
Bạn có thể kiểm tra Jitpack tại đây:  Jitpack uses a custom terms of 
usage license. 
1.2. Tiến trình và luồng 
1.2.1 Tiến trình 
Process là quá trình hoạt động của một ứng dụng. Điều đó nghĩa là gì? Có thể lấy một 
ví dụ như sau, khi bạn click đúp chuột vào biểu tượng MS Word, một process chạy ứng dụng 
Word được khởi tạo. 
1.2.2. Luồng 
 Thread là một tiến trình đơn vị xử lý của máy tính có thể thực hiện một công việc 
riêng biệt. Trong Java các luồng được quản lý bởi máy ảo Java (JVM). 
Thread là một bước điều hành bên trong một process. Một process dĩ nhiên có thể 
chứa nhiều thread bên trong nó. Khi chúng ta chạy ứng dụng Word, hệ điều hành tạo ra một 
process và bắt đầu chạy các thread chính của process đó. 
Điểm quan trọng nhất cần chú ý là một thread có thể làm bất cứ nhiệm vụ gì một 
process có thể làm. Tuy nhiên, vì một process có thể chứa nhiều thread, mỗi thread có thể coi 
như là một process nhỏ. Vậy, điểm khác biệt mấu chốt giữa thread và process là công việc 
mỗi cái thường phải làm. 
Một điểm khác biệt nữa đó là nhiều thread nằm trong cùng một process dùng một 
không gian bộ nhớ giống nhau, trong khi process thì không. Điều này cho phép các thread đọc 
và viết cùng một kiểu cấu trúc và dữ liệu, giao tiếp dễ dàng giữa các thread với nhau. Giao 
thức giữa các process, hay còn gọi là IPC (interprocess communication) thì tương đối phức 
tạp bởi các dữ liệu có tính tập trung sâu hơn. 
1.2.3. Lớp Hander 
Khi một tiến trình được tạo cho một ứng dụng, main thread của nó được dành riêng để 
chạy một message queue, queue này quản lý các đối tượng bậc cao của ứng dụng (activity, 
intent receiver, v.v..) và các cửa sổ mà chúng tạo ra. 
Ta có thể tạo các thead phụ, chúng tương tác với thread chính của ứng dụng qua một 
Handler. 
Khi ta tạo một Handler mới, nó được gắn với message queue của thread tạo ra nó – từ đó trở 
đi, nó sẽ gửi các message và các runnable tới message queue đó và thực thi chúng khi chúng 
ra khỏi message queue. 
Hai ứng dụng chính của Handler: xếp lịch cho các message và runnable cần được thực 
thi vào thời điểm nào đó trong tương tai và xếp hàng một action cần thực hiện tại một thread 
khác. 
Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android 
Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 4 
Một số phương thức hay dùng của Handler 
– Activity.runOnUiThread(Runnable) 
– View.post(Runnable) 
– View.postDelayed(Runnable, long) 
Có 2 cách tạo lớp Handler 
Tạo một lớp thread mới kế thừa từ lớp Thread 
public class NewThread extends Thread{ 
 public void run() 
 { 
 print(“Hello”) 
 } 
} 
Tạo một biến mới của lớp Thread với đối tượng Runnable 
Thread background = new Thread(new Runnable() { 
 public void run() { 
 print(“Hello”) 
 } 
} 
Và để chạy bất kỳ một thread nào ta đều phải gọi phương thức start(); 
 background.start() 
Ví dụ 
import android.os.Handler; 
Handler mHandler = new Handler(); 
// ... 
new Thread() { 
public void run() { 
// Instantiate XML parser 
mHandler.post (new Runnable() { 
public void run() { 
parsingStatus.setText (“Began Parsing...”); 
} 
}); 
// XML Parsing loop here 
// Update parsingStatus has needed 
mHandler.post (new Runnable() { 
public void run() { 
parsingStatus.setText (“Finished parsing...”); 
} 
}); 
} 
}.start(); 
public void onClick(View v) { 
 new Thread(new Runnable() { 
 public void run() { 
Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android 
Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 5 
 // a potentially time consuming task 
 final Bitmap bitmap = 
 processBitMap("image.png"); 
 mImageView.post(new Runnable() { 
 public void run() { 
 mImageView.setImageBitmap(bitmap); 
 } 
 }); 
 } 
 }).start(); 
} 
Bước 1: Tạo Project và thiết lập quyền cần thiết trong file app\Manifest\AndroidManifest.xml 
Bước 2: Thiết kế các giao diện cần thiết cho ứng dụng res\layout\*.xml 
<LinearLayout xmlns:android="" 
android:orientation="vertical" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent"> 
<ProgressBar android:id="@+id/progress" 
style="?android:attr/progressBarStyleHorizontal" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" /> 
Bước 3: Xây dựng các lớp và các chức năng *.java 
import android.app.Activity; 
import android.os.Bundle; 
import android.os.Handler; 
import android.os.Message; 
import android.widget.ProgressBar; 
public class HandlerDemo extends Activity { 
ProgressBar bar; 
Handler handler=new Handler() { 
@Override 
public void handleMessage(Message msg) { 
bar. incrementProgressBy(5); 
} 
}; 
boolean isRunning=false; 
@Override 
Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android 
Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 6 
public void onCreate(Bundle icicle) { 
super. onCreate(icicle); 
setContentView(R.layout.main); 
bar=(ProgressBar)findViewById(R.id.progress); 
} 
public void onStart() { 
super. onStart(); 
bar. setProgress(0); 
Thread background=new Thread(new Runnable() { 
public void run() { 
try { 
for (int i=0;i<20 && isRunning;i++) { 
Thread. sleep(1000); 
handler. sendMessage(handler. obtainMessage()); 
} 
} 
catch (Throwable t) { 
// just end the background thread 
} 
} 
}); 
isRunning=true; 
background. start(); 
} 
public void onStop() { 
super. onStop(); 
isRunning=false; 
} 
} 
1.2.4. Giới thiệu đa luồng 
Multithread là khái niệm cho nhiều tiến trình chạy đồng thời. Một ứng dụng Java ngoài luồng 
chính có thể có các luồng khác thực thi đồng thời làm ứng dụng chạy nhanh và hiệu quả hơn. 
VD: Trong một game đánh nhau có 2 người chơi thì mỗi người chơi sẽ do 1 luồng quản lý. 
Các hoạt cảnh game có thể do một luồng khác quản lý. Làm cho game trở nên sinh động. 
Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android 
Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 7 
Hình 1. Hình ảnh mô phòng MultiThreading. 
Ưu điểm của đa luồng: 
 Mỗi luồng có thể dùng chung và chia sẻ nguồn tài nguyên trong quá trình chạy, nhưng có thể 
thực hiện một cách độc lập. 
Ứng dụng trách nhiệm có thể được tách 
+ Luồng chính chạy giao diện người dung 
+ Các luồng phụ nhiệm gửi đến luồng chính. 
 Luồng mang tính chất trừu tượng 
 Một chương trình đa luồng hoạt động nhanh hơn trên máy tính có cấu hình tốt và mạnh 
* Nhược điểm của đa luồng: 
 Càng nhiều luồng thì xử lý càng phức tạp 
 Cần phát hiện tránh các luồng chết, luồng chạy mà không làm gì trong ứng dụng cả 
1.3. AsyncTask 
1.3.1. Tổng quan về lớp AsyncTask 
AsyncTask là 1 class hỗ trợ, cung cấp cơ chế thuận tiện để di chuyển những xử lý tốn 
thời gian vào những tiến trình chạy ngầm (background thread). Nó cung cấp các sự kiện xử lý 
đồng bộ, đưa ra kết quả khi tiến thành hoàn thành. 
AsyncTask bao gồm 1 tiến trình chạy ngầm và một UI cập nhật kết quả khi tiến trình 
kết thúc(theo “Professional Android 2 Application”) 
1.3.2. Mô tả lớp AsyncTask 
Để tạo task bất đồng bộ này thì cần extend AsyncTask. Cần chỉ định một class thực 
hiện phương thức execute, với format sau: 
AsyncTask 
Nếu không muốn sử dụng tham số truyền vào, tiến độ update, hoặc kết quả trả về, sử dụng 
Void cho tất cả. 
Ví dụ: 
Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android 
Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 8 
Hình 2. Lớp kế thừa từ lớp AsyncTask 
Trong đó các hàm cần chú ý: 
– onPreExecute: hàm này sẽ chạy đầu tiên khi class được gọi. 
– doInBackground: đây là phương thức chạy background nên NÓ KHÔNG ĐƯỢC TƯƠNG 
TÁC VỚI OBJECT Ui (vd như set text cho textview hay showToast ở đây là không được). 
ở đây đặt phần code xử lý tốn thời gian vào, và sử dụng phương thức publishProgress để cho 
phép phương thức onProgressUpdate() update lên UI. 
Khi tiến trình này kết thúc, trả về kết quả cuối cùng cho xử lý onPostExecute. 
– onProgressUpdate: nhận các thông số thông qua phương thức publishProgress trong 
doInBackground. Phương thức này thì đồng bộ với UI đang chạy. 
– onPostExecute: là phương thức được gọi khi doInBackground hoàn thành. 
Giải thích cho ví dụ DownLoad: 
– Ta thực hiện một phương thức dowdload một tập tin. Bạn xử lý như sau: hiện lên một 
progress thông báo % của quá trình download, và hiển thì thông báo thành công khi hoàn 
thành download. Như vậy thì ở: 
– onPreExecute: sẽ hiển thị thanh progress đang ở 0%. 
– doInBackground: thực hiện download, trong này bạn xử lý để lấy được % download là n, 
bàn dùng phương thức publishProgress để truyền n ra ngoài. Chú ý là trong này bạn không thể 
update cái progress lên n% được được. 
– onProgressUpdate: nhận được n và bạn sẽ update cho progress lên n %. 
– onPostExecute: kết thúc download, hiện thị Toast thông báo download thành công. 
Hình 3. Mô hình làm việc AsyncTask 
Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android 
Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 9 
Hình 4. Thứ tự thực hiện các phương thức của lớp AsyncTask 
1.3.3. Ứng dụng tải ảnh từ internet 
Bước 1: Tạo Project và thiết lập quyền cần thiết trong file app\Manifest\AndroidManifest.xml 
Bước 2: Thiết kế các giao diện cần thiết cho ứng dụng res\layout\*.xml 
<LinearLayout xmlns:android="" 
 android:orientation="vertical" android:layout_width="match_parent" 
 android:layout_height="match_parent"> 
 <TextView 
 android:layout_width="wrap_content" 
 android:layout_height="wrap_content" 
 android:textAppearance="?android:attr/textAppearanceLarge" 
 android:text="Ảnh hiển thị" 
 android:id="@+id/textView" /> 
 <ImageView 
 android:layout_width="200dp" 
 android:layout_height="200dp" 
 android:id="@+id/img" 
 android:layout_gravity="center_horizontal" /> 
Bước 3: Xây dựng các lớp và các chức năng *.java 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.net.Uri; 
import android.os.AsyncTask; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.widget.ImageView; 
import com.google.android.gms.appindexing.Action; 
import com.google.android.gms.appindexing.AppIndex; 
import com.google.android.gms.common.api.GoogleApiClient; 
import java.io.IOException; 
import java.net.MalformedURLException; 
import java.net.URL; 
Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android 
Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 10 
public class MainActivity extends AppCompatActivity { 
 ImageView img; 
 String uri = ""; 
 @Override 
 protected void onCreate(Bundle savedInstanceState) { 
 super.onCreate(savedInstanceState); 
 setContentView(R.layout.httpconnection); 
 img = (ImageView) findViewById(R.id.img); 
 //Biến u lấy uri; URL(uri)fair nằm trong try catch 
// B3 Chạy loadImageFromInternet 
 runOnUiThread(new Runnable() { 
 @Override 
 public void run() { 
// Gọi lớp loadImageFromInternet vừa Tạo trong B2 
 new loadImageFromInternet().execute(uri); 
 } 
 }); 
 } 
 // url, %tải về 
 private class loadImageFromInternet extends AsyncTask { 
 //doInBackground: Hàm chỉ hành động. VD này là hành động lấy hình từ internet 
 @Override 
 protected String doInBackground(String... params) { 
 //Biến u lấy uri 
 try { 
 URL u = new URL(params[0]); 
 Bitmap bm=BitmapFactory.decodeStream(u.openConnection().getInputStream()); 
 img.setImageBitmap(bm); 
 } catch (MalformedURLException e) { 
 e.printStackTrace(); 
 } catch (IOException e) { 
 e.printStackTrace(); 
 } 
 return null; 
 } 
 } 
} 
Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android 
Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 11 
1.3.4. Ứng dụng ProgressBar với AsyncTask 
Bước 1: Tạo ứng dụng vào thiết lập quyền truy cập internet 
Bước 2: Thiết kế giao diện main.xml 
<LinearLayout xmlns:android="" 
 xmlns:tools="" 
 android:layout_width="match_parent" 
 android:layout_height="match_parent" 
 android:orientation="vertical" 
 tools:context="com.example.nguyennghia.asynctaskworking.MainActivity"> 
 <ProgressBar 
 android:id="@+id/pb_counter" 
 style="?android:attr/progressBarStyleHorizontal" 
 android:indeterminate="false" 
 android:layout_width="match_parent" 
 android:layout_height="wrap_content" /> 
 <TextView 
 android:id="@+id/tv_message" 
 android:layout_gravity="center" 
 android:layout_width="wrap_content" 
 android:layout_height="wrap_content" /> 
 <Button 
 android:layout_gravity="center" 
 android:text="Start" 
 android:id="@+id/btn_counter" 
 android:layout_width="wrap_content" 
 android:layout_height="wrap_content" /> 
Bước 3.1.Tạo lớp kế thừa từ AsyncTask 
class UpdateProgresBarTask extends AsyncTask{ 
 @Override 
 protected void onPreExecute() { 
 super.onPreExecute(); 
 tvMessage.setText("Update"); 
 } 
 @Override 
 protected Void doInBackground(Integer... params) { 
 int n = params[0]; 
 for(int i = 0; i < n; i++) 
 publishProgress(i); 
 return null; 
 } 
 @Override 
 protected void onProgressUpdate(Integer... values) { 
Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android 
Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 12 
 super.onProgressUpdate(values); 
 pbCounter.setProgress(values[0]); 
 } 
 @Override 
 protected void onPostExecute(Void aVoid) { 
 super.onPostExecute(aVoid); 
 tvMessage.setText("End"); 
 btnCounter.setEnabled(true); 
 } 
} 
Bước 3.2: Tạo lớp MainActivity.java 
package com.example.nguyennghia.asynctaskworking; 
import android.os.AsyncTask; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Button; 
import android.widget.ProgressBar; 
import android.widget.TextView; 
public class MainActivity extends AppCompatActivity { 
 private ProgressBar pbCounter; 
 private TextView tvMessage; 
 private Button btnCounter; 
 private static final int MAX = 100000; 
 @Override 
 protected void onCreate(Bundle savedInstanceState) { 
 super.onCreate(savedInstanceState); 
 setContentView(R.layout.activity_main); 
 pbCounter = (ProgressBar)findViewById(R.id.pb_counter); 
 pbCounter.setMax(MAX); 
 tvMessage = (TextView)findViewById(R.id.tv_message); 
 btnCounter = (Button)findViewById(R.id.btn_counter); 
 btnCounter.setOnClickListener(new View.OnClickListener() { 
 @Override 
 public void onClick(View v) { 
 new UpdateProgresBarTask().execute(MAX); 
 btnCounter.setEnabled(false); 
 } 
 }); 
 } 
Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android 
Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 13 
 class UpdateProgresBarTask extends AsyncTask{ 
 @Override 
 protected void onPreExecute() { 
 super.onPreExecute(); 
 tvMessage.setText("Update"); 
 } 
 @Override 
 protected Void doInBackground(Integer... params) { 
 int n = params[0]; 
 for(int i = 0; i < n; i++) 
 publishProgress(i); 
 return null; 
 } 
 @Override 
 protected void onProgressUpdate(Integer... values) { 
 super.onProgressUpdate(values); 
 pbCounter.setProgress(values[0]); 
 } 
 @Override 
 protected void onPostExecute(Void aVoid) { 
 super.onPostExecute(aVoid); 
 tvMessage.setText("End"); 
 btnCounter.setEnabled(true); 
 } 
 } 
} 
Chạy ứng dụng 
Hình 5. Kết quả ứng dụng ProgressBar 
Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android 
Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 14 
Bài 2 Tin nhắn 
2.1. SmsManager 
2.1.1. Giới thiệu SmsManager 
SmsManager là lớp giúp quản lý SMS như: gửi tin nhắn dữ liệu, text, phương thức dung để 
getDefault(). 
Stt. Phương thức & Miêu tả 
1 ArrayList divideMessage(String text) 
Phương thức này phân chia một thông điệp text thành một số phần nhỏ, không lớn 
hơn kích cỡ thông điệp SMS tối đa 
2 static SmsManager getDefault() 
Phương thức này được sử dụng để lấy instance mặc định của SmsManager 
3 void sendDataMessage(String destinationAddress, String scAddress, short 
destinationPort, byte[] data, PendingIntent sentIntent, PendingIntent 
deliveryIntent) 
Phương thức này được sử dụng để gửi một dữ liệu dựa trên SMS tới một cổng 
(port) ứng dụng cụ thể 
4 void sendMultipartTextMessage(String destinationAddress, String scAddress, 
ArrayList parts, ArrayList sentIntents, 
ArrayList deliveryIntents) 
Gửi một text có nhiều phần dựa trên SMS 
5 void sendTextMessage(String destinationAddress, String scAddress, String text, 
PendingIntent sentIntent, PendingIntent deliveryIntent) 
Gửi một text dựa tên SMS 
2.1.2. Để thực hiện xây dựng ứng dụng với SmsManager qua các bước sau: 
Bước 1 Tạo project. 
Cấp quyền tương ứng trong 
AndroidManifest.xml của project, đặt dòng 
Bước 2 Thiết kế giao diện mainactivity.xml 
Cần có editText nhập số điện thoại; editText nhập nội dung tin nhắn ; buttons end để thực 
hiện hành động gửi tin nhắn đi trong send.xml 
Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android 
Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 15 
<LinearLayout xmlns:android="" 
 android:layout_width="match_parent" 
 android:layout_height="match_parent" 
 android:orientation="vertical"> 
 <TextView 
 android:id="@+id/textView" 
 android:layout_width="match_parent" 
 android:layout_height="wrap_content" 
 android:gravity="center" 
 android:text="SENDING SMS" 
 android:textSize="40dp" /> 
 <EditText 
 android:id="@+id/edtPhone" 
 android:layout_width="match_parent" 
 android:layout_height="wrap_content" 
 android:hint="Nhập số điện thoại" 
 android:inputType="phone" /> 
 <EditText 
 android:id="@+id/edtMessage" 
 android:layout_width="match_parent" 
 android:layout_height="wrap_content" 
 android:hint="Nhập tin nhắn" 
 android:inputType="text" /> 
 <Button 
 android:id="@+id/btnSend1" 
 android:layout_width="100dp" 
 android:layout_height="wrap_content" 
 android:layout_gravity="center" 
 android:text="Send" /> 
Bước 3 Code 
Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android 
Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 16 
3.1 Import các package cần thiết cho việc gửi SMS 
import android.telephony.SmsManager; 
3.2 Ra lệnh gửi SMS với số điện thoại là phoneNumber (String) và tin nhắn message (String) 
muốn gửi 
SmsManager smsManager = SmsManager.getDefault(); 
smsManager.sendTextMessage("phoneNo", null, "sms message", null, null); 
Cụ thể trong MainActivity.java như sau 
package diepnh.sms; 
import android.content.Intent; 
import android.net.Uri; 
import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 
import android.telephony.SmsManager; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.Toast; 
public class MainActivity extends AppCompatActivity { 
 Button btnsend1; 
 EditText edtphone, edtmessage; 
 @Override 
 protected void onCreate(Bundle savedInstanceState) { 
 super.onCreate(savedInstanceState); 
 setContentView(R.layout.sendsms); 
 edtphone = (EditText) findViewById(R.id.edtPhone); 
 edtmessage = (EditText) findViewById(R.id.edtMessage); 
 btnsend1 = (Button) findViewById(R.id.btnSend1); 
 btnsend1.setOnClickListener(new View.OnClickListener() { 
 @Override 
 public void onClick(View v) { 
 sendSMS(); 
 } 
 }); 
 } 
 protected void sendSMS() { 
 String phone = edtphone.getText().toString(); 
 String message = edtmessage.getText().toString(); 
 try { 
Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android 
Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 17 
 SmsManager manager = SmsManager.getDefault(); 
 manager.sendTextMessage(phone, null, message, null, null); 
 Toast.makeText(SendSMS.this, "SMS Succedded, ConGradulation!", 
Toast.LENGTH_SHORT).show(); 
 setContentView(R.layout.sendsms); 
 } catch (android.content.ActivityNotFoundException ex) { 
 Toast.makeText(SendSMS.this, "SMS faild, please try again later.", 
Toast.LENGTH_SHORT).show(); 
 } 
 } 
} 
2.2. Telephony 
2.2.1. Giới thiệu Telephony Manager 
Telephony Manager cung cấp quyền truy cập vào thông tin về các dịch vụ điện thoại 
trên thiết bị. Ứng dụng có thể sử dụng các phương thức trong lớp này để xác định các dịch vụ 
điện thoại và các quốc gia, cũng như truy cập vào một số loại thông tin thuê bao. Ứng dụng 
cũng có thể đăng ký một người biết lắng nghe để nhận được thông báo của nhà nước thay đổi 
điện thoại. 
Lớp này không khởi tạo lớp này trực tiếp; thay vào đó, bạn lấy một tham chiếu đến 
một thể hiện qua Context.getSystemService (Context.TELEPHONY_SERVICE). 
2.2.2. Thao tác với Telephony Manager 
Bước 1 Tạo project và cấp quyền tương ứng trong AndroidManifest.xml của project, đặt 
dòng 
Bước 2 Thiết kế giao diện activity_main.xml gồm TextView để hiển thị thong tin 
<RelativeLayout xmlns:android="" 
 xmlns:tools="" 
 android:id="@+id/activity_main" 
 android:layout_width="match_parent" 
 android:layout_height="match_parent" 
 android:paddingBottom="@dimen/activity_vertical_margin" 
 android:paddingLeft="@dimen/activity_horizontal_margin" 
 android:paddingRight="@dimen/activity_horizontal_margin" 
 android:paddingTop="@dimen/activity_vertical_margin" 
 tools:context="diepnh.telephonemanagerdemo.MainActivity"> 
 <TextView 
 android:layout_width="wrap_content" 
 android:layout_height="wrap_content" 
 android:id="@+id/TextViewphoneInfo" 
 android:text="Thông tin:" /> 
Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android 
Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 18 
Accessing the Telephony Manager: 
TelephonyManager 
tm=(TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE); 
package diepnh.telephonemanagerdemo; 
import android.content.Context; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.telephony.TelephonyManager; 
import android.widget.TextView; 
public class MainActivity extends AppCompatActivity { 
 TextView phoneInfo; 
 String info = "Phone Details:\n"; 
 @Override 
 protected void onCreate(Bundle savedInstanceState) { 
 super.onCreate(savedInstanceState); 
 setContentView(R.layout.activity_main); 
 phoneInfo = (TextView) findViewById(R.id.TextViewphoneInfo); 
 //Get the instance of TelephonyManager 
 TelephonyManager tm = (TelephonyManager) 
getSystemService(Context.TELEPHONY_SERVICE); 
 //Calling the methods of TelephonyManager the returns the information 
 String IMEINumber = tm.getDeviceId(); 
 String subscriberID = tm.getDeviceId(); 
 String SIMSerialNumber = tm.getSimSerialNumber(); 
 String networkCountryISO = tm.getNetworkCountryIso(); 
 String SIMCountryISO = tm.getSimCountryIso(); 
 String softwareVersion = tm.getDeviceSoftwareVersion(); 
 String voiceMailNumber = tm.getVoiceMailNumber(); 
 //Get the phone type 
 String strphoneType = ""; 
 int phoneType = tm.getPhoneType(); 
 switch (phoneType) { 
 case (TelephonyManager.PHONE_TYPE_CDMA): 
 strphoneType = "CDMA"; 
 break; 
Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android 
Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 19 
 case (TelephonyManager.PHONE_TYPE_GSM): 
 strphoneType = "GSM"; 
 break; 
 case (TelephonyManager.PHONE_TYPE_NONE): 
 strphoneType = "NONE"; 
 break; 
 } 
 //getting information if phone is in roaming 
 boolean isRoaming = tm.isNetworkRoaming(); 
 info += "\n IMEI Number:" + IMEINumber; 
 info += "\n SubscriberID:" + subscriberID; 
 info += "\n Sim Serial Number:" + SIMSerialNumber; 
 info += "\n Network Country ISO:" + networkCountryISO; 
 info += "\n SIM Country ISO:" + SIMCountryISO; 
 info += "\n Software Version:" + softwareVersion; 
 info += "\n Voice Mail Number:" + voiceMailNumber; 
 info += "\n Phone Network Type:" + strphoneType; 
 info += "\n In Roaming?: " + isRoaming; 
 phoneInfo.setText(info); 
 } 
} 
2.3. Intent 
2.3.1. Định nghĩa 
Intent mang dữ liệu từ một thành phần tới thành phần khác bên trong ứng dụng hoặc 
bên ngoài ứng dụng. 
Đối tượng Intent, là một cấu trúc dữ liệu thụ động giữ một miêu tả trừu tượng 
của một hành động để được thực hiện. 
Intent trong Android là một miêu tả trừu tượng của một hoạt động để được thực hiện. 
Nó có thể được sử dụng với startActivity để chạy một Activity, broadcastIntent để gửi nó 
tới bất kỳ thành phần BroadcastReceiver nào quan tâm đến, và 
vớistartService(Intent)hoặc bindService(Intent, ServiceConnection, int) để giao tiếp với 
một Service ở Background. 
2.3.2. Phương thức và mô tả Intent 
Stt Phương thức & Miêu tả 
1 Context.startActivity() 
Đối tượng Intent được truyền tới phương thức này để chạy một Activity mới 
hoặc lấy một Activity đang tồn tại để làm cái gì đó mới 
2 Context.startService() 
Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android 
Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 20 
Đối tượng Intent được truyền tới phương thức này để khởi tạo một Service hoặc 
phân phối các chỉ thị mới tới một Service đang chạy 
3 Context.sendBroadcast() 
Đối tượng Intent được truyền tới phương thức này để phân phối thông báo tới tất 
cả BroadcastReceiver cần quan tâm 
2.3.3. Thao tác với intent 
Bước 1: Import các package cần thiết cho việc gửi SMS 
import android.telephony.SmsManager; 
 Bước 1: Khởi động một ứng dụng SMS được cài đặt trên thiết bị Android 
 Intent IntentDemo = new Intent(Intent.ACTION_VIEW); 
Bước 2: Xác định phương thức và kiểu dữ liệu gửi: smsto: dạng URI sử dụng phương thức 
setData() và kiểu dữ liệu sẽ là vnd.android-dir/mms-sms sử dụng phương thức setType(), 
smsIntent.setData(Uri.parse("smsto:")); 
smsIntent.setType("vnd.android-dir/mms-sms"); 
Bước 3: putExtra()các thành phần tương ứng 
Ví dụ với gửi SMS 
smsIntent.putExtra("address", phone); 
smsIntent.putExtra("sms_body", message); 
Hay 
Ví dụ với gửi email 
Intent email = new Intent(Intent.ACTION_SEND, Uri.parse("mailto:")); 
email.putExtra(Intent.EXTRA_EMAIL, recipients); 
email.putExtra(Intent.EXTRA_SUBJECT, subject.getText().toString()); 
email.putExtra(Intent.EXTRA_TEXT, body.getText().toString()); 
startActivity(Intent.createChooser(email, "Choose an email client from...")); 
Bước 4: Thực thi và hiển thị thông báo 
startActivity(smsIntent); 
2.4. BroadcastReceiver 
2.4.1. Giới thiệu về Broadcast Receiver 
Broadcast Receiver phản hồi các thông báo phát ra từ các ứng dụng khác hoặc từ 
chính hệ thống. Những thông báo này đôi khi được gọi là các event hoặc intent. 
Ví dụ, các ứng dụng cũng có thể khởi tạo các tín hiệu broadcast để thông báo cho ứng 
dụng khác biết rằng một số dữ liệu đã được về tới thiết vị và là có sẵn cho chúng để sử dụng, 
vì thế Broadcast Receiver thông dịch thông tin đó và khởi tạo hành động thích hợp. 
Một ứng dụng nghe các Intent được phát ra cụ thể bằng cách đăng ký một Broadcast 
Receiver trong AndroidManifest.xml file. 
Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android 
Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 21 
Hình 6. Hoạt động Broadcast Receiver 
BROADCAST-RECEIVER 
BroadcastReceiver có nhiệm vụ nhận, lọc các tín hiệu và thông báo. 
Một số system event được định nghĩa là là các trường final static trong lớp Intent. Bảng 
dưới liệt kê một số system event quan trọng: 
Event Miêu tả 
android.intent.action.BATTERY_CHANGED Thông báo này chứa trạng thái nạp, mức 
độ, và thông tin khác về pin 
android.intent.action.BATTERY_LOW Chỉ trạng thái low battery trên thiết bị 
android.intent.action.BATTERY_OKAY Chỉ rằng pin bây giờ là tốt sau khi low 
battery 
android.intent.action.BOOT_COMPLETED Đây là tín hiệu broadcast thông báo sau 
khi hệ thống đã kết thúc boot 
android.intent.action.BUG_REPORT Chỉ activity để báo cáo một bug 
android.intent.action.CALL Thông báo một lời gọi tới ai đó được xác 
định bởi dữ liệu 
android.intent.action.CALL_BUTTON Người dùng nhấn nút call để tới Dialer 
(trình gọi điện) hoặc giao diện UI thích 
hợp khác để tạo một cuộc gọi 
android.intent.action.DATE_CHANGED Date đã được thay đổi 
android.intent.action.REBOOT Reboot thiết bị 
2.4.2. Ứng dụng thông báo thay đổi trạng thái wifi 
Với ứng dụng này, bất cứ khi nào trạng thái wifi của thiết bị Android thay đổi, thì 
thiết bị sẽ nhận được thông báo nhận bởi MyReceiver và trình triển khai logic bên trong 
phương thức onReceive() sẽ được thực thi. 
Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android 
Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 22 
Bước 1: Tạo Project. Tạo lớp MyBroadCast kế thừa thừ lớp BroadcastReceiver. Tạo phương 
thức onReceive() thông báo thay đổi trạng thái wifi 
public class MyBroadCast extends BroadcastReceiver { 
 @Override 
 public void onReceive(Context context, Intent intent) { 
 Toast.makeText(context,"Trạng thái wifi đã thay đổi", Toast.LENGTH_SHORT).show(); 
 } 
} 
Bước 2: Khai báo cặp thẻ receiver trong AndroidManifest.xml để gọi tới MyBroadCast 
Lọc các action theo yêu cầu là lọc trạng thái wifi thay đổi. 
<manifest xmlns:android="" 
 package="diepnh.broadcast_demo"> 
 <application 
 android:allowBackup="true" 
 android:icon="@mipmap/ic_launcher" 
 android:label="@string/app_name" 
 android:supportsRtl="true" 
 android:theme="@style/AppTheme"> 
2.4.3. Ví dụ ứng dụng BroadCast tự định nghĩa 
Bước 1: Tạo Project. Tạo lớp MyBroadCastReceived kế thừa thừ lớp BroadcastReceiver. 
Tạo phương thức onReceive() thông báo thay đổi trạng thái wifi 
public class MyBroadCastReceived extends BroadcastReceiver { 
 @Override 
Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android 
Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 23 
 public void onReceive(Context context, Intent intent) { 
 String IntentData=intent.getStringExtra("CD3"); 
 Toast.makeText(context,"Dữ liệu nhận tu BroadCastReceived: 
"+IntentData,Toast.LENGTH_LONG).show(); 
 } 
} 
Bước 2: code 
Truyền kết quả Intent 
Bước 2.1; Khái báo Intent 
Intent it=new Intent(); 
Bước 2.2: Định nghĩa 1 hành động cho MyBroadCastReceived, sẽ lọc trong manifest 
 it.setAction("Com.MyBroadCastReceived.Demo"); 
Bước 2.3: putExtra key . value 
 it.putExtra("CD3","Hello TK125"); 
Bước 2.4: Đăng ký hành động cho MyBroadCastReceived với sendsendBroadcast, chú ý 
truyền vào Intent 
 sendBroadcast(it); 
public class MainActivity extends AppCompatActivity { 
 Button btnsendBroadCast; 
 @Override 
 protected void onCreate(Bundle savedInstanceState) { 
 super.onCreate(savedInstanceState); 
 setContentView(R.layout.activity_main); 
 btnsendBroadCast = (Button) findViewById(R.id.btnBroadCast); 
 btnsendBroadCast.setOnClickListener(new View.OnClickListener() { 
 @Override 
 public void onClick(View v) { 
 Intent it=new Intent(); 
// Định nghĩa 1 hành động cho MyBroadCastReceived, sẽ lọc trong manifest 
 it.setAction("Com.MyBroadCastReceived.Demo"); 
// putExtra key . value 
 it.putExtra("CD3","Hello TK125"); 
// Đăng ký hành động cho MyBroadCastReceived với sendsendBroadcast, chú ý truyền vào 
Intent 
 sendBroadcast(it); 
 } 
 }); 
 } 
} 
Bước 3: Khai báo cặp thẻ receiver trong AndroidManifest.xml để gọi tới MyBroadCast 
Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android 
Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 24 
Trong đó: 
MyBroadCastReceived tên lớp con kế thừa BroadCastReceived 
Com.MyBroadCastReceived.Demo là hành động cho MyBroadCastReceived được khai báo 
tương ứng hành động 
Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android 
Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 25 
Bài 3 Thư điện tử 
Thư điện tử (Email) là thông điệp được phân phối bằng phương tiện điện tử từ người 
dùng một hệ thống với một hoặc nhiều người nhận thông qua một mạng lưới. Trước khi bắt 
đầu Email Activity, Bạn phải biết chức năng email với mục đích, ý định là mang dữ liệu từ 
một thành phần để thành phần khác có trong các ứng dụng hoặc bên ngoài ứng dụng khi lập 
trình android. 
3.1. Gửi email 
Để gửi một email từ ứng dụng của bạn, bạn không cần phải thực hiện một ứng dụng 
email từ đầu, nhưng bạn có thể sử dụng một trong hiện tại như các ứng dụng mặc định Email 
được cung cấp từ Android, Gmail, Outlook, K–9 Mail vv . Đối với điều này mục 
đích, chúng ta cần phải viết một hoạt động mà ra mắt một ứng dụng email, sử dụng một 
Intent ngầm với các hành động đúng và dữ liệu. Trong ví dụ này, chúng tôi 
sẽ gửi một email từ ứng dụng của chúng tôi bằng cách sử dụng một đối tượng Intent mà ra 
mắtkhách hàng email hiện có. 
3.1.1. Intent Object – Những hỗ trợ để sử dụng tính năng Email 
Android đã được xây dựng trong hỗ trợ thêm TO, SUBJECT, CC, TEXT vv lĩnh vực mà 
có thể được gắn vào các mục đích trước khi gửi ý định một khách hàng mục 
tiêu email. Bạn có thể sử dụng sau trường bổ sung trong email của bạn. 
STTExtra Data & Description 
1 
EXTRA_BCC 
Chuỗi String [] gửi đến địa chỉ e-mail mà trong blind carbon copy. 
2 
EXTRA_CC 
Chuỗi String [] gửi đến địa chỉ e-mail mà trong carbon copy. 
3 
 EXTRA_EMAIL 
Chuỗi String [] gửi đến địa chỉ e-mail trong hộp thư đến. 
4 
 EXTRA_HTML_TEXT 
Chuỗi liên tục đó là liên kết với Intent, sử dụng ACTION_SEND để cung cấp một thay thế
cho EXTRA_TEXT nhưHTML . 
5 EXTRA_SUBJECT 
6 
 EXTRA_TEXT 
Một CharSequence không đổi đó là liên kết với Intent, sử dụng với ACTION_SEND để cung
cấp các dữ liệu theo nghĩa đen được gửi tới. 
7 
EXTRA_TITLE 
Một tiêu đề hộp thoại CharSequence để cung cấp cho người dùng khi sử dụng với
một ACTION_CHOOSER. 
Giống như tin nhắn SMS, Android cũng hỗ trợ e-mail. Các ứng dụng Gmail/Email 
trên Android cho phép bạn cấu hình một tài khoản e-mail POP3 hoặc IMAP. Bên cạnh việc 
gửi và nhận e-mail bằng cách sử dụng ứng dụng Gmail/Email, bạn cũng có thể gửi tin nhắn e-
mail lập trình từ bên trong ứng dụng Android 
Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android 
Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 26 
3.1.2. Intent ứng dụng trong gửi email 
Phần sau đây giải thích các phần khác nhau của các đối tượng Intent của chúng tôi yêu 
cầu để gửi một email. 
1. Intent Object – Gửi Email 
Intent emailIntent = new Intent(Intent.ACTION_SEND); 
 2. Intent Object – Thiết lập Data/Type để gửi Email 
Để gửi một email, bạn cần phải xác định mailto: như URI sử dụng phương thức SetData () và 
kiểu dữ liệu sẽ được để text/plain sử dụng phương thức setType () như sau: 
emailIntent.setData(Uri.parse("mailto:")); 
emailIntent.setType("text/plain"); 
putExtra() các thành phần email 
emailIntent.putExtra() 
 3. Intent Object – Những hỗ trợ để sử dụng tính năng Email 
Android đã được xây dựng trong hỗ trợ thêm TO, SUBJECT, CC, TEXT vv lĩnh vực mà 
có thể được gắn vào các mục đích trước khi gửi ý định một khách hàng mục 
tiêu email. Bạn có thể sử dụng sau trường bổ sung trong email của bạn 
3.2. Gmail API 
API Gmail là một dịch vụ web nó sử dụng API RESTful với tải trọng JSON 
Thư và nhãn là các đơn vị cơ bản của một hộp thư. Bản nháp, lịch sử và chủ đề đều 
chứa một hoặc nhiều thư có siêu dữ liệu bổ sung. 
Thông điệp không thay đổi: chúng chỉ có thể được tạo và xóa. Không có thuộc tính 
thông báo nào có thể được thay đổi ngoài các nhãn được áp dụng cho một thông báo nhất 
định. 
Nhãn là phương tiện chính để phân loại và tổ chức các thư và chủ đề. Nhãn có mối 
quan hệ nhiều đến nhiều với tin nhắn và chủ đề: một tin nhắn có thể có nhiều nhãn được áp 
dụng cho một nhãn và một nhãn có thể được áp dụng cho nhiều bài viết hoặc chủ đề. Nhãn 
cũng có hai loại: hệ thống và người sử dụng. Nhãn hệ thống, chẳng hạn như INBOX, TRASH, 
hoặc SPAM, được tạo nội bộ và không thể được tạo, xóa hoặc sửa đổi. Tuy nhiên, một số 
nhãn hệ thống, chẳng hạn như INBOX, có thể được áp dụng cho hoặc loại bỏ khỏi tin nhắn và 
chủ đề. Nhãn người dùng có thể được thêm, xóa, hoặc sửa đổi bởi người sử dụng hoặc ứng 
dụng. 
Các bản nháp đại diện cho các thư chưa gửi. Bản thân các thông điệp không thể được 
sửa đổi khi đã được tạo, nhưng tin nhắn có trong bản nháp có thể được thay thế. Gửi bản nháp 
sẽ tự động xóa bản nháp và tạo một thư với nhãn hệ thống SENT. 
Lịch sử là tập hợp các thư được sửa đổi gần đây theo thứ tự thời gian. Mặc dù lịch sử 
được dự định là một phương pháp đồng bộ hoá một máy khách nhẹ, thông thường nó chỉ chứa 
các bản ghi các thay đổi trong vòng 30 ngày vừa qua. Trong một số trường hợp, chẳng hạn 
như khi khách hàng trở nên quá lỗi thời, khách hàng nên đồng bộ hoá theo cách thủ công. 
Chủ đề là tập hợp các thư đại diện cho một cuộc trò chuyện. Giống như tin nhắn, chủ 
đề cũng có thể có nhãn áp dụng cho chúng. Tuy nhiên, không giống như các tin nhắn, chủ đề 
không thể được tạo, chỉ xóa. Thông điệp có thể được đưa vào một chủ đề. 
Cài đặt kiểm soát tính năng của Gmail hoạt động như thế nào cho người dùng. Cài đặt 
khả dụng cho truy cập POP và IMAP, chuyển tiếp email, bộ lọc, tự động trả lời kỳ nghỉ, gửi 
bí danh và chữ ký. 
Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android 
Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 27 
3.3. Một số chức năng của email 
3.3.1. Xem email 
public class EmailinboxActivity extends Activity { 
 /** Called when the activity is first created. */ 
 EmailManager emailManager; 
 private String stmpHost = "smtp.gmail.com"; 
 private String mailServer = "imap.gmail.com"; 
 public String urlServer = "gmail.com"; 
 public String username = " Any Gmail Username"; 
 public String password = " Any Gmail Password"; 
 @Override 
 public void onCreate(Bundle savedInstanceState) { 
 super.onCreate(savedInstanceState); 
 setContentView(R.layout.main); 
 emailManager=new EmailManager(username, password, urlServer, stmpHost, mailServer); 
 try { 
// emailManager.getInboxMails(); 
 emailManager.close(); 
 } catch (MessagingException e) { 
 // TODO Auto-generated catch block 
 e.printStackTrace(); 
 } 
 } 
} 
public class ByteArrayDataSource implements DataSource { 
 private byte[] data; 
 private String type; 
 public ByteArrayDataSource(byte[] data, String type) { 
 super(); 
 this.data = data; 
 this.type = type; 
 } 
 public ByteArrayDataSource(byte[] data) { 
 super(); 
 this.data = data; 
 } 
 public void setType(String type) { 
 this.type = type; 
 } 
 public String getContentType() { 
 if (type == null) 
 return "application/octet-stream"; 
 else 
 return type; 
Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android 
Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 28 
 } 
 public InputStream getInputStream() throws IOException { 
 return new ByteArrayInputStream(data); 
 } 
 public String getName() { 
 return "ByteArrayDataSource"; 
 } 
 public OutputStream getOutputStream() throws IOException { 
 throw new IOException("Not Supported"); 
 } 
} 
public class EmailAccount { 
 public String urlServer = "gmail.com"; 
 public String username = "username"; 
 public String password = "password"; 
 public String emailAddress; 
 public EmailAccount(String username, String password, String urlServer) { 
 this.username = username; 
 this.password = password; 
 this.urlServer = urlServer; 
 this.emailAddress = username + "@" + urlServer; 
 } 
} 
public class EmailAuthenticator extends Authenticator { 
 private EmailAccount account; 
 public EmailAuthenticator(EmailAccount account) { 
 super(); 
 this.account = account; 
 } 
 protected PasswordAuthentication getPasswordAuthentication() { 
 return new PasswordAuthentication(account.emailAddress, account.password); 
 } 
} 
3.3.2 Tạo thư nháp 
Ứng dụng có thể tạo các bản nháp bằng cách sử dụng phương thức create.draft. theo 
các bước sau 
Tạo mẩu tin MIME, mẩu tin được dịch bởi RFC 2822. 
Chuyển đổ tin nhắn thành 1 xâu mã hóa base64url 
Tạo tin nháp, thiết lập giá trị của trường drafts.message.raw thành xâu mã 
Bước 1: Tạo thư điện tử đơn giản với lớp MimeMessage trong gói javax.mail.internet. 
/** 
 * Create a MimeMessage using the parameters provided. 
 * 
 * @param to email address of the receiver 
 * @param from email address of the sender, the mailbox account 
Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android 
Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 29 
 * @param subject subject of the email 
 * @param bodyText body text of the email 
 * @return the MimeMessage to be used to send email 
 * @throws MessagingException 
 */ 
 public static MimeMessage createEmail(String to, 
 String from, 
 String subject, 
 String bodyText) 
 throws MessagingException { 
 Properties props = new Properties(); 
 Session session = Session.getDefaultInstance(props, null); 
 MimeMessage email = new MimeMessage(session); 
 email.setFrom(new InternetAddress(from)); 
 email.addRecipient(javax.mail.Message.RecipientType.TO, 
 new InternetAddress(to)); 
 email.setSubject(subject); 
 email.setText(bodyText); 
 return email; 
 } 
Bước 2: Mã hóa the MimeMessage, Khởi tạo 1 đối tượng Message, và thiết lập giá trị xâu mã 
hóa theo base64url như giá trị của thuộc tính raw 
 /** 
 * Create a message from an email. 
 * 
 * @param emailContent Email to be set to raw of message 
 * @return a message containing a base64url encoded email 
 * @throws IOException 
 * @throws MessagingException 
 */ 
 public static Message createMessageWithEmail(MimeMessage emailContent) 
 throws MessagingException, IOException { 
 ByteArrayOutputStream buffer = new ByteArrayOutputStream(); 
 emailContent.writeTo(buffer); 
 byte[] bytes = buffer.toByteArray(); 
 String encodedEmail = Base63.encodeBase64URLSafeString(bytes); 
 Message message = new Message(); 
 message.setRaw(encodedEmail); 
 return message; 
 } 
Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android 
Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 30 
Once you have a created a Message, you can create a Draft object and pass it to 
the drafts.create method. 
 /** 
 * Create draft email. 
 * 
 * @param service an authorized Gmail API instance 
 * @param userId user's email address. The special value "me" 
 * can be used to indicate the authenticated user 
 * @param emailContent the MimeMessage used as email within the draft 
 * @return the created draft 
 * @throws MessagingException 
 * @throws IOException 
 */ 
 public static Draft createDraft(Gmail service, 
 String userId, 
 MimeMessage emailContent) 
 throws MessagingException, IOException { 
 Message message = createMessageWithEmail(emailContent); 
 Draft draft = new Draft(); 
 draft.setMessage(message); 
 draft = service.users().drafts().create(userId, draft).execute(); 
 System.out.println("Draft id: " + draft.getId()); 
 System.out.println(draft.toPrettyString()); 
 return draft; 
 } 
3.3.3 Cập nhật thư rác 
Thật là đơn giản để tạo 1 thư nháp. Để cập nhật 1 thư nháp ta phải cung cấp 1 
nguồn Draft trong yêu cầu với trường draft.message.raw 
Ta có thể lấy thư MIME được chứa trong draft bởi lời gọi drafts.get với tham số format=raw. 
Tham khảo thêm drafts.update. 
3.3.4 Gửi thư rác 
Khi gửi 1 thư nháp, ta có thể chọn để gửi thư như hoặc gửi thư nháp cập nhật. Nếu ta cập nhật 
nội dung thư nháp với 1 thư mới. Hỗ trợ nguồn thư nháp trong than củalời gọi drafts.send; 
thiết lập draft.id của thư nháp được gửi và thiết lập trường draft.message.raw thành thư đã mã 
hóa thành xâu mã theo base64url 
Tham khảo thêm drafts.send. 
Thao khảo thêm 
https://developers.google.com/gmail/api/guides 
https://www.youtube.com/watch?v=MitDYGsxnaE 
Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android 
Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 31 
Bài 4 Ứng dụng tin nhắn và ứng dụng thư điện tử 
4.1. Tổng hợp kiến thức liên quan 
Nhận tin nhắn dung lớp BroadcastReceiver để nghe các tin nhắn SMS. 
Khi một tin nhắn SMS được nhận, phương pháp onReceive() là fired. Các tin nhắn SMS được 
chứa trong đối tượng Intent (Itent; tham số thứ hai trong phương pháp onReceive()) thông qua 
một đối tượng Bundle. 
Các tin nhắn được lưu trữ trong một mảng Object trong định dạng PDU. 
Để trích xuất mỗi tin nhắn, bạn sử dụng các phương pháp createFromPdu() tĩnh từ lớp 
SmsMessage. 
Các tin nhắn SMS sẽ được hiển thị bằng cách sử dụng lớp Toast. Các số điện thoại của 
người gửi là thu được thông qua phương pháp getOriginatingAddress() . 
Một đặc điểm thú vị của BroadcastReceiver mà bạn có thể tiếp tục lắng nghe các tin 
nhắn SMS ngay cả khi ứng dụng không chạy; miễn là các ứng dụng được cài đặt trên thiết bị, 
bất kỳ tin nhắn SMS sẽ được nhận bởi các ứng dụng. 
4.2. Ứng dụng tin nhắn SMS 
Yêu cầu: tin nhắn SMS được nhận tự động, hiển thị 
Hướng dẫn: Gửi tin nhắn dung 1 trong 2 cách (bài trước) 
Trong Android, có thể sử dụng SmsManager API hoặc các thiết bị xây dựng sẵn ứng 
dụng tin nhắn (SMS) để gửi SMS. 
Để thực hiện xây dựng ứng dụng Gửi SMS qua các bước sau: 
Bước 1 Tạo project 
Cấp quyền tương ứng trong AndroidManifest.xml của project, đặt dòng 
<manifest xmlns:android="" 
 package="diepnh.sms"> 
Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android 
Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 32 
 <application 
 android:allowBackup="true" 
 android:icon="@mipmap/ic_launcher" 
 android:label="@string/app_name" 
 android:supportsRtl="true" 
 android:theme="@style/AppTheme"> 
Bước 2 Thiết kế giao diện 
Cần có editText nhập số điện thoại; editText nhập nội dung tin nhắn ; button send để thực 
hiện hành động gửi tin nhắn đi trong sendsms.xml 
sendsms.xml 
<LinearLayout xmlns:android="" 
 android:layout_width="match_parent" 
 android:layout_height="match_parent" 
Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android 
Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 33 
 android:orientation="vertical"> 
 <TextView 
 android:id="@+id/textView" 
 android:layout_width="match_parent" 
 android:layout_height="wrap_content" 
 android:gravity="center" 
 android:text="SENDING SMS" 
 android:textSize="40dp" /> 
 <EditText 
 android:id="@+id/edtPhone" 
 android:layout_width="match_parent" 
 android:layout_height="wrap_content" 
 android:hint="Nhập số điện thoại" 
 android:inputType="phone" /> 
 <EditText 
 android:id="@+id/edtMessage" 
 android:layout_width="match_parent" 
 android:layout_height="wrap_content" 
 android:hint="Nhập tin nhắn" 
 android:inputType="text" /> 
 <Button 
 android:id="@+id/btnSend1" 
 android:layout_width="100dp" 
 android:layout_height="wrap_content" 
 android:layout_gravity="center" 
 android:text="Send" /> 
 <Button 
 android:id="@+id/btnSend2" 
 android:layout_width="100dp" 
 android:layout_height="wrap_content" 
 android:layout_gravity="center" 
 android:text="send intent" /> 
Thiết kế giao diện receivesms.xml 
Layout này có thể ko cần. Nếu thiết kế thì như sau: Cần có Text hiển thị số điện thoại và nội 
dung SMS; button receive SMS để thực hiện hành động lọc SMS nhận về điện thoại và hiển 
thị trong receiveSMS.xml 
<LinearLayout xmlns:android="" 
 android:layout_width="match_parent" 
 android:layout_height="match_parent" 
 android:orientation="vertical"> 
 <TextView 
 android:id="@+id/textView" 
Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android 
Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 34 
 android:layout_width="match_parent" 
 android:layout_height="wrap_content" 
 android:gravity="center" 
 android:text="RECEIVING SMS" 
 android:textSize="40dp" /> 
 <Button 
 android:id="@+id/btn" 
 android:layout_width="match_parent" 
 android:layout_height="wrap_content" 
 android:text="received SMS" /> 
 <TextView 
 android:id="@+id/txtMessage" 
 android:layout_width="match_parent" 
 android:layout_height="100dp" 
 android:inputType="text" /> 
Giao diện activity_main.xml 
<LinearLayout xmlns:android="" 
 android:orientation="vertical" android:layout_width="match_parent" 
 android:layout_height="match_parent"> 
 <TextView 
 android:text="SENDING/RECEIVING SMS" 
 android:layout_width="match_parent" 
 android:layout_height="wrap_content" 
 android:textSize="20dp" 
 android:gravity="center" 
 android:id="@+id/textView" /> 
 <Button 
 android:text="Send" 
 android:layout_width="100dp" 
 android:layout_gravity="center" 
 android:layout_height="wrap_content" 
 android:id="@+id/btnSend" /> 
 <Button 
 android:text="Receive" 
 android:layout_width="match_parent" 
 android:layout_height="wrap_content" 
 android:id="@+id/btnReceive" /> 
Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android 
Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 35 
Bước 3 Code 
Bước 3.1 sendSMS.java như sau: 
package diepnh.sms; 
import android.content.Intent; 
import android.net.Uri; 
import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 
import android.telephony.SmsManager; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.Toast; 
public class SendSMS extends AppCompatActivity { 
 Button btnsend1, btnsend2; 
 EditText edtphone, edtmessage; 
 @Override 
 protected void onCreate(Bundle savedInstanceState) { 
 super.onCreate(savedInstanceState); 
 setContentView(R.layout.sendsms); 
 edtphone = (EditText) findViewById(R.id.edtPhone); 
 edtmessage = (EditText) findViewById(R.id.edtMessage); 
 btnsend1 = (Button) findViewById(R.id.btnSend1); 
 btnsend1.setOnClickListener(new View.OnClickListener() { 
 @Override 
 public void onClick(View v) { 
 sendSMS(); 
 } 
 }); 
 btnsend2 = (Button) findViewById(R.id.btnSend2); 
 btnsend2.setOnClickListener(new View.OnClickListener() { 
 @Override 
 public void onClick(View v) { 
 sendSMS_Intent(); 
 } 
 }); 
 } 
 protected void sendSMS() { 
 String phone = edtphone.getText().toString(); 
 String message = edtmessage.getText().toString(); 
 try { 
Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android 
Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 36 
 SmsManager manager = SmsManager.getDefault(); 
 manager.sendTextMessage(phone, null, message, null, null); 
 Toast.makeText(SendSMS.this, "SMS Succedded, ConGradulation!", 
Toast.LENGTH_SHORT).show(); 
 setContentView(R.layout.sendsms); 
 } catch (android.content.ActivityNotFoundException ex) { 
 Toast.makeText(SendSMS.this, "SMS faild, please try again later.", 
Toast.LENGTH_SHORT).show(); 
 } 
 } 
 protected void sendSMS_Intent() { 
 String phone = edtphone.getText().toString(); 
 String message = edtmessage.getText().toString(); 
 try { 
// B1.khởi động một ứng dụng SMS được cài đặt trên thiết bị Android 
 Intent smsIntent = new Intent(Intent.ACTION_VIEW); 
 // Invokes only SMS/MMS clients 
// B2.Data/Type gửi bằng SMS 
 smsIntent.setData(Uri.parse("smsto:")); 
 smsIntent.setType("vnd.android-dir/mms-sms"); 
// B3.Extra trong SMS 
 smsIntent.putExtra("address", phone); 
 smsIntent.putExtra("sms_body", message); 
 // B4. Shoot! 
 startActivity(smsIntent); 
 Toast.makeText(SendSMS.this, "SMS Succedded, ConGradulation!", 
Toast.LENGTH_SHORT).show(); 
 setContentView(R.layout.sendsms); 
 } catch (android.content.ActivityNotFoundException ex) { 
 Toast.makeText(SendSMS.this, "SMS faild, please try again later.", 
Toast.LENGTH_SHORT).show(); 
 } 
 } 
} 
Bước 3.2: Cách 1 Khai báo BroadcastReceiver và IntentFilter trong 
androidManifest.xml 
Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android 
Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 37 
Sau đó tạo lớp SMSBroadCastReceive kế thừa thừ lớp BroadcastReceiver như sau: 
package diepnh.sms; 
import android.app.Dialog; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.DialogInterface; 
import android.content.Intent; 
import android.os.Bundle; 
import android.support.v7.app.AlertDialog; 
import android.telephony.SmsManager; 
import android.telephony.SmsMessage; 
import android.view.LayoutInflater; 
import android.widget.Toast; 
public class SMSBroadCastReceived extends BroadcastReceiver { 
 final SmsManager msgs = SmsManager.getDefault(); 
 String str = "Tin nhắn nhận: "; 
 static int id = 1; 
 @Override 
 public void onReceive(Context context, Intent intent) { 
 //—get the SMS message passed in— 
 Bundle bundle = intent.getExtras(); 
 try { 
 if (bundle != null) { 
//—retrieve the SMS message received— 
// một mảng Object trong định dạng PDU lưu các tin nhắn 
 final Object[] MessageContent = (Object[]) bundle.get("pdus"); 
// SmsMessage msgs = new SmsMessage[MessageContent.length]; 
 for (int i = 0; i < MessageContent.length; i++) { 
// trích xuất mỗi tin nhắn 
 SmsMessage newSMS = SmsMessage.createFromPdu((byte[]) MessageContent[i]); 
// Các số điện thoại của người gửi là thu được 
 str += "SMS from " + newSMS.getOriginatingAddress(); 
 str += ": "; 
// Nội dung tin nhắn 
 str += newSMS.getMessageBody().toString(); 
 str += "\n"; 
 id++; 
 } 
//—display the new SMS message—Các tin nhắn SMS sẽ được hiển thị bằng cách sử dụng lớp 
Toast 
Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android 
Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 38 
 Toast.makeText(context, str, Toast.LENGTH_SHORT).show(); 
 AlertDialog.Builder al = new AlertDialog.Builder(context); 
 al.setTitle("Tin nhắn nhận:"); 
 al.setMessage(str); 
 al.create(); 
 al.setView(R.layout.receivesms); 
 al.show(); 
 } else 
 Toast.makeText(context, "ko có Tin nhắn mới", Toast.LENGTH_LONG).show(); 
 } catch (Exception ex) { 
 } 
 } 
} 
Bước 3.2: Cách 2 Khai báo BroadcastReceiver và IntentFilter trong ReceiveSMS.java 
UD chỉ chạy khi mở Ứng dụng thì sẽ như sau: 
package diepnh.sms; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.content.IntentFilter; 
import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 
import android.telephony.SmsMessage; 
import android.widget.TextView; 
/** 
 * Created by DiepNH on 12-02-2017. 
 */ 
public class ReceivedSMS extends AppCompatActivity { 
 BroadcastReceiver receiver = null; 
TextView mes; 
 String str=""; 
 @Override 
 protected void onCreate(Bundle savedInstanceState) { 
 super.onCreate(savedInstanceState); 
 setContentView(R.layout.receivesms); 
 mes=(TextView)findViewById(R.id.txtMessage) ; 
// Lọc SMS_RECEIVED viết trong UD, UD đóng thì dừng 
 IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED"); 
Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android 
Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 39 
 receiver =new BroadcastReceiver() { 
 @Override 
 public void onReceive(Context context, Intent intent) { 
 Bundle bundle = intent.getExtras(); 
 // một mảng Object trong định dạng PDU lưu các tin nhắn 
 final Object[] MessageContent = (Object[]) bundle.get("pdus"); 
// SmsMessage msgs = new SmsMessage[MessageContent.length]; 
 for (int i = 0; i < MessageContent.length; i++) { 
// trích xuất mỗi tin nhắn 
 SmsMessage newSMS = SmsMessage.createFromPdu((byte[]) MessageContent[i]); 
// Các số điện thoại của người gửi là thu được 
 String smsnumber=newSMS.getDisplayOriginatingAddress().toString(); 
// Nội dung tin nhắn 
 String smsbody=newSMS.getMessageBody().toString(); 
 str += "SMS from " + smsnumber;// newSMS.getOriginatingAddress(); 
 str += "\nBodySMS: "+smsbody+"\n"; 
 mes.setText(str); 
 } 
 }}; 
 registerReceiver(receiver,filter); 
 } 
 @Override 
 protected void onDestroy() { 
 super.onDestroy(); 
 unregisterReceiver(receiver); 
 } 
} 
Bước 3.3: Cuối cùng ta có MainActivity.java 
package diepnh.sms; 
import android.content.Intent; 
import android.net.Uri; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.telephony.SmsManager; 
import android.util.Log; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.TextView; 
import android.widget.Toast; 
Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android 
Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 40 
public class MainActivity extends AppCompatActivity { 
 Button btnsend, btnreceive; 
 @Override 
 protected void onCreate(Bundle savedInstanceState) { 
 super.onCreate(savedInstanceState); 
 setContentView(R.layout.activity_main); 
 btnsend= (Button) findViewById(R.id.btnSend); 
 btnsend.setOnClickListener(new View.OnClickListener() { 
 @Override 
 public void onClick(View v) { 
 Intent it=new Intent(MainActivity.this,SendSMS.class); 
 startActivity(it); 
 } 
 }); 
 btnreceive = (Button) findViewById(R.id.btnReceive); 
 btnreceive.setOnClickListener(new View.OnClickListener() { 
 @Override 
 public void onClick(View v) { 
 Intent it=new Intent(MainActivity.this,ReceiveSMS.class); 
 startActivity(it); 
 } 
 }); 
 } 
} 
4.3. Ứng dụng thư điện tử 
Yêu cầu: Xây dựng ứng dụng gửi và nhận email 
Bước 1: Tạo Project và thiết lập permission trong manifest.xml 
Bước 2: THiết kế giao diện 
Soạn và gửi thư compose.xml 
Hòm thư nhận về inbox.xml 
Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android 
Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 41 
Bước 3 Sử dụng Intent 
package diepnh.sentemail_intent; 
import android.content.Intent; 
import android.net.Uri; 
import android.support.annotation.Nullable; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
public class MainActivity extends AppCompatActivity { 
 Button btnsend, btndelete; 
 // FloatingActionButton fbtnsend; 
 EditText edtRecepient, edtSubject, edtMessage; 
 @Override 
 protected void onCreate(@Nullable Bundle savedInstanceState) { 
 super.onCreate(savedInstanceState); 
 setContentView(R.layout.compose); 
 edtRecepient = (EditText) findViewById(R.id.edtRecepient); 
 edtSubject = (EditText) findViewById(R.id.edtSubject); 
 edtMessage = (EditText) findViewById(R.id.edtMessage); 
 btnsend = (Button) findViewById(R.id.btnSend); 
 btnsend.setOnClickListener(new View.OnClickListener() { 
 @Override 
 public void onClick(View v) { 
 SendEmail(); 
 } 
 }); 
 btnsend = (Button) findViewById(R.id.btnSend); 
 btnsend.setOnClickListener(new View.OnClickListener() { 
 @Override 
 public void onClick(View v) { 
 SendEmail(); 
 } 
 }); 
 } 
 protected void SendEmail() { 
// Khai báo đối tượng emailIntent với hành động gửi 
 Intent emailIntent = new Intent(Intent.ACTION_SEND, Uri.parse("mailto:")); 
// Thiết lập dữ liệu và kiểu 
 emailIntent.setData(Uri.parse("mailto:")); 
 emailIntent.setType("message/rfc822"); 
 String[] receivers = edtRecepient.getText().toString().split(";"); 
Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android 
Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 42 
 emailIntent.putExtra(Intent.EXTRA_EMAIL, receivers); 
 emailIntent.putExtra(Intent.EXTRA_SUBJECT, edtSubject.getText().toString()); 
 emailIntent.putExtra(Intent.EXTRA_TEXT, edtMessage.getText().toString()); 
// run 
 startActivity(emailIntent); 
 startActivity(Intent.createChooser(emailIntent, "send email")); 
 finish(); 
 } 
} 
Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android 
Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 43 
Bài 5 Một số dịch vụ trên google 
5.1. Giới thiệu Google service 
API là viết tắt của Application Programming Interface (giao diện lập trình ứng 
dụng). Nó là 1 giao tiếp phần mềm được dùng bởi các ứng dụng khác nhau. Cũng giống như 
bàn phím là một thiết bị giao tiếp giữa ngườI dùng và máy tính, API là 1 giao tiếp phần mếm 
chẳng hạn như giữa chương trình và hệ điều hành (HĐH). 
Google APIs is a set of application programming interfaces (APIs) developed 
by Google which allow communication with Google Services and their integration to other 
services. Examples of these include Search, Gmail, Translate or Google Maps. Third-party 
apps can use these APIs to take advantage of or extend the functionality of the existing 
services. 
The APIs provide functionality like analytics, machine learning as a service (the 
Prediction API) or access to user data (when permission to read the data is given). Another 
important example is an embedded Google map on a website, which can be achieved using 
the Static maps API,[1] Places API[2] or Google Earth API 
Usage of some of the APIs requires authentication and authorization using 
the OAuth 2.0 protocol. OAuth 2.0 is a simple protocol. To start, it is necessary to obtain 
credentials from the Developers Console. Then the client app can request an access token 
from the Google Authorization Server, and uses that token for authorization when accessing a 
Google API service 
5.2. Google Map Service 
 Google Map Service là một dịch vụ ứng dụng vào công nghệ bản đồ trực tuyến trên 
web miễn phí được cung cấp bởi Google, hỗ trợ nhiều dịch vụ khác của Google đặc biệt là dò 
đường và chỉ đường; hiển thị bản đồ đường sá, các tuyến đường tối ưu cho từng loại phương 
tiện, cách bắt xe và chuyển tuyến cho các loại phương tiện công cộng (xe bus, xe khách ...), và 
những địa điểm (kinh doanh, trường học, bệnh viện, cây ATM...) trong khu vực cũng như khắp 
nơi trên thế giới. 
Map API là một phương thức cho phép 1 website B sử dụng dịch vụ bản đồ của 
website A (gọi là Map API) và nhúng vào website của mình (site B). Site A ở đây là google 
map, site B là các website cá nhân hoặc tổ chức muốn sử dụng dịch vụ của google (di chuột, 
room, đánh dấu trên bản đồ) 
Google Maps Android API (viết tắt: GMAA) hỗ trợ các thao tác với giao diện đồ 
họa của bản đồ bao gồm: 
• Vẽ biểu tượng trên bản đồ (Marker). 
• Đồ họa đường thẳng (Polylines). 
• Đồ họa hình đa giác (Polygons). 
• Bitmap trên bản đồ (Ground & Tile Overlay). 
Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android 
Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 44 
MAP_TYPE_NORMAL 
MAP_TYPE_HYBRID 
MAP_TYPE_NONE 
MAP_TYPE_SATELLITE 
MAP_TYPE_TERRAIN 
Hình 7. Các kiểu giao diện hiển thị bản đồ mà Google Maps cung cấp 
Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android 
Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 45 
Các kiểu này ta có thể dùng coding để thay đổi kiểu hiển thị thông qua hàm: 
setMapType(int). 
- Ta có thể thiết lập các giá trị ban đầu và điều khiển cho Google Maps bao gồm: 
• Góc nhìn (Camera) 
• Thu phóng (zoom) 
• Chuyển điểm (location) 
• Xoay (bearing) 
• Góc nghiêng (titl) 
• La bàn và điều khiển thu phóng. 
• Các điều khiển cử chỉ trên bản đồ. 
Ứng dụng của bạn có thành phần bản đồ, dữ liệu bản đồ nằm tại trung tâm dữ liệu của 
Google, vì vậy ứng dụng của bạn liên tục truy xuất dữ liệu bản đồ thông qua một dịch vụ 
Dữ liệu bản đồ Google được cung cấp miễn phí, nhưng cần phải có một API Key, nó giống 
như một giấy giới thiệu (Credentials) để truy cập dữ liệu bản đồ. 
Hình 8. API key và google service 
5.2.1. Một số ứng dụng của Google Map API 
 Đánh dấu các địa điểm trên bản đồ kèm theo thông tin cho địa điểm đó: khu vui chơi 
giải trí, nhà hàng khách sạn, cây A
            Các file đính kèm theo tài liệu này:
 01200001_1903_1983546.pdf 01200001_1903_1983546.pdf