ThS NGUYỄN VĂN HIỆP LẬP TRÌNH ANDROID TRONG ỨNG DỤNG ĐIỀU KHIỂN GIÁO TRÌNH ThS NGUYỄN VĂN HIỆP Giáo trình LẬP TRÌNH ANDROID TRONG ỨNG DỤNG ĐIỀU KHIỂN NHÀ XUẤT BẢN ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MIN[.]
Trang 1ThS NGUYỄN VĂN HIỆP
LẬP TRÌNH ANDROID TRONG ỨNG DỤNG ĐIỀU KHIỂN
GIÁO TRÌNH
Trang 2ThS NGUYỄN VĂN HIỆP
Giáo trình LẬP TRÌNH ANDROID TRONG ỨNG DỤNG
ĐIỀU KHIỂN
NHÀ XUẤT BẢN ĐẠI HỌC QUỐC GIA
THÀNH PHỐ HỒ CHÍ MINH – 2016
Trang 3LỜI NÓI ĐẦU
Chào mừng các bạn đến với quyển sách “Lập trình Android trong ứng dụng điều khiển”! Đây là quyển sách tiếp nối quyển “Lập trình Android cơ bản” của cùng tác giả và muốn hướng đến đối tượng là các sinh viên chuyên ngành Công nghệ kỹ thuật Điện tử, truyền thông, Công nghệ kỹ thuật Tự động hóa Quyển sách trình bày các vấn đề rất “sát sườn” về lãnh vực điều khiển thiết bị qua điện thoại thông minh, bao gồm vấn đề xây dựng phần mềm trên điện thoại Android và thiết kế phần cứng điện tử, lập trình cho vi điều khiển
Như chúng ta đã biết, ngày nay điện thoại thông minh đã trở nên
“gần gũi” hơn bao giờ hết Việc sở hữu một chiếc điện thoại thông minh thật sự là một việc không quá khó khăn Điện thoại thông minh không chỉ
là phương tiện thông tin liên lạc và giải trí mà các ứng dụng giám sát, thu thập và điều khiển qua điện thoại thông minh ngày càng đa dạng Việt Nam chúng ta đang trong giai đoạn hội nhập mạnh mẽ, nên người làm khoa học kỹ thuật phải nhạy bén với thời đại Hiện nay rất nhiều công ty nổi tiếng của nước ta đã mạnh dạn đầu tư và có những thành công nhất định về các lãnh vực smarthome, IoT (Internet of Things),…Các sản phẩm được đưa ra thị trường và được đón nhận Chúng ta hằng ngày đọc báo vẫn hay thấy đâu đó những mẩu tin như: anh nông dân A xây dựng được hệ thống tưới nước bằng điện thoại di động, anh nông dân B xây dựng được hệ thống đo nhiệt độ, độ ẩm nhà kính từ xa, Điều đó chứng
tỏ rằng lãnh vực IoT đã và đang rất được quan tâm, không chỉ trong giới khoa học kỹ thuật
Quyển sách trình bày các vấn đề điều khiển phổ biến qua điện thoại
di động Android như điều khiển bằng tin nhắn SMS, điều khiển, giám sát thiết bị qua Bluetooth, điều khiển thiết bị bằng giọng nói tiếng Việt, điều khiển thiết bị sử dụng cảm biến gia tốc, điều khiển thiết bị qua wifi, điều khiển thiết bị qua mạng internet Về phần cứng để xây dựng bộ điều khiển, tác giả chọn một kit vi điều khiển rất phổ biến hiện nay là Arduino UNO R3 để tận dụng các thư viện, module có sẵn nhằm phát triển ứng dụng nhanh và dễ hiểu
Tác giả xin gởi lời cảm ơn đến gia đình, Bộ môn Điện tử công nghiệp và Khoa Điện-Điện tử đã tạo điều kiện thời gian, hỗ trợ chuyên môn Đặc biệt xin cảm ơn sự đóng góp rất lớn của em Nguyễn Gia Bảo, khoa Điện-Điện tử đã giúp tác giả hoàn thành quyển sách này
Với mong muốn có một quyển sách thật cơ bản, qua đó bạn đọc có thể thực hiện được ngay những ứng dụng đầu tay nhanh chóng, Tác giả
Trang 44
hi vọng nhen nhóm được ngọn lửa đam mê để bùng cháy tình yêu khoa học kỹ thuật và sáng tạo của các bạn sinh viên chuyên ngành điều khiển Mặc dù vậy, với thời gian hạn hẹp, quyển sách có lẽ còn những sai sót nhất định Mọi đóng góp xây dựng xin vui lòng liên hệ:
Nguyễn Văn Hiệp, Khoa Điện-Điện Tử, Trường Đại học Sư phạm
Kỹ thuật TP HCM
Hoặc qua email: thewind030282@gmail.com
Trân trọng
Trang 5MỤC LỤC
LỜI NÓI ĐẦU 3
MỤC LỤC 5
Chương 1: GIỚI THIỆU VỀ ANDROID STUDIO VÀ VẤN ĐỀ XỬ LÝ ĐA LUỒNG 7
1.1 TỔNG QUAN VỀ ANDROID STUDIO 7
1.2 CÀI ĐẶT ANDROID STUDIO 11
1.3 HƯỚNG DẪN TẠO MỘT ỨNG DỤNG MỚI TỪ ANDROID STUDIO VÀ DEBUG NÓ 17
1.4 CÁCH CHẠY KIỂM TRA CHƯƠNG TRÌNH (DEBUG CHƯƠNG TRÌNH) 29
1.5 LÀM THẾ NÀO ĐỂ THỰC THI ĐA LUỒNG (MULTI-THREADING) TRONG ANDROID VỚI HANDLER CLASS 32
Chương 2: GIỚI THIỆU ARDUINO VÀ PHẦN MỀM ARDUINO IDE 53
2.1 TỔNG QUAN VỀ ARDUINO 53
2.2 HƯỚNG DẪN CÀI ĐẶT ARDUINO IDE 55
Chương 3: ĐIỀU KHIỂN THIẾT BỊ QUA TIN NHẮN SMS 59
3.1 ĐẶT VẤN ĐỀ 59
3.2 PHẦN MỀM TRÊN ĐIỆN THOẠI ANDROID 60
3.3 BỘ ĐIỀU KHIỂN 68
3.4 KẾT NỐI PHẦN CỨNG VÀ CHƯƠNG TRÌNH ARDUINO 70
Chương 4: ĐIỀU KHIỂN VÀ GIÁM SÁT THIẾT BỊ QUA BLUETOOTH 79
4.1 ĐẶT VẤN ĐỀ 79
4.2 PHẦN MỀM TRÊN ĐIỆN THOẠI ANDROID 80
4.3 BỘ ĐIỀU KHIỂN 93
Trang 66
Chương 5: ĐIỀU KHIỂN THIẾT BỊ DÙNG CẢM BIẾN
GIA TỐC 99
5.1 ĐẶT VẤN ĐỀ 99
5.2 PHẦN MỀM TRÊN ĐIỆN THOẠI ANDROID 100
5.3 BỘ ĐIỀU KHIỂN 112
Chương 6: ĐIỀU KHIỂN THIẾT BỊ BẰNG GIỌNG NÓI 115
6.1 ĐẶT VẤN ĐỀ 115
6.2 ỨNG DỤNG TRÊN ĐIỆN THOẠI ANDROID 116
6.3 BỘ ĐIỀU KHIỂN 129
Chương 7: ĐIỀU KHIỂN THIẾT BỊ QUA WIFI 133
7.1 ĐẶT VẤN ĐỀ 133
7.2 ĐẶC ĐIỂM MODULE WIFI ESP8266 133
7.3 MỘT SỐ HỖ TRỢ KẾT NỐI WIFI TRONG ANDROID STUDIO 136
7.4 HỆ THỐNG ĐIỀU KHIỂN THIẾT BỊ QUA WIFI 136
Chương 8: ĐIỀU KHIỂN THIẾT BỊ QUA INTERNET 159
8.1 ĐẶT VẤN ĐỀ 159
8.2 ỨNG DỤNG THINGSPEAK TRÊN ĐIỆN THOẠI ANDROID 159
TỔNG KẾT 174
TÀI LIỆU THAM KHẢO 175
Trang 7Chương 1 GIỚI THIỆU VỀ ANDROID STUDIO
VÀ VẤN ĐỀ XỬ LÝ ĐA LUỒNG
Nếu bạn là người lập trình Android đã lâu, chắc hẳn bạn đã quen với môi trường của Eclipse Tuy nhiên với sự phát triển theo hướng riêng của mình, giờ đây Google đã giới thiệu Android Studio để thay thế cho Eclipse Có thể có những bước khác biệt ban đầu, tuy nhiên với
sự cam kết hoàn thiện và cải tiến mỗi ngày để mang đến sự tiện dụng và nhiều hỗ trợ từ Google thì Android Studio hoàn toàn là vùng đất mới đầy tiềm năng Ở quyển Android cơ bản trước đây của tôi đã xuất bản, tất cả các bài ví dụ, các chương trình được lập trình với Eclipse Giờ chúng ta cùng làm quen với Android Studio để có một bước chuyển qua môi trường mới
1.1 TỔNG QUAN VỀ ANDROID STUDIO
Để tải Android Studio, các bạn vào link sau:
http://developer.android.com/sdk/index.html
Hình 1.1 Giao diện trang tải Android Studio
Bạn bấm vào nút Download Android Studio để tải ứng dụng về Dung lượng của phiên bản ngày 23/03/2014 là 816MB Bản Android Studio này chứa đựng các thành phần sau:
- Android Studio IDE
- Android SDK tools
Trang 88
- Android 5.0 (Lollipop) Platform
- Android 5.5 emulator system image with Google APIs
Khi quyển sách được xem xét để xuất bản thì Android Studio đã hỗ trợ Android 6.0 Platform Điều đó chứng tỏ sự cải thiện và phát triển không ngừng nghỉ của tập đoàn công nghệ Google
Phần mềm yêu cầu cấu hình máy tính cài đặt như sau (ở đây tôi chỉ nói về cấu hình máy chạy hệ điều hành Windows):
Microsoft® Windows® 8/7/Vista/2003 (32 or 64-bit)
Tối thiểu 2 GB RAM, khuyến khích 4 GB RAM
Ổ cứng dư 400 MB và ít nhất 1 GB cho Android SDK, emulator system images, và caches
Độ phân giải màn hình tối thiểu 1280 x 800
Cài đặt Java Development Kit (JDK) 7 trở lên
Một số tùy chọn thêm để tăng tốc trình mô phỏng giả lập: Intel® processor with support for Intel® VT-x, Intel® EM64T (Intel® 64), và Execute Disable (XD) Bit
Một số ưu điểm của Android Studio được Google giới thiệu như sau:
- Trình soạn thảo code thông minh
Cốt lõi của Android Studio là trình soạn thảo mã (code) thông minh
có khả năng phân tích code, tái cấu trúc và hoàn thành mã nâng cao Trình soạn thảo mã mạnh mẽ giúp bạn trở thành một nhà lập trình ứng dụng Android hiệu quả hơn
Hình 1.2 Giao diện trình soạn thảo thông minh
Trang 9- Các đoạn code mẫu và tích hợp GitHub
Các hướng dẫn để tạo một dự án mới đã được soạn thảo để có thể thực hiện các ứng dụng dễ dàng hơn bao giờ hết Có nghĩa là bạn không phải làm tất cả, Android Studio đã hỗ trợ bạn một số bước đầu cần thiết Bạn có thể bắt đầu các dự án với các code mẫu, thậm chí nhập các code mẫu của Google từ GitHub
Github http://github.com, còn được gọi là mạng xã hội dành cho các nhà phát triển Github hoạt động tháng 02 năm 2008, là một dịch vụ
sử dụng hệ thống quản lý phân tán GIT giúp người dùng lưu trữ source code (mã nguồn) cho các dự án
Hình 1.3 Giao diện Import code mẫu vào project
- Hỗ trợ nhiều màn hình ứng dụng
Ta có thể dễ dàng xây dựng các ứng dụng cho điện thoại Android, tablet Android, các thiết bị đeo sử dụng Android wear, Tivi Android, kính Google
Với sự hỗ trợ module và màn hình giao diện mới này chúng ta có thể dễ dàng quản lý các project và tạo các tài nguyên
Trang 1010
Hình 1.4 Một số giao diện màn hình mẫu trong Android Studio
- Có tất cả các thiết bị ảo cho các loại màn hình với hình dáng và
Hình 1.5 Một số thiết bị ảo trong Android Studio
Trang 11- Android được xây dựng tiến hóa với Gradle
Tính năng này giúp tạo ra nhiều file APK cho ứng dụng Android của bạn với các thuộc tính khác nhau bằng việc sử dụng một project giống nhau; Quản lý ứng dụng phụ thuộc với Maven; Xây dựng APK từ Android Studio hoặc dòng lệnh
Maven là một công cụ lĩnh hội và quản lý dự án Nó cung cấp cho các nhà phát triển ứng dụng một framework vòng đời xây dựng hoàn chỉnh Maven có thể thiết lập các cách để làm việc theo tiêu chuẩn cho trước trong một thời gian rất ngắn Khi đó hầu hết các ứng dụng là đơn giản và có thể tái sử dụng Maven giúp các nhà phát triển thoải mái hơn,
dễ dàng hơn khi tạo ra các báo cáo, kiểm tra, xây dựng và thử nghiệm các thiết lập tự động
Hình 1.6 Sử dụng Gradle
1.2 CÀI ĐẶT ANDROID STUDIO
Vào thư mục download ứng dụng về và tiến hành cài đặt theo trình
tự sau:
- Nhấp đúp vào file android-studio-bundle-135.1740770-windows
để cài đặt
Trang 1212
Hình 1.7 Giao diện chào mừng việc cài đặt Android Studio
Hình 1.8 Giao diện chọn các thành phần cài đặt
Trang 13Hình 1.9 Giao diện các yêu cầu pháp lý, bản quyền
Hình 1.10 Thiết lập địa chỉ cài đặt
Trang 1414
Hình 1.11 Thiết lập trình giả lập
Hình 1.12 Chọn thư mục Start Menu
Trang 15Hình 1.13 Quá trình cài đặt đang diễn ra
Trang 1616
Hình 1.15 Import các project từ Eclipse
Sau khi import các project mà chúng ta đã có vào thì giao diện như hình 1.16 sau Phía bên trái chứa các project đã có, phía bên phải là màn hình soạn thảo Điều này sẽ được trình bày chi tiết phần ở phần sau, vì trình tự làm có thể khác Eclipse một chút
Hình 1.16 Giao diện màn hình soạn thảo với các project đã được
import vào
Trang 171.3 HƯỚNG DẪN TẠO MỘT ỨNG DỤNG MỚI TỪ ANDROID STUDIO VÀ DEBUG NÓ
Dĩ nhiên, nếu bạn muốn bắt đầu một project hoàn toàn mới từ Android Studio thì đây cũng không phải là việc khó khăn Phần ngay sau đây sẽ hướng dẫn các bạn cách bắt đầu với một ứng dụng đơn giản Giả sử chúng ta cần lập một ứng dụng có giao diện như sau:
Hình 1.17 Giao diện ứng dụng GUIBeginer
Khi nhấn vào nút CLICK ON ME thì trên màn hình sẽ xuất hiện dòng chữ “Chúc bạn có một sự khám phá đầy thú vị” hiện lên trong vài giây
Đầu tiên chúng ta sẽ tạo Project mới bằng cách nhấn vào dòng Start
a new Android Studio project
Trang 1818
Hình 1.18 Giao diện khởi tạo ứng dụng mới
Đặt tên cho ứng dụng và thư mục đặt project (các bạn có thể đặt tên khác và thư mục khác, ở đây tác giả đặt tên và đường dẫn như phần đóng khung)
Hình 1.19 Đặt tên ứng dụng và tạo đường dẫn lưu ứng dụng
Tiếp theo chọn thiết bị mà ứng dụng sẽ chạy (điện thoại, máy tính bảng, ti vi, đồng hồ thông minh hay kính thông minh) và phiên bản Android tối thiểu của thiết bị mà ứng dụng có thể chạy
Trang 19Hình 1.20 Chọn loại thiết bị và phiên bản hệ điều hành
Bạn có thể chọn giao diện màn hình mẫu của ứng dụng (Activity mẫu) mà Android hỗ trợ để xây dựng giao diện nhanh chóng Ở đây tôi chọn giao diện Activity của ứng dụng là Blank Activity (Activity để trắng) Chú ý hiện tại khi quyển sách được xem xét trước khi xuất bản (22/04/2016) thì Android Studio đã chạy phiên bản 1.5, lúc này có một
sự khác biệt nhỏ, bạn nên chọn Empty Activity cho phù hợp với những điều mà tôi sẽ hướng dẫn tiếp theo Chúng ta sẽ bàn thảo về các giao diện màn hình mẫu này trong những chương hoặc ứng dụng có liên quan
Hình 1.21 Một số Activity cho ứng dụng được cung cấp sẵn
Trang 2020
Tiếp theo bạn đặt tên Activity, Layout, Title và Menu
Hình 1.22 Đặt tên Activity, Layout, Title và Menu
Giao diện của Android Studio khi đó như sau:
Hình 1.23 Giao diện trình soạn thảo khi tạo ứng dụng
Đến đây bạn đã thấy khá quen thuộc, tương tự như với Eclipse rồi đúng không? Thật sự không quá khó để bắt đầu với Android Studio, giờ chúng ta hãy tiếp tục tìm hiểu nào!
Trang 21Nhìn vào bên trái màn hình ta thấy trong vùng liệt kê những thư mục khá giống Eclipse
Chúng ta có thư mục manifests chứa file AndroidManifest.xml, nơi chúng ta khai báo nhiều thứ quan trọng như Activity, Intent, Version, Permission
Thư mục Java sẽ chứa file.java chính là code của các Activity Ở đây ta chỉ có một Main Activity nên mặc định ta có một file MainActivity.java
Ở thư mục res\layout ta sẽ có file thiết kế giao diện Cụ thể là activity_main.xml
Ta chú ý thêm thư mục res\values\string.xml
Hình 1.24 Một số file quan trọng của ứng dụng
Trang 2222
Bên phần các thiết bị ảo, để dễ dàng cho việc chọn và thiết kế giao diện, chạy giả lập,… thì Android Studio đã liệt kê khá nhiều thiết bị, ta
có thể chọn thiết bị phù hợp
Hình 1.25 Một số giao diện thiết bị ảo sẵn có
Bây giờ có thể bắt đầu thiết kế giao diện theo yêu cầu:
Đầu tiên thiết kế một TextView, bằng cách kéo từ thanh Palete một TextView ra màn hình thiết kế Chú ý là có sẵn nhiều kiểu TextView, ở đây tôi chọn Large Text, có nghĩa là chữ có kích thước tương đối lớn Bạn hoàn toàn có thể chọn Small Text và sau đó tùy chỉnh lại size chữ cho phù hợp
Trang 23Hình 1.26 Tạo một Text View
Sau đó tôi vào mục Text bên file activity_main.xml để hiệu chỉnh lại TextView này
Hình 1.27 Hiệu chỉnh TextView
Chú ý dòng android:text= “Large Text” Bạn có thể sửa lại theo
nội dung mà mình mong muốn, tuy nhiên ở đây tôi sửa theo cách khác,
có thể phải thực hiện nhiều thủ thuật hơn nhưng “an toàn và hợp lý” hơn
Trang 2424
Các bạn mở file String.xml và chọn vào dòng Open editor
Hình 1.28 Chỉnh sửa file Strings.xml
Khi đó hộp thoại Editor của Strings.xml hiện ra Bạn nhấn vào dấu cộng (+) góc trái bên trên để thêm vào một Key liên kết Ở đây tôi đặt key là “tieude” với giá trị mặc định là “Chào mừng đến Android Studio”, sau đó Ok
Hình 1.29 Thêm Key trong file Strings.xml
Sau đó bạn quay trở lại file activity_main.xml và chỉnh lại nội dung
dòng android:text= “Large Text” thành android:text="@string/tieude"
Trang 25Hình 1.30 Chỉnh sửa TextView trong file activity_main.xml
Bước tiếp theo là bạn tạo một Button
Hình 1.31 Tạo một Button mới
Sau đó giống như TextView bên trên bạn vào Strings.xml để tạo một Key liên kết cho Button này
Trang 26Khi đó giao diện cơ bản như sau:
Hình 1.33 Giao diện cơ bản của ứng dụng GUIBeginer theo yêu cầu
Giờ chúng ta viết code để thực hiện theo yêu cầu là khi nhấn vào nút “CLICK ON ME” nó sẽ xuất hiện câu “Chúc bạn có một sự khám phá đầy thú vị”
Trang 27Bạn mở file MainActivity.java tại thư mục
app\java\com.example.sony.guibeginer\MainActivity, lưu ý là tên thư
mục có thể khác do bạn đặt ban đầu
Hình 1.34 Giao diện file MainActivity cho ứng dụng GUIBeginer
Bạn viết code cho file này như sau (lưu ý có những phần có sẵn và các dòng in đậm)
import static android.widget.Toast.*;
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Trang 28}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here The action bar will
// automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml
Trang 29chỉ giải thích những đoạn code mới hoặc thật sự cần thiết Vì vậy phần code bên trên không được giải thích chi tiết mà ví dụ trên chỉ có mục đích
là giúp các bạn làm quen với môi trường Android Studio mà thôi
1.4 CÁCH CHẠY KIỂM TRA CHƯƠNG TRÌNH (DEBUG CHƯƠNG TRÌNH)
Bạn có thể có nhiều cách để chạy chương trình Hoặc dùng máy ảo của chính Android Studio hoặc debug thẳng xuống thiết bị Android mà bạn đang có Hoặc dùng một chương trình nào chạy trên window giả lập môi trường Android để có thể chạy được các ứng dụng apk bạn vừa biên dịch, hoặc chép file apk ra thiết bị thật để chạy Việc chạy máy ảo của Android Studio có điểm thuận lợi là chúng ta không phải cài thêm gì nữa, kích thước màn hình phù hợp, các phiên bản hệ điều hành luôn được cập nhật mới Tuy nhiên khuyết điểm của nó là khá nặng, các máy cấu hình yếu khó đáp ứng Việc chờ đợi có thể khiến bạn khó chịu Một số phần mềm gợi ý cho các bạn trong trường hợp này là: Bluestacks, Droid4x, Genymotion,…
Phần tiếp theo sẽ trình bày về cách debug thiết bị thật thông qua Android Studio Vì có rất nhiều thiết bị chạy Android nên tác giả không thể hướng dẫn cụ thể cho từng thiết bị được Tốt nhất, các bạn nên tra trên Google cách đưa thiết bị của mình vào chế độ có thể debug qua USB Sau khi thiết lập xong chế độ dành cho developer, bạn cắm cáp kết nối thiết bị Android với máy tính Trên Android Studio bạn làm như sau:
- Vào biểu tượng chú robot xanh (app), nhấp vào mũi tên xuống chọn Edit Configurations như hình bên dưới
Hình 1.35 Thiết lập trước khi chạy App
Trang 3030
Khi đó chúng ta thiết lập một số tùy chọn như sau:
Lưu ý: Ở đây chỉ có một ứng dụng duy nhất nên không cần chọn ứng dụng debug
Mục General chú ý phần:
- Package chọn: Deploy default APK
- Activity chọn: Launch default Activity
- Target Device: Tại đây nếu dùng thiết bị mô phỏng là máy ảo thì chọn Emulator, sau đó khi chọn máy ảo chúng ta sẽ debug Phần này vì debug trên thiết bị thật nên tôi chọn USB device
Hình 1.36 Thiết lập các thông số tùy chọn Run/Debug
Tiếp theo bạn chọn thiết bị để debug Click vào biểu tượng Attach debugger to Android proccess Khi đó sẽ hiện tên thiết bị mà bạn đang kết nối và có thể debug Ở đây tôi dùng Sony xperia z1 nên tên như hình bên dưới
Trang 31Hình 1.37 Chọn thiết bị để debug
Lưu ý rằng nếu điện thoại của bạn sau khi làm tất cả các công đoạn trên nhưng Android Studio vẫn không nhận ra, thì khi đó bạn nên tìm driver của nó và cài vào máy tính, restart tất cả lại nhé
Sau đó ta nhấn nút Run App hoặc tổ hợp phím Shift + F10 để chạy chương trình Chương trình của chúng ta sẽ được đổ xuống điện thoại, và các thao tác trên ứng dụng khi đó được hiển thị ở khung logcat góc dưới của Android Studio
Chương trình được chạy trên điện thoại và bạn nhấn nút “CLICK
ON ME” để xem kết quả nhé Tùy theo phiên bản hệ điều hành của thiết
bị Android đang chạy mà dòng thông báo hiển thị có thể khác đôi chút nhưng nội dung không thay đổi
Trang 3232
Hình 1.38 Giao diện ứng dụng khi chạy và nhấn nút CLICK ON ME
Đến đây hẳn các bạn đã quen với môi trường làm việc của Android Studio rồi đúng không? Bây giờ chúng ta sẽ đi vào các chương chính của quyển sách là các vấn đề lập trình điều khiển thiết bị trong Android như thế nào! Và đây cũng là vấn đề khá rộng, nhưng quyển sách hướng đến các sinh viên năm ba, năm tư các chuyên ngành liên quan đến lĩnh vực điện tử, điều khiển tự động và đòi hỏi người đọc phải có những nền tảng
cơ bản về lĩnh vực điện tử!
Trước khi đi sâu vào vấn đề điều khiển, tác giả xin trình bày về vấn
đề xử lý đa luồng trong Android vì hầu hết các ứng dụng đều phải sử dụng nó Vấn đề này chưa được đề cập đến trong quyển “Lập trình Android cơ bản” của chính tác giả đã được xuất bản trước đây
1.5 LÀM THẾ NÀO ĐỂ THỰC THI ĐA LUỒNG THREADING) TRONG ANDROID VỚI HANDLER CLASS
(MULTI-Trong chủ đề này, chúng ta sẽ tìm hiểu về tiến trình thực thi đa luồng (multi-thread) trong Android bằng cách sử dụng lớp Handler để làm điều này Như đã nói ở phần trước, trong quyển Lập trình Android
cơ bản, tôi đã không trình bày nhiều về phần này, nhưng khi thực hiện kết nối Bluetooth, wifi, 3G,…trong bài toán điều khiển, chúng ta sẽ cần
Trang 33phải thường xuyên sử dụng lập trình đa luồng Nên sẽ thật hữu ích nếu bạn nắm vững những vấn đề sắp được trình bày dưới đây
Giới thiệu
Xử lý đa luồng được định nghĩa như là một thuộc tính mà thông qua đó ta có thể chạy nhiều hơn hai luồng song song của cùng một tiến trình Trong tiến trình này, dữ liệu chung được chia sẻ giữa các luồng với nhau, các luồng cũng được biết như là các tiến trình con được thực thi Trong Android, có nhiều cách mà thông qua đó việc xử lý đa luồng được thiết lập trong ứng dụng của bạn
Mục tiêu của phần này là:
Hiểu biết khái niệm cơ bản về đa luồng (multithreading)
Hiểu biết về lớp Handler trong Android
Hiểu biết về giao diện Runnable (Runnable interface)
Đa luồng (Multi-Threading) trong Android:
Đa luồng trong Android là một thuộc tính đồng nhất, thông qua đó
có nhiều hơn một luồng cùng được thực thi, và việc thực thi của luồng này không làm ẩn đi sự thực thi của luồng khác Đa luồng trong Android không có khác biệt với khái niệm đa luồng truyền thống Một lớp có thể được xem như một tiến trình (process), các phương thức xử lý của nó có thể coi như là các tiến trình con (sub-process) hay được gọi là các luồng (thread) Tất cả phương thức này có thể chạy đồng thời bằng việc sử dụng thuộc tính của đa luồng Trong Android, đa luồng có thể được giải quyết thông qua việc sử dụng nhiều lớp được xây dựng bên trong, và Handler class là lớp được dùng phổ biến nhất
Khái niệm về Luồng (Thread)
- Luồng là một đơn vị chạy đồng thời của quá trình thực thi
- Luồng có các ngăn xếp riêng của nó có thể được gọi riêng, nó có các đối số và biến cục bộ
- Mỗi thực thể máy ảo có ít nhất một luồng chính đang chạy khi chúng được khởi động Thông thường, có một vài luồng khác thực hiện cùng lúc
- Ứng dụng có thể quyết định phát ra các luồng hỗ trợ cho các mục đích cụ thể
Các luồng trong cùng một máy ảo tương tác và đồng bộ hóa bằng cách sử dụng các đối tượng được chia sẻ và giám sát kết hợp với các đối tượng này
Trang 3434
Về cơ bản có hai cách chính để một Luồng thực thi trong ứng dụng:
1 Một là, cung cấp một class mới để mở rộng Luồng và được viết
thông qua phương thức run()
2 Hai là, cung cấp một thực thể luồng mới với đối tượng
Runnable trong suốt quá trình tạo nó
Trong cả hai trường hợp trên, phương thức start() phải được gọi để
thực thi luồng mới này
Hình 1.39 Hoạt động của các luồng trong tiến trình xử lý
Thuận lợi của việc xử lý đa luồng (Multi-Threading)
1 Các luồng chia sẻ tài nguyên của Process (tiến trình) nhưng có
thể thực thi một cách độc lập
2 Khả năng đáp ứng của các ứng dụng có thể được riêng biệt như:
- Luồng chính (main thread) sẽ chạy các UI (giao diện người dùng) và
- Các công việc thấp (slow: xét về mức ưu tiên chẳng hạn) được
gởi đến các luồng ngầm (background threads)
3 Luồng cung cấp lớp trừu tượng hữu ích cho việc thực thi đa nhiệm
4 Đặc biệt hữu ích trong trường hợp một tiến trình đơn (single
process) phát sinh ra nhiều luồng trên hệ thống đa tiến trình
(multiprocessor: đa xử lý hay đa tiến trình) Khi đó sự đa nhiệm là thật sự
đạt được
5 Do đó, một chương trình đa luồng vận hành nhanh hơn trên các
hệ thống máy tính có nhiều CPU
Các tài nguyên bộ nhớ chung
Thread-1
Thread-2
MainThread
Process 1 (Dalvik Virtual Machine 1)
Các tài nguyên bộ nhớ chung
MainThread
Process 2 (Dalvik Virtual Machine 2)
Trang 35Bất lợi của xử lý đa luồng
1 Việc coding sẽ phức tạp hơn
2 Cần khả năng phát hiện, tránh và giải quyết các bế tắc (deadlock)
Cách tiếp cận của Android với các hoạt động thấp (xét về mức ưu tiên, thời gian tác động)
Một ứng dụng có thể liên quan đến một công việc tiêu tốn quá nhiều thời gian, tuy nhiên chúng ta mong muốn rằng UI (giao diện người dùng) vẫn có thể đáp ứng tốt với người dùng Android cung cấp cho chúng ta hai cách để giải quyết tình huống này:
1 Làm các công việc tiêu tốn nhiều thời gian đó trong dịch vụ nền (background service), bằng sử dụng các notification (thông báo)
để chuyển đến người dùng về bước tiếp theo
2 Làm các hoạt động đó trong luồng background
Sự tương tác giữa các luồng được thực hiện bằng việc sử dụng các đối tượng (a) Handler và đẩy (b) các đối tượng Runnable đến view chính
a) Handler Class trong Android
Handler class đến từ đóng gói android.os.Handler, do đó muốn sử dụng ta phải import nó vào trước Handler class được sử dụng phổ biến nhất trong việc xử lý đa luồng Handler cung cấp thuộc tính gởi và nhận các tin nhắn (message) giữa hai luồng khác nhau và xử lý sự thi hành của một luồng với sự hỗ trợ của thực thể lớp Handler đó
Trong lớp android, mỗi luồng được sự hỗ trợ của một thực thể lớp Handler và nó cho phép luồng đó chạy dọc theo các luồng khác và truyền thông với chúng thông qua các tin nhắn
Handler được dùng cho hai việc chính:
- Để sắp xếp các message (tin nhắn) và runnable (hàm có thể chạy) cho nó thực thi tại một vài thời điểm nào đó trong tương lai
- Để xếp hàng một hoạt động được thực thi trên luồng còn lại
Cảnh báo:
- Các luồng nền (background threads) không được cho phép tương tác với UI
- Chỉ process chính mới có thể truy cập đến view của activity
- Các biến class toàn cục có thể được thấy và update trong tất cả các luồng
Trang 3636
Khởi tạo Handler class:
Có hai cách sau thường được dùng để khởi tạo Handler class hỗ trợ cho việc xử lý đa luồng:
Thông qua hàm tạo mặc định:
Handler handlerObject = new Handler();
Thông qua hàm tạo tham số:
Handler handleObject = new Handler(Runnable
runnableObject, Handler.Callback callbackObject);
Các phương thức của Handler class cho việc xử lý đa luồng:
- Public final Boolean post(Runnable runnableObject){ return
booleanValue; }
Phương thức này đính kèm một thực thể có thể chạy (runnable) với luồng nó hỗ trợ và các lệnh của thực thể runnable sẽ được thực thi mỗi khi luồng này được thực thi
- Public final Boolean postAtTime((Runnable runnableObject,
long timeinMillisecondObject) { return booleanValue; }
Phương thức này đính kèm một thực thể có thể chạy (runnable) với luồng nó hỗ trợ và các lệnh của thực thể runnable sẽ được thực thi mỗi
khi luồng này được thực thi tại một thời điểm cụ thể, theo đối số giây
(mili giây)
- Public final Boolean postDelayed((Runnable runnableObject,
long timeinMillisecondObject){ return booleanValue; }
Phương thức này đính kèm một thực thể có thể chạy (runnable) với luồng nó hỗ trợ và các lệnh của thực thể runnable sẽ được thực thi mỗi
khi luồng này được thực thi sau một thời gian cụ thể theo đối số giây
(mili giây)
b) Runnable Interface (giao diện có thể chạy)
Giao diện Runnable được gọi ra trong một vòng lặp khi luồng đó được khởi động Nó sẽ thực thi các lệnh bên trong nó hoặc gọi các phương thức khác cho một trường hợp cụ thể hoặc với số lần không xác định
Giao diện Runnable này được dùng với lớp Handler để thực thi xử
lý đa luồng, tức là để thực thi một hoặc nhiều luồng trong một khoảng thời gian cụ thể Runnable là một giao diện thực thi bởi lớp này nhằm hỗ trợ xử lý đa luồng và lớp này phải được viết bởi phương thức trừu tượng
của nó là public void run()
Trang 37Phương thức Run() là lõi của xử lý đa luồng, nó bao gồm các lệnh
hoặc gọi các phương thức khác cần thiết Ta có thể tạo một class thực thi hàm Run() này như sau:
class ClassName implementsRunnable {
Trước khi bàn về vấn đề khởi tạo xử lý các luồng khác nhau, chúng
ta hãy làm một ví dụ về Handler để các bạn có cái nhìn cụ thể hơn
Giả sử chúng ta muốn viết một ứng dụng đếm ngược thời gian, ban đầu nút nhấn được ẩn đi, sau 10 giây thì nút nhấn hiện lên và khi đó nếu tương tác với nút nhấn đó thì sẽ hiện ra một thông báo Về giao diện ứng dụng này khá đơn giản:
Hình 1.40 Giao diện ứng dụng lúc thiết kế và lúc thực thi trên máy thật
Trang 39File String.xml chứa các key như sau
public class MainActivity extends AppCompatActivity {
Handler hand = new Handler();
Trang 40Giải thích về chương trình trên:
Thiết lập ban đầu để nút “CLICK ON ME” ẩn đi trong file thiết kế xml, chúng ta dùng thuộc tính:
android:visibility="invisible"
Tạo một Hanler có tên là hand:
Handler hand = new Handler();
Lưu ý phải tự add thư viện Handler vào bằng cách dùng cú pháp
vị cho đến khi bằng 0 thì sẽ hiện ra nút nhấn “CLICK ON ME” Do
chúng ta đã dùng phương thức hand.postDelayed(run1,1000), vì thế hàm