Tải bản đầy đủ
CHƯƠNG 1: TÌM HIỂU VỀ ANDROID VÀ CÔNG NGHỆ LẬP TRÌNH ANDROID

CHƯƠNG 1: TÌM HIỂU VỀ ANDROID VÀ CÔNG NGHỆ LẬP TRÌNH ANDROID

Tải bản đầy đủ

doanh nghiệp gồm 83 thành viên tập trung phát triển các tiêu chuẩn cho thiết bị
di động.Các thành viên bao gồm: Google, HTC, Sony, Dell, Intel, Motorola,
Qualcomm, Texas Intruments, Samsung, LG, T-Mobile, Nvidia và Wind River
Systems.
Android được xây dựng dựa trên Linux kernel với middleware, libraries, các
API được viết bằng C và phần mềm chạy trên một application framework bao
gồm những thư viện tương thích với Java dựa trên Apache Harmony. Android sử
dụng DVM (Dalvik Virtual Machine) với phương pháp biên dịch just-in-time để
chạy code Java đã được biên dịch. Android có một cộng đồng những developer
viết ứng dụng, chủ yếu viết bằng Java. Hiện tại có hơn 250.000 ứng dụng
Android. Android Market là một kho ứng dựng online của Google, người dùng
có thể download ứng dụng trên đó.
1.2.

Kiến trúc Android
Kiến trúc Android gồm 4 phần chính, mô hình dưới đây sẽ cho ta cái nhìn

tổng quan về kiến trúc Android. Nhân của Android được phát triển dựa vào
Kernel Linux 2.6. Mỗi tầng trong kiến trúc Android hoạt động dựa vào tầng bên
dưới nó.

8

Hình 1.1: Kiến trúc Android
1.2.1. Tầng Application
Đây là lớp trên cùng của kiến trúc Android. Là các ứng dụng mà lập trình
viên phát triển như Browser, Media,…Android được tích hợp sẵn một số ứng
dụng cần thiết cơ bản như: contacts, browser, camera, Phone,…Tất cả các ứng
dụng đều sẽ được viết bằng ngôn ngữ Java.
1.2.2. Tầng Application framework
Bằng cách cung cấp một nền tảng phát triển mở, Android cung cấp cho
người phát triển khả năng xây dựng ứng dụng rất phong phú. Người phát triển có
toàn quyền sử dụng các thiết bị phần cứng hay ứng dụng chạy ở nền… để tạo ra
ứng dụng theo ý mình. Kiến trúc ứng dụng được thiết kế để đơn giản hóa việc sử
dụng lại các thành phần, mỗi ứng dụng có thể cho phép các ứng dụng khác khả
9

năng sử dụng các thành phần này. Điều này giống với kỹ thuật cho phép người
dùng đặt lại các thành phần.Google xây dựng cho các developer để phát triển các
ứng dụng của họ trên Android chỉ bằng cách gọi các API.
Dưới đây là các ứng dụng của hệ thống và dịch vụ:
• View UI - để xây dựng layout của ứng dụng bao gồm: list view, text
field, button, dialog, form grid, textbox, và thậm chí nhúng cả trình
duyệt web.
• Content Providers cho phép các ứng dụng truy xuất dữ liệu từ ứng
dụng khác, hay chia sẻ dữ liệu.
• Resource Managercung cấp truy cập tới tài nguyên không phải mã
nguồn như là các tập tin xâu, đồ họa, hay layout.
• Notification Manager: cho phép tất cả các ứng dụng hiển thị thông
báo của mình trên hệ điều hành.
• Activity Maanager được dùng để quản lý vòng đời của các ứng
dụng và điều hướng các activity.
1.2.3. Tầng Libraries và Runtime Android
1.2.3.1.

Libraries

Là các thư viện được viết bằng ngôn ngữ C/C++ sẽ được các developer
phát triển ứng dụng android thông qua tầng Android Framework. Có thể kể ra
đây một số thư viện quen thuộc với các lập trình viên như:
• Hệ thống thư viện C: là dẫn xuất của hệ thống thư viện C chuẩn
cho thiết bị nhúng trên nền Linux.


Media Libraries: mở rộng từ PacketVideo’s OpenCORE. Hỗ trợ
nhiều định dạng âm thanh ,video và hình ảnh phổ biến: MPEG4,
H.264, MP3, AAC, AMR, JPG, and PNG



Surface Manager: quản lý việc hiển thị và kết hợp đồ họa 2D và
3D.



LibWebCore: dùng webkit engine cho việc render trình duyệt mặc
định của HDH Android browser và cho dạng web nhúng (như
HTML nhúng)

10

1.2.3.2.



OpenGL|ES: thư viện đồ họa 2D và 3D



SQLite : quản lý database của ứng dụng



SGL (Scalable Graphics Library): xử lý đồ họa 2D của Android.



FreeType: thư viện font chữ ảnh nhị phân và véc tơ.

Runtime Android
• Gồm một tập hợp các thư viện Java Core.
• Máy ảo Dalvik thực thi các file định dạng .dex (Dalvik Excutable)
• Mỗi ứng dụng Android chạy trên tiến trình riêng của máy ảo Dalvik.
Dalvik được viết để chạy nhiều máy ảo cùng một lúc một cách hiệu
quả trên cùng một thiết bị.

1.2.4. Kernel Linux :
Android dựa trên Kernel Linux version 2.6 bởi nó cung cấp các trình điều
khiển các thiết bị phần cứng(driver), quản lý tiến trình, quản lý tài nguyên, bảo
mật,... như sau:
• Security system
• Memory management
• Process management
• Network stack
• Driver model.
1.3.

AVD và Emulator

Bộ Android SDK của Google đi kèm một bộ mô phỏng thiết bị di động ảo
(android emulator) chạy trên PC. Android emulator bắt trước tất cả đặc tính phần
cứng và phần mềm của một thiết bị thật, trừ việc không thể thực hiện cuộc gọi
thật. Nó cung cấp nhiều cách duyệt và các phím điều khiển, bạn có thể “chạm”
bằng cách dùng con chuột hoặc bàn phím. Nó cũng cung cấp màn hình hiển thị
ứng dụng, cùng với những ứng dụng khác chạy Android.

11

1.3.1. AVD (Android Virtual Device)
Để kiểm tra ứng dụng dễ dàng, emulator có một chỗ để thiết lập cấu hình gọi
là AVD. Những AVD giúp bạn thay đổi cấu hình phần cứng để có thể test trên
nhiều thiết bị khác nhau.
Emulator cũng đi kèm nhiều tiện ích để debug như console để log output của
ứng dụng ra ngoài, mô phỏng việc gửi SMS hoặc gọi điện thoại.
Android emulator là ứng dụng dựa trên QEMU, cung cấp một thiết bị di động
ảo ARM nơi mà bạn có thể chạy những ứng dụng Android. Bạn có thể chọn
phiên bản của hệ thống Android bằng cách thiết lập AVD, cũng có thể customize
skin và key mapping. Khi chạy emulator ở thời điểm thực thi, ta có thể dùng
những câu lệnh khác nhau để điều khiển hành vi của emulator.
Để sử dụng emulator, bạn phải tạo một hoặc nhiều thiết lập AVD. Trong
mỗi thiết lập, chỉ định một Android platform để chạy emulator và cài đặt những
tùy chọn phần cứng và emulator skin mà bạn muốn dùng. Khi chạy emulator, bạn
sẽ chọn AVD muốn load.
Mỗi AVD có bộ nhớ riêng của nó. Ví dụ như user data, SD card. Khi
chạy emulator với thiết lập AVD, nó tự động load user data và SD card từ thư
mục của AVD đó. Mặc định, emulator lưu user data, SD card và cache trong mỗi
thư mục AVD.
1.3.2. Android emulator và những hạn chế
Như đã đề cập ở trên, Android emulator chạy ARM opcode. Nó sử dụng
QEMU để mô phỏng thiết bị thật. Cách làm này giúp tối ưu sự đúng đắn và chính
xác giữa emulator và thiết bị thật. Cách chạy của emulator là chuyển đổi từ ARM
opcode thành Intel opcode. Cách duy nhất để tăng tốc cho emulator là tăng tốc
CPU chạy emulator. Vì lý do đó, một máy tính nhanh hơn bị chi phối bởi tốc độ
của single core hơn là số core mà nó có.
Để kiểm tra những ứng dụng đồ họa cao như games và những hiệu ứng
hình ảnh, cách tốt nhất là sử dụng thiết bị thật. Còn emulator sẽ giúp ích cho việc
kiểm tra trên nhiều thiết lập khác nhau bằng cách dùng các AVD.

12

1.4.

Cấu trúc một ứng dụng Android

Để có thể xây dựng các ứng dụng trên hệ điều hành Android thì trước tiên phải
tìm hiểu các giao diện lập trình ứng dụng API của hệ điều hành này. Các API cơ
bản của Android là:
• Activtity
• HTTP
• Intent


Service

• View
• Widget
1.4.1. Activity
Là thành phần quan trọng nhất của một ứng dụng. Hiểu đơn giản thì
Activity như là một môi trường được khởi tạo để người sử dụng tạo ra, hiển thị
các giao diện, thực hiện những công việc mà người sử dụng muốn làm.

13

Hình 1.2: Vòng đời của một Activity
Dựa vào lược đồ trên, thấy được có 3 vòng lặp quan trọng sau:
Vòng đời toàn diện (Entire Lifetime): Diễn ra từ lần gọi onCreate(Bundle)
đầu tiên và kéo dài tới lần gọi onDestroy() cuối cùng.
Vòng đời thấy được (Visible Lifetime): Diễn ra từ khi gọi onStart() và kéo
dài tới khi gọionStop(). Ở vòng đời này, activity được hiển thị trên màn hinh
nhưng có thế không tương tác với người dùng ở trên nền. Các phương thức
onStart(0 và onStop() có thể được gọi nhiều lần.
Vòng đời trên nền (Foreground Lifetime): Diễn ra từ khi gọi onResume(0
và kéo dài tới khi gọi onPause(). Ở vòng đời này, activity nằm trên mọi activity
khác và tương tác được với người dùng. 1 activity có thể liên tục thay đổi giữa 2
trạng thái paused và resumed, chẳng hạn khi thiết bị sleep hay 1 intent mới được
đưa tới.
Activity có một số phương thức chính :

14

- onCreate(): được gọi khi mà Activity được gọi lần đầu tiên. Đây là nơi để
thiết lập các giá trị tĩnh. Chạy sau nó luôn là onStart().
- onRestart(): được gọi sau khi Activity đã dừng lại và sau đó sẽ tiếp tục
được bắt đầu lại. Chạy sau nó luôn là onStart().
- onStart(): được gọi khi các Activity muốn hiển thị cho người dùng,
- onResume(): được gọi khi mà Activity bắt đầu tương tác với người dùng .
- onStop(): được gọi khi Activity không còn hiển thị cho người sử dụng khi
Activity khác đã được khởi động và chiếm chỗ của Activity này.
- onDestroy(): hàm cuối cùng bạn gọi khi muốn kết thúc Activity, gọi hàm
này khi Activity của bạn đã hoàn thành hoặc hệ thống tạm thời hủy Activity của
bạn có mục đích.
Các activity được quản lí dưới dạng các activity stack - First-In-Last-Out:
Khi một activity mới được khởi tạo, nó sẽ được đưa lên trên cùng stack, các
activity khác muốn chạy trên nền (foreground) trở lại thì cần phải chờ tới khi
Activity mới này kết thúc.
Một Activity có 4 trạng thái:
• Active hay Running: Khi một activity đang chạy trên màn hình.
• Paused: Khi một activity vẫn đang chạy trên màn hình nhưng đang bị
một activity trong suốt (transparent) hay không chiếm toàn màn hình
hiển thị phía trên. Tuy vẫn lưu trữ dữ liệu, nhưng các paused activity
này sẽ bị hệ thống bắt chấm dứt khi đang thiếu bộ nhớ trầm trọng.
• Stopped: Khi 1 activity bị che khuất hoàn toàn bởi 1 activity khác.
Tuy vẫn lưu trữ dữ liệu, nhưng các stopped activity này sẽ thường
xuyên bị hệ thống bắt chấm dứt để dành chỗ cho các tiến trình khác.
• Killed hay Shut down: Khi 1 activity đang paused hay stopped, hệ
thống sẽ xóa activity ấy ra khỏi bộ nhớ.

15

1.4.2. HTTP
Là các lớp, hàm hỗ trợ việc kết nối đến internet và tải các nội dung về máy
xử lý để lấy thông tin.Trong khóa luận này có sử dụng một số lớp để phục vụ
việc gửi yêu cầu và nhận dữ liệu trả về từ Servlet.
HttpEntity: được dẫn xuất từ lớp org.apache.http.HttpEntity, là một đối
tượng được gửi đi kèm cùng với các thông điệp HTTP, nó có thể được tìm thấy
trong các thông điệp gửi yêu cầu (request) hoặc các thông điệp trả về (response).
HttpResponse: được dẫn xuất từ lớp org.apache.http.HttpResponse, là đối
tượng trả về của HTTP.
HttpClient: được dẫn xuất từ lớp org.apache.http.client.HttpClient, là một
giao diện cho một người dùng HTTP. HttpClient đóng gói tất cả các đối tượng
cần thiết để thực hiện các yêu cầu HTTP.
HttpPost: được dẫn xuất từ lớp org.apache.http.client.methods.HttpPost,
đây là phương thức chính để gửi các yêu cầu đến Server và nhận lại các luồng dữ
liệu về từ Servlet.
1.4.3. Intent
Là dẫn xuất từ lớp: android.content.Intent;
Nó như là một nền tảng để truyền tải các thông báo từ nơi muốn gửi đến nơi
nhận, là mối liên lạc giữa các Activity cần truyền thông lẫn nhau. Các Intent
được tạo ra có hai phần mang thông tin chính là:
- Hành động (action): các hành động nói chung sẽ được thực hiện.
- Dữ liệu (data): các dữ liệu để thực hiện hành động.
Ngoài ra Intent còn một số thuộc tính phụ quan trọng như:
- Thể loại (category): cho phép thêm thông tin vào các hành động để thực
thi.
- Loại (type): chỉ định một kiểu rõ ràng của dữ liệu Intent.
- Thành phần: chỉ định rõ ràng tên của một lớp thành phần để sử dụng
Intent.
- Bổ sung (extras): đây là một Bundle của các thông tin bổ sung. Nó được
sử dụng để cung cấp các thông tin mở rộng cho các thành phần.

16

Các giải pháp sử dụng Intent:
- Intent rõ ràng (Explicit Intent): đã chỉ định các thành phần (bằng các
phương thức như setComponent() hoặc setClass()), nó cung cấp chính xác đến
các lớp cần dữ liệu Intent mang đến để xử lý.
- Intent ẩn (Implicit Intent): không chỉ định rõ thành phần nào sẽ chạy dữ
liệu mang theo của Intent, tuy nhiên nó bao gồm đầy đủ thông tin cho hệ thống
để xác định thành phần đang sẵn sang nào tốt nhất sẽ chạy Intent đó.
Ví dụ: trong đồ án này có sử dụng một Intent để gửi thông tin giữa hai
Activity. Activity thứ nhất sẽ kết thúc, gọi Activity thứ hai khởi động, đồng thời
truyền dữ liệu bổ sung theo để Activity thứ hai xử lý.
1.4.4. Service
Một service là một thành phần của ứng dụng, thể hiện mong muốn ứng dụng
thực hiện các hành động trong khi không tương tác với người dùng hoặc cung
cấp chức năng cho các ứng dụng khác sử dụng. Nói một cách đơn giản, service là
các tác vụ (task) chạy ngầm dưới hệ thống nhằm thực hiện một nhiệm vụ nào đó.
Mỗi class Service phải chứa thẻ được khai báo trong file
AndroidManifext.xml. Services có thể được bắt đầu bởi Context.startService()
và Context.bindservice()
Cũng như các đối tượng của ứng dụng khác, services chạy trên luồng
(Thread) của tiến trình chính. Có nghĩa là nếu service của bạn dự định chạy các
hành vi có cường độ lớn hoặc các hành vi có thể gây nghẽn mạch, nó sẽ tự sinh
ra luồng (Thread) của chính nó để làm thực hiện các tác vụ được đặc tả trong
Service.
Service không phải là một tiến trình độc lập. Đối tượng Service không chạy
trên tiến trình (process) của riêng nó (trừ khi có một yêu cầu đặt biệt), Service
chạy trên tiến trình của chương trình.
Service không phải là một luồng (thread).
Service có chứa 2 đặc trưng cơ bản sau:
Là một chức năng để ứng dụng thông báo với hệ thống về việc mà nó muốn
thực hiện ở phía dưới nền (ngay cả khi người dùng không tương tác trực tiếp tới

17

ứng dụng).Điều này tương ứng với việc gọi phương thức Context.startservice(),
nó sẽ yêu cầu hệ thống lên lịch cho service để chạy cho đến khi bị chính service
hay người nào đó dừng nó lại.
Là một chức năng cho phép ứng dụng để cung cấp các chức năng của nó cho
các ứng dụng khác. Điều đó tương ứng với việc gọi Context.bindService(), cho
phép một long-standing connection được tạo ra để service có thể tương tác với
nó.
Khi một Service được tạo ra, việc hệ thống cần làm là tạo ra thành phần và
gọi hàm onCreate() và bất kỳ lệnh callback thích hợp nào trên luồng chình. Nó
phụ thuộc vào Service thi hành hành vi thích hợp nào, chẳng hạn tạo luồng thứ
hai để thực hiện tiến trình.
Vòng đời của 1 Service
Có 2 lý do để một service được chạy bởi hệ thống. Bằng cách gọi phương
thức Context.startService() và Context.bindService().Nếu người dùng gọi
phương thức Context.startService() thì hệ thống sẽ nhận về một đối tượng service
(tạo mới nó và gọi hàm onCreate() nếu cần thiết) và sau đó lại gọi phương thức
onStartCommand(Intent, int ,int) với các biến được cung cấp bởi client. Service
mới được tạo ra này sẽ chạy cho tới khi có lệnh gọi phương thức
Context.stopService() hoặc stopSelf(). Dù cho một service có được start bao
nhiêu lần đi nữa thì nó sẽ bị tắt ngay khi phương thức Context.stopService() hoặc
phương thức stopSelf() được gọi. Service có thể dùng phương thức stopSelf(int)
để đảm bảo rằng service sẽ không được tắt cho đến khi Intent đã khởi tạo nó
được xử lý.

18