Người lập trình ứng dụng cho thiết bị di động truyền thống luôn luôn phải nhớtrong đầu nguyên tắc "tiết kiệm tối đa tài nguyên" của thiết bị, dùng mọi cách để tối ưuhóa độ phức tạp tính
Trang 1MỤC LỤC
Trang 2DANH MỤC CÁC HÌNH
Trang 3DANH MUC BẢNG
Trang 4CHƯƠNG 1: TỔNG QUAN VỀ LẬP TRÌNH TRÊN NỀN TẢNG DI
ĐỘNG1.1 Tổng quan về lập trình di động.
Người lập trình ứng dụng cho thiết bị di động truyền thống luôn luôn phải nhớtrong đầu nguyên tắc "tiết kiệm tối đa tài nguyên" của thiết bị, dùng mọi cách để tối ưuhóa độ phức tạp tính toán cũng như lượng bộ nhớ cần sử dụng Tuy nhiên, cùng với sựphát triển nhanh chóng của phần cứng, các thiết bị di động hiện đại thường có cấu hìnhrất tốt, với chip xử lý mạnh mẽ, bộ nhớ (RAM) lớn, khiến việc lập trình cho thiết bị didộng trở nên dễ dàng hơn bao giờ hết Các bộ kit phát triển của các hãng sản xuất hệđiều hành di động hiện nay cũng thường làm trong suốt hầu hết các tác vụ liên quanđến quản lý bộ nhớ, quản lý tiến trình Lập trình viên có thể ít quan tâm hơn đến việctối ưu hóa sử dụng tài nguyên và tập trung vào việc "lập trình", phát triển tính năngcho ứng dụng như khi lập trình cho máy tính cá nhân
Tuy nhiên, đặc trưng di động của các thiết bị này cũng đem đến nhiều vấn đề
mà người lập trình cần phải quan tâm như:
Tính "di động" của các thiệt bị này khiến kết nối mạng trở nên rất bất ổn định
và khó kiểm soát Các ứng dụng phụ thuộc nhiều vào kết nối Internet cần chú ý điểmnày
Lưu lượng Internet trền thiết bị di động thường có chi phí cao hơn so vớiInternet cố định Điều này cũng cần lưu ý khi phát triển các ứng dụng sử dụng nhiềutài nguyên Internet như phim trực tuyến, nhạc trực tuyến
So với máy tính cá nhân, các thiết bị di động hiện đại được trang bị thêm rấtnhiều tính năng giúp việc tương tác với người dùng trở nên thuận tiện (màn hình cảmứng đa điểm, tương tác giọng nói, cử chỉ ), các loại kết nối đa dạng (NFC, GPS, 3G,4G, bluetooth, IR ), các cảm biến phong phú giúp trải nghiệm rất đa dạng (cảm biếnánh sáng, cảm biến tiệm cận, la bàn, cám biến chuyển động, gia tốc kế ) Người lậptrình, tùy thuộc vào ứng dụng cụ thể, có thể sử dụng đến các tính năng đặc biệt này đểđem đến cho người dùng trải nghiệm tốt nhất trên thiết bị di động của mình
Trang 5Ngoài ra các hãng phát triển hệ điều hành di động đều làm ra bộ công cụ pháttriển (SDK) và môi trường phát triển tích hợp (IDE) rất thuận tiện cho việc viết mãnguồn, biên dịch, gỡ rối, kiểm thử cũng như xuất bản phần mềm.
Xét theo thị phần trên thị trường, ba hệ điều hành phổ biến nhất cho thiết bị diđộng hiện nay là Google's Android, Apple's iOS và Microsoft's Windows Phone Mỗiứng dụng thành công thường được phát triển cho cả 3 hệ nền này Mỗi hệ nền đều cómột chợ ứng dụng chính hãng (Google có Google Play Store, Apple có AppleAppStore, Microsoft có Windows Phone Store) với rất nhiều khách hàng tiềm năng,giúp người phát triển có thể phân phối ứng dụng miễn phí hoặc có phí với chi phí nhấtđịnh
Bảng dưới đây liệt kê các hệ điều hành cùng với ngôn ngữ lập trình và IDE phổbiến nhất của nó
Bảng 1.1: Giới thiệu về các HĐH di độngNgoài việc phát triển ứng dụng cho từng hệ điều hành như kể trên, lập trìnhviên có thể lựa chọn các thư viện lập trình đa nền tảng để phát triển ứng dụng, phổbiến nhất trong các ứng dụng đa nền là các ứng dụng viết bằng ngôn ngữ Web(HTML5, CSS & Javascript) Trình duyệt web của các thiết bị di động hiện nay có đầy
đủ tính năng lẫn hiệu năng để chạy tốt các ứng dụng web hiện đại Một ứng dụng Web
có thể được đặt trên máy chủ hoặc được đóng gói thành native app (ứng dụng cho từng
hệ điều hành) qua một số công cụ đóng gói của các hãng thứ ba
Công cụ đóng gói ứng dụng Web cho thiết bị di động phổ biến nhất hiện nay làPhoneGap (http://phonegap.com/), được phát triển bởi Nitobi, sau được Adobe mualại PhoneGap cho phép lập trình viên phát triển ứng dụng di động sử dụng ngôn ngữWeb phổ biến (HTML5, CSS3 và Javascript), với các tính năng bổ sung, cho phép ứng
Trang 6thành ứng dụng cho nhiều hệ điều hành khác nhau, bao gồm Android, iOS,Blackberry, BlackBerry 10, Windows Phone, Windows 8, Tizen, Bada Tuy nhiên,nhược điểm của các ứng dụng loại này là hiệu suất thấp (chạy không được "mượt mà"như ứng dụng native) và không đồng nhất giữa tất cả các trình duyệt Web di động (cóthể chạy hoặc hiển thị khác nhau trên các hệ điều hành với các trình duyệt khác nhau).
Việc chọn hệ điều hành/thư viện nào để phát triển tùy thuộc vào nhiều yếu tốkhác nhau như mục đích của ứng dụng, đối tượng sử dụng, tiềm năng của hệ điềuhành, các yêu cầu kỹ thuật cụ thể cũng như thói quen và kỹ năng của lập trình viên.Trong khuôn khổ giáo trình này, chúng tôi tập trung đi sâu vào việc phát triển ứngdụng cho hệ điều hành di động phổ biến nhất hiện nay - Google's Android
1.2 Tổng quan về hệ điều hành Android.
1.2.1 Giới thiệu về hệ điều hành android
Android là mộ hệ điều hành di động mã nguồn mở miễn phí và được ưa chuộngtrên thế giới dựa trên nền tảng Linux kernel do Google phát triển dành cho các dòngđiện thoại Smartphone và máy tính bảng
Tháng 11/2007, Liên minh thiết bị cầm tay mở rộng (Open Handset Alliance)với sự đồng thuận của Texas Instruments, Tập đoàn Broadcom, Google, HTC, Intel,
LG, Tập đoàn Marvell Technology, Motorola, Nvidia, Qualcomm, SamsungElectronics, Sprint Nextel và T-Mobile đã thành lập với mục đích phát triển các tiêuchuẩn mở cho thiết bị di động
Từ tháng 10/2008, hệ điều hành Android đã chính thức trở thành phần mềm mãnguồn mở Theo đó, các công ty thứ ba được phép thêm những ứng dụng của riêng của
họ vào Android và bán chúng
Đến năm 2010, số lượng smartphone nền tảng Android tăng trưởng mạnh mẽ.Hàng loạt nhà sản xuất hàng đầu đã bắt tay sản xuất smartphone như Samsung, HTC,Motorola…
Cấu trúc, công nghệ áp dụng trong hệ điều hành android
Hệ điều hành Android có 4 tầng đó là tầng Application, tầng ApplicationFramework, tầng Libraries & Android runtime, tầng cuối cùng là Linux kernel
Trang 7Hình 1.1: Cấu trúc hệ điều hành Android
Application Framework
Tầng này cung cấp một nền tảng phát triển ứng dụng mở và xây dựng bộ công
cụ các phần tử ở mức cao qua đó cho phép nhà phát triển ứng dụng có thể nhanhchóng xây dựng ứng dụng và khả năng tạo ra các ừng dụng mới phong phú hơn
Các lợi ích mà tầng này cung cấp cho nhà phát triển:
Trang 8Với các nhà sản xuất phần cứng điện thoại: có thể tùy biến hệ điều hành để phùhợp với cấu hình phần cứng điện thoại mà họ sản xuất cũng như để có nhiều mẫu mãđiện thoại để phù hợp với thị hiếu của người tiêu dùng.
Với nhà phát triển ứng dụng: Cho phép các lập trình viên có thể sử dụng cácAPI ở tầng trên mà không cần phải hiển rõ cấu trúc bên dưới Một tập hợp các API rấthữu ích được xây dựng sẵn như hệ thống định vị, các dịch vụ chạy nền, liên lạc giữacác ứng dụng, các thành phần giao diện, điều này tạo điều kiện thuận lợi cho các lâptrình viên làm việc vì họ chỉ cần quan tâm đến nội dung mà ứng dụng của họ màkhông cần phải quan tâm đến những thứ liên quan khác
Các thành phần của Application Framework
- Activity Manager: Quản lý các chu kỳ sống của một ứng dụng cũng nhưcung cấp công cụ điều khiển các Activity
- Telephony Manager: Cung cấp công cụ để thực hiện việc liên lạc gọiđiện thoại
- Location Manager: Cho phép xác định vị trí của điện thoại dựa vào hệthống định vị toàn cầu GPS và Google Maps
- Window Manager: Quản lý việc xây dựng và hiển thị các giao diệnngười dùng cũng như tổ chức quản lý các giao diện giữa các ứng dụng
- Notication Manager: Quản lý việc hiển thị các thông báo như tin nhắn,email…
- Resource Manager: Quản lý tài nguyên tĩnh của các ứng dụng bao gồmcác file hình ảnh, âm thanh, layout
- View System: được dùng để xây dựng giao diện một ứng dụng bao gồmcác văn bản, nút bấm và cả những web nhúng
- Content Providers :Cho phép truy cập dữ liệu từ các ứng dụng khác nhưquản lý danh bạ hoặc chia sẽ dữ liệu của riêng mình
Libraries & Android runtime
Libraries chứa các thư viện viết bằng C/C++ để các phần mềm có thể sử dụng.Những tính năng này được cung cấp cho các lập trìng viên thông qua bộ frameworkcủa Android, các thư viện đó được tập hợp thành một số nhóm như:
System C library: thư viện dựa trên chuẩn C, được sử dụng chỉ bởi hệ điềuhành
Trang 9- Media Libraries: Có nhiều codec để hỗ trợ việc phát và ghi lại các loạiđịnh dạng âm thanh, hình ảnh, video.
- LibWebCore: Đây là thành phần để xem nội dung trên web, được sửdụng để xây dựng phần mềm duyệt web (Android Browse) và các ứngdụng nhúng vào web Nó hỗ trợ các công nghệ như HTML5, javaScript,CSS, Flash…
- Surface Manager: quản lý truy cập vào các hệ thống hiển thị và tổng hợp
đồ họa 2D và 3D các lớp từ nhiều ứng dụng trên thiết bị
- SGL: công cụ đồ họa 2D cơ bản
- 3D libraries: Dựa trên OpenGL ES 1.0 API, dùng để tăng tốc phần cứng3D hoặc để tối ưu hóa các phần mềm 3D
- SQLite : Hệ cơ sở dữ liệu dùng cho tất cả các ứng dụng
Android runtime Phần này chứa các thư viện mà một chương trình viết bằngngôn ngữ Java có thể hoạt động Phần này có 2 bộ phận tương tự như mô hình chạyJava trên máy tính:
- Các thư viện lõi (Core Library) chứa các lớp như Java IO, collections,File Access
- Một máy ảo java (Dalvik Virtual Machine)
1.2.1.1 Các thành phần trong một Android Project
AndroidManifest.xml
Trong bất kì một project Android nào khi tạo ra đều có một fileAndroidManifest.xml, file này được dùng để định nghĩa các screen sử dụng, cácpermission cũng như các theme cho ứng dụng Đồng thời nó cũng chứa thông tin vềphiên bản SDK cũng như main activity sẽ chạy đầu tiên File này được tự động sinh rakhi tạo một Android project Trong file manifest bao giờ cũng có 3 thành phần chính
đó là: application, permission và version
Application
Thẻ <application>, bên trong thẻ này chứa các thuộc tính được định nghĩacho ứng dụng Android như:
• Android:icon = “drawable resource” Ở đây đặt đường dẫn đến file icon của
ứng dụng khi cài đặt VD: android:icon = “@drawable/icon”.
Trang 10• Android:name = “string” thuộc tính này để đặt tên cho ứng dụng Android Tên
này sẽ được hiển thị lên màn hình sau khi cài đặt ứng dụng
• Android:theme = “drawable theme” thuộc tính này để đặt theme cho ứng
dụng Các theme là các cách để hiển thị giao diện ứng dụng Ngoài ra còn nhiềuthuộc tính khác…
Permission
Bao gồm các thuộc tính chỉ định quyền truy xuất và sử dụng tài nguyên của ứngdụng Khi cần sử dụng một loại tài nguyên nào đó thì trong file manifest của ứng dụngcần phải khai báo các quyền truy xuất như sau:
SDK version
Thẻ xác định phiên bản SDK được khai báo như sau:
Ở đây chỉ ra phiên bản SDK nhỏ nhất mà ứng dụng hiện đang sử dụng
File R.java
File R.java là một file tự động sinh ra ngay khi tạo ứng dụng, file này được
sử dụng để quản lý các thuộc tính được khai báo trong file XML của ứng dụng và cáctài nguyên hình ảnh
Mã nguồn của file R.java được tự động sinh khi có bất kì một sự kiện nàoxảy xa làm thay đổi các thuộc tính trong ứng dụng Chẳng hạn như, bạn kéo và thả mộtfile hình ảnh từ bên ngoài vào project thì ngay lập tức thuộc tính đường dẫn đến file đócũng sẽ được hình thành trong file R.java hoặc xoá một file hình ảnh thì đường dẫntương ứng đến hình ảnh đó cũng tự động bị xoá Có thể nói file R.java hoàn toànkhông cần phải đụng chạm gì đến trong cả quá trình xây dựng ứng dụng
Trang 11• Những phần của ứng dụng mà hệ thống biết đang chạy
• Những phần quan trọng như thế nào đối với người dung Bao nhiêu vùng nhớchiếm lĩnh trong hệ thống
Chu kỳ sống thành phần
Các thành phần ứng dụng có một chu kỳ sống, tức là mỗi thành phần từ lúc bắtđầu khởi tạo và đến thời điểm kết thúc Giữa đó, đôi lúc chúng có thể là active hoặcinactive, hoặc là trong trường hợp activies nó có thể visible hoặc invisible
Activity Stack
Bên trong hệ thống các activity được quản lý như một activity stack Khi mộtActivity mới được start, nó được đặt ở đỉnh của stack và trở thành activity đang chạyactivity trước sẽ ở bên dưới activity mới và sẽ không thấy trong suốt quá trình activitymới tồn tại
Nếu người dùng nhấn nút Back thì activity kết tiếp của stack sẽ di duyển lên vàtrở thành active
Hình 1.2: Activity stack
Các trạng thái của chu kỳ sống
Trang 12Hình 1.3: Chu kỳ sống của Activity
Một Activity chủ yếu có 3 chu kỳ chính sau:
- Active hoặc running: Khi Activity là được chạy trên màn hình Activitynày tập trung vào những thao tác của người dùng trên ứng dụng
- Paused: Activity là được tạm dừng (paused) khi mất focus nhưng ngườidung vẫn trông thấy Có nghĩa là một Activity mới ở trên nó nhưngkhông bao phủ đầy màn hình Một Activity tạm dừng là còn sống nhưng
có thể bị kết thúc bởi hệ thống trong trường hợp thiếu vùng nhớ
- Stopped: Nếu nó hoàn toàn bao phủ bởi Activity khác Nó vẫn còn trạngthái và thông tin thành viên trong nó Người dùng không thấy nó vàthường bị loại bỏ trong trường hợp hệ thống cần vùng nhớ cho tác vụkhác
Chu kỳ sống của ứng dụng
Trong một ứng dụng Android có chứa nhiều thành phần và mỗi thành phần đều
có một chu trình sống riêng Và ứng dụng chỉ được gọi là kết thúc khi tất cả các thànhphần trong ứng dụng kết thúc Activity là một thành phần cho phép người dùng giao
Trang 13tiếp với ứng dụng Tuy nhiên, khi tất cả các Activity kết thúc và người dùng khôngcòn giao tiếp được với ứng dụng nữa nhưng không có nghĩa là ứng dụng đã kết thúc.Bởi vì ngoài Activity là thành phần có khả năng tương tác người dùng thì còn có cácthành phần không có khả năng tương tác với người dùng như là Service, Broadcastreceiver Có nghĩa là những thành phần không tương tác người dùng có thể chạybackground dưới sự giám sát của hệ điều hành cho đến khi người dùng tự tắt chúng.
Các sự kiện trong chu kỳ sống của ứng dụng
Nếu một Activity được tạm dừng hoặc dừng hẳn, hệ thống có thể bỏ thông tinkhác của nó từ vùng nhớ bởi việc finish() (gọi hàm finish() của nó), hoặc đơn giản giếttiến trình của nó Khi nó được hiển thị lần nữa với người dùng, nó phải được hoàn toànrestart và phục hồi lại trạng thái trước Khi một Activity chuyển qua chuyển lại giữacác trạng thái, nó phải báo việc chuyển của nó bằng việc gọi hàm transition
Hình 1.4: Các sự kiện trong một chu kì ứng dụng Tất cả các phương thức là những móc nối mà bạn có thể override để làmtương thich công việc trong ứng dụng khi thay đổi trạng thái Tất cả các Activity bắtbuộc phải có onCreate() để khởi tạo ứng dụng Nhiều Activity sẽ cũng hiện thựconPause() để xác nhận việc thay đổi dữ liệu và mặt khác chuẩn bị dừng hoạt động vớingười dùng
Thời gian sống của ứng dụng
Bảy phương thức chuyển tiếp định nghĩa trong chu kỳ sống của mộtActivity Thời gian sống của một Activity diễn ra giữa lần đầu tiên gọi onCreate() đếntrạng thái cuối cùng gọi onDestroy() Một Activity khởi tạo toàn bộ trạng thái toàn cụctrong onCreate(), và giải phóng các tài nguyên đang tồn tại trong onDestroy()
Trang 14Thời gian hiển thị của Activity
Visible lifetime của một activity diễn ra giữa lần gọi một onStart() cho đếnkhi gọi onStop() Trong suốt khoảng thời gian này người dùng có thể thấy activity trênmàn hình, có nghĩa là nó không bị foreground hoặc đang tương tác với người dùng.Giữa 2 phương thức người dùng có thể duy trì tài nguyên để hiển thị activity đếnngười dùng
Các phương thức của chu kỳ sống
Phương thức: onCreate()
- Được gọi khi activity lần đầu tiên được tạo
- Ở đây bạn làm tất cả các cài đặt tĩnh tạo các view, kết nối dữ liệu đếnlist và v.v
- Phương thức này gửi qua một đối tượngBundle chứa đựng từ trạng thái
trược của Activity
- Luôn theo sau bởi onStart()
- Được gọi trước khi một activity visible với người dùng
- Theo sau bởi onResume() nếu activity đến trạng thái foreground hoặc onStop() nế nó trở nên ẩn.
Phương thức: onResume()
- Được gọi trước khi activity bắt đầu tương tác với người dùng
- Tại thời điểm này activity ở trên dỉnh của stack activity
- Luôn theo sau bởi onPause()
Phương thức: onPause()
- Được gọi khi hệ thống đang resuming activity khác
- Phương thức này là điển hình việc giữ lại không đổi dữ liệu
- Nó nên được diễn ra một cách nhanh chóng bởi vì activity kế tiếp sẽkhông được resumed ngay cho đến khi nó trở lại
- Theo sau bởi onResume nếu activity trở về từ ở trước, hoặc bởi onStop
nếu nó trở nên visible với người dùng