Tải bản đầy đủ (.docx) (137 trang)

lập trình 3d ứng dụng trên nền tảng android

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.22 MB, 137 trang )


XÂY DỰNG
ỨNG DỤNG 3D
VỚI ANDROID

MỤC LỤC
DANH MỤC HÌNH
Mở đầu

Hiện nay ngành công nghiệp phần mềm đang rất phát triển và ngành công nghiệp
phần mềm trên điện thoại di động cũng không nằm ngoài xu thế đó. Tuy còn nhiều hạn
chế trong phần cứng của điện thoại di động nhưng nó đã thể hiện được sức mạnh của
mình trong rất nhiều các lĩnh vực khác nhau như giải trí, các tiện ích, thanh toán điện
tử v.v… Ngành công nghệ phần mềm di động vẫn còn khá non trẻ ở Việt Nam vì vậy
việc nghiên cứu và phát triển các ứng dụng trên di động là rất cần thiết.
Các hệ điều hành như Window Mobile, Symbian… phần nào cũng gây ít nhiều
khó khăn cho những ai có ý định xây dựng các ứng dụng trên nó. Đối với Window
Mobile là một công nghệ của Microsoft và hoàn toàn đóng đối với người dùng, nhà
phát triển ứng dụng chỉ dựa hoàn toàn vào công nghệ mà Microsoft cung cấp, còn
Symbian thì việc cấu hình để có thể lập trình trên nó cũng vô vàn khó khăn, đặc biệt là
nó sử dụng ngôn ngữ C/C++ để làm nền tảng lập trình rõ ràng là không thuận tiện
trong việc phát triển ứng dụng.
Xuất phát từ nhu cầu thực tế đó, Google đã mạnh dạn nghiên cứu và đưa ra một
nền tảng hệ điều hành mới, đó chính là Android. Một nền tảng hệ điều hành mã nguồn
mở hoàn toàn và dựa vào một ngôn ngữ lập trình rất mạnh là Java để phát triển ứng
dụng. Chính vì Android hỗ trợ Java ngay từ trong nền tảng của nó, nên việc viết ứng
dụng, ngay cả sử dụng các chức năng của phần cứng là hoàn toàn dễ dàng thông qua
việc sử dụng bộ công cụ hỗ trợ lập trình được cung cấp hoàn toàn miễn phí, là Android
SDK.
Nhóm thực hiện nhận thấy nhu cầu của con người trong lĩnh vực giải trí trên di
động ngày càng cao và Android chính là nền tảng ứng dụng có thể phát triển trong


tương lai. Chính vì vậy nhóm thực hiện chọn đề tài “Xây dựng ứng dụng 3D với
Android” nhằm hiểu rõ về các kĩ thuật lập trình trên thiết bị động, đặc biệt là các kĩ
thuật xây dựng đồ họa 3D trên di động để có thể tạo nên một game 3D hoàn chỉnh.

Nhưng vì thời gian, cũng như năng lực của nhóm có hạn, cho nên chỉ giới hạn ở
việc tìm hiểu cách thức hoạt động, nghiên cứu cơ bản các chức năng, sử dụng bộ công
cụ Android SDK và một số hàm chức năng của OpenGL ES để vẽ một số hình ảnh 3D
cơ bản mục đích nghiệm thu quá trình tìm hiểu.
Đề tài bao gồm:
Phần A: Xây dựng ứng dụng 3D với Android
Chương 1: Tổng quan về ứng dụng trên Android
Chương 2: Các thành phần cơ bản của một ứng dụng trên Android
Chương 3: Thiết kế giao diện
Chương 4: Xử lý bất đồng bộ
Chương 5: Áp dụng OpenGL ES để tạo ứng dụng 3D trên Androi
Phần B: Chương trình Demo
Chương 6: Demo kỹ thuật vẽ hình 3D trên Android
Phần C: Kết luận
Tài liệu tham khảo
PHẦN A: XÂY DỰNG ỨNG DỤNG 3D VỚI ANDROID
Chương 1: Tổng quan về ứng dụng trên android

1.1 Lược sử về Android:
Android được phát hành phiên bản đầu tiên 11/11/2007, là một môi trường hệ
điều hành hoàn chỉnh dựa trên hệ điều hành nhân Linux V2.6. Lúc đầu, đích triển khai
đối với Android là lĩnh vực điện thoại di động, gồm các loại điện thoại thông minh và
các loại thiết bị điện thoại kiểu gập chi phí thấp. Tuy nhiên, phạm vi đầy đủ các dịch
vụ điện toán của Android và sự hỗ trợ chức năng phong phú của nó có tiềm năng mở
rộng ra ngoài thị trường điện thoại di động. Android còn có thể hữu ích đối với các nền
tảng và ứng dụng khác.

Nền Android là sản phẩm của Open Handset Alliance (Liên minh thiết bị cầm
tay mở), một tập đoàn các tổ chức cùng hợp tác với nhau để xây dựng nên một loại
điện thoại di động tốt hơn. Tập đoàn do Google đứng đầu này gồm các nhà vận hành
(điện thoại) di động, các nhà sản xuất thiết bị cầm tay, sản xuất linh kiện, các nhà cung
cấp nền và giải pháp phần mềm và các công ty tiếp thị. Từ một quan điểm phát triển
phần mềm, Android trở thành trung tâm của thế giới mã nguồn mở và rất có tiềm năng
phát triển.
Thiết bị cầm tay có khả năng Android đầu tiên trên thị trường là thiết bị G1 do
HTC sản xuất và được bán trên T-Mobile. Nó trở nên sẵn có sau gần một năm đồn đại,
khi mà các công cụ phát triển phần mềm sẵn có duy nhất chỉ là một số bản phát hành
Bộ công cụ phát triển phần mềm (SDK) được cải tiến dần từng bước. Khi ngày phát
hành G1 gần đến, nhóm Android đã phát hành SDK V1.0 và các ứng dụng bắt đầu
vượt lên nhằm hướng tới nền tảng mới này.
Để kích thích đổi mới và phát triển các ứng dụng của Android, Google đã tài trợ
hai vòng cuộc thi “Các thách thức nhà phát triển Android”, và hàng triệu đô la đã được
đổ vào các ứng dụng dự thi hàng đầu. Vài tháng sau G1, Android Market được phát
hành, cho phép người sử dụng duyệt và tải về các ứng dụng trực tiếp vào điện thoại của
họ. Trong vòng 18 tháng, một nền di động mới đã chính thức có mặt trên thị trường và
sẽ là đối thủ cạnh tranh nặng ký của các nền di động phổ biến trước đó như Symbian
hay Window Mobile.

Android cung cấp khá đầy đủ các công cụ cơ bản và được thiết kế sao cho các
nhà phát triển có thể tận dụng tối đa lợi thế của thiết bị cầm tay để xây dựng nên các
ứng dụng thực sự thuyết phục. Họ có thể tạo một ứng dụng có thể gọi thực hiện các
chức năng lõi trong điện thoại như thực hiện cuộc gọi, gửi tin nhắn SMS, dùng camera
… hay chia sẻ thông tin cá nhân lên trang web chẳn hạn như thông tin liên lạc, vị trí
địa lí, lịch biểu… Các nhà phát triển còn có thể làm bất cứ việc gì trên thiết bị Android
bởi vì hệ thống Android giao tiếp thông qua các Intents – nó đơn giản là một chuỗi mô
tả một hành động nào đó – ví dụ: “android.provider.Telephony.SMS_RECEIVED”.
Android còn cung cấp sẵn các dịch vụ định vị (và đây là một thế mạnh của Google)

cùng với một tập các ứng dụng về “Map” với các tính năng rất ấn tượng như dò đường,
tính khoảng cách địa điểm, tìm bạn … Ngoài ra còn có một số tính năng nổi bật
khác như Animation và đồng thời cũng hỗ trợ media-playback.
Android đã dần hoàn thiện qua các phiên bản, mà phiên bản mới nhất hiện nay
là Android 3.1.
1.2 Nền tảng Android:
Với khả năng rộng rãi của Android, sẽ rất dễ dàng nhầm lẫn nó với một hệ điều
hành máy tính để bàn. Android là một môi trường phân tầng, xây dựng trên nền của hệ
điều hành nhân Linux, và nó bao hàm nhiều chức năng phong phú. Hệ thống giao diện
người sử dụng gồm có:
 Cửa sổ
 Khung hình
 Các tiểu trình để hiển thị các phần tử phổ biến như các hộp biên soạn,
danh sách, danh sách thả xuống.
Android gồm một trình duyệt có thể nhúng vào được, được xây dựng dựa trên
WebKit, chính là máy (engine) trình duyệt mã nguồn mở cũng đang là động cơ của
trình duyệt Safari của iPhone.

Android khoe ra một mảng dồi dào nhiều tùy chọn kết nối, gồm WiFi, Bluetooth
và dữ liệu không dây qua một kết nối di động (như GPRS, EDGE và 3G). Một kỹ thuật
phổ biến trong các ứng dụng Android là liên kết tới Google Maps để hiển thị một địa
chỉ trực tiếp trong một ứng dụng. Việc hỗ trợ cho các dịch vụ dựa trên địa điểm (chẳng
hạn như GPS) và các dụng cụ đo gia tốc cũng có sẵn trong gói phần mềm Android,
mặc dù không phải tất cả các thiết bị Android được trang bị với các phần cứng cần
thiết. Ngoài ra còn có cả hỗ trợ máy ảnh nữa (camera).
Về mặt lịch sử, có hai lĩnh vực mà các ứng dụng di động đã gắng sức theo kịp
các đối tác máy tính để bàn là đồ họa/đa phương tiện và phương thức lưu trữ dữ liệu.
Android giải quyết thách thức về đồ họa bằng sự hỗ trợ dựng sẵn cho đồ họa 2D và 3D,
gồm cả thư viện OpenGL. Gánh nặng lưu trữ dữ liệu được giảm nhẹ vì nền Android có
gồm cả cơ sở dữ liệu SQLite mã nguồn mở phổ biến. Hình 1 cho thấy một khung hình

đơn giản hóa về các tầng phần mềm Android.

Hình 1 – Cấu trúc Android
1.3 Kiến trúc ứng dụng Android:
1.3.1Máy ảo Dalvik:
Các ứng dụng Android được viết bằng ngôn ngữ lập trình Java và chúng chạy
trong một máy ảo (VM). Điều quan trọng phải lưu ý rằng VM không phải là một máy
ảo Java mà là máy ảo Dalvik (Dalvik Virtual Machine), một công nghệ mã nguồn mở.
Chiếc máy ảo này dựa trên việc đăng kí (register-based) và được thiết kế bởi Dan
Bornstein và một vài kĩ sư của Google. Thuật ngữ “register-based” đã nói lên sự khác
biệt giữa máy ảo Android với máy ảo JAVA thông thường. Tương tự như máy ảo
JAVA, đây cũng chỉ là một máy ảo thông dịch, nhưng thông dịch các file có định
dạng .dex (Dalvik Execute) – một định dạng giúp tối ưu bộ nhớ và khả năng lưu trữ
của máy ảo – Các máy ảo JAVA ngày nay chủ yếu dựa trên ngăn xếp (Stack-based),

với tính chất này cho phép rút ngắn thời gian thực thi chương trình. Mỗi ứng dụng
Android chạy trong một cá thể của máy ảo Dalvik, khi đến lượt, cá thể máy ảo này
nằm trong một tiến trình do nhân Linux quản lý, như trình bày dưới đây.
Hình 2 – Máy ảo Dalvik
1.3.2 Các thành phần của một ứng dụng Android:
Một ứng dụng Android gồm 4 thành phần chính sau:
 Hoạt động (Activity): một ứng dụng có một giao diện người dùng nhìn
thấy được, sẽ được thực hiện bằng một Activity. Activity dùng Views để
tạo nên giao diện đồ họa người dùng, để hiển thị thông tin và đáp lại các
hành động của người dùng. Khi người dùng chọn một ứng dụng từ màn
hình chủ hoặc trình khởi chạy ứng dụng thì một Activity được khởi động.
Activity trong Android cũng tương tự như một Form trong các ứng dụng
desktop truyền thống.
 Dịch vụ (Services): các service làm việc ẩn dưới ứng dụng, được sử dụng
để thực hiện các xử lý thông thường khi cần và thậm chí ngay cả lúc các

Activity không hoạt động hoặc ẩn đi.Một dịch vụ nên được sử dụng đối
10
với bất kì ứng dụng nào cần tồn tại trong một thời gian dài, chẳng hạn
như một trình giám sát mạng hoặc ứng dụng kiểm tra cập nhật.
 Trình cung cấp nội dung (Content Providers): có thể coi như là một máy
chủ cơ sở dữ liệu. Công việc của nó là quản lý truy cập và chia sẻ dữ liệu
đang tồn tại, chẳng hạn như một cơ sở dữ liệu SQLite. Nó có thể được
cấu hình để cho phép các ứng dụng khác truy xuất và ngược lại. Nếu ứng
dụng rất đơn giản thì không nhất thiết phải tạo ra một trình cung cấp nội
dung.
 Trình thu phát (Broadcast Receivers): bằng cách tạo và đăng ký một
Broadcast Receiver, ứng dụng Android có thể lắng nghe toàn bộ các
Intent theo một chuẩn cụ thể được chỉ định. Các Broadcast Receiver sẽ
chạy ứng dụng một cách tự động để đáp ứng một Intent gửi đến, hay xử
lý một phần tử dữ liệu hoặc đáp ứng một sự kiện, chẳng hạn như nhận
một văn bản thông báo.
Việc tách rời sự phụ thuộc giữa các thành phần trong ứng dụng giúp việc chia sẽ
cũng như trao đổi giữa các ứng dụng khác trở nên dễ dàng hơn.
1.4 Vòng đời của ứng dụng Android:
Không giống như các ứng dụng trên các nền tảng khác, các ứng dụng Android
không có một điều khiển đến vòng đời của chúng. Thay vào đó, các thành phần ứng
dụng phải lắng nghe việc thay đổi trạng thái bên trong của ứng dụng đó và tác động
trở lại một cách hợp lý. Mỗi một ứng dụng Android ở trong chính tiến trình của nó,
chạy một thể hiện riêng biệt của Dalvik. Việc quản lý bộ nhớ và tiến trình của mỗi ứng
dụng Android được điều khiển một cách riêng trong lúc runtime.
Android quản lý tài nguyên một cách chặt chẽ, nó sẽ làm bất cứ việc gì để đảm
bảo cho thiết bị duy trì đáp ứng. Điều này có nghĩa là các tiến trình sẽ bị hủy đi mà
không có một cảnh báo nào nếu cần giải phóng tài nguyên cho các ứng dụng có độ ưu
tiên cao.
11

1.5 Các công cụ để tạo một ứng dụng Android:
Để bắt đầu phát triển các ứng dụng Android, chúng ta cần có Bộ công cụ phát
triển phần mềm Android (SDK) và môi trường phát triền tích hợp Eclipse (Eclipse
IDE). Việc phát triển Android có thể diễn ra trên Microsoft Window, Mac OS X hoặc
Linux. Trong tiểu luận này, nhóm thực hiện sẽ phát triển ứng dụng Android bằng
Microsoft Window.
1.5.1 Eclipse IDE:
Các ứng dụng Android được viết bằng ngôn ngữ Java, nhưng biên dịch và thi
hành bằng máy ảo Dalvik. Viết mã bằng ngôn ngữ Java trong Eclipse là rất trực quan.
Eclipse cung cấp một môi trường Java phong phú, gồm cả việc trợ giúp theo ngữ cảnh
và các mách nước gợi ý về mã. Khi bộ mã Java được biên dịch thành công, Android
Developer Tools sẽ đảm bảo rằng ứng dụng đó được đóng gói một cách đúng đắn, gồm
cả tập tin AndroidManifest.xml.
1.5.2 Android SDK:
Bộ công cụ phát triển ứng dụng Android SDK là công cụ giả lập thiết bị ảo trên
máy tính để phát triển ứng dụng với các hàm API hỗ trợ cho những lập trình viên lập
trình trên các thiết bị di động sử dụng nền tảng Android thông qua ngôn ngữ lập trình
Java. SDK gồm có:
 android.jar : tập tin lưu trữ Java chứa toàn bộ các lớp SDK Android cần
thiết để xây dựng ứng dụng.
 documention.html và thư mục docs: tài liệu SDK được cung cấp tại chỗ
và trên web, chủ yếu nó ở dạng JavaDocs, tạo điều kiện dễ dàng cho việc
hướng dẫn trong nhiều gói SDK. Tài liệu cũng gồm cả hướng dẫn phát
triển mức cao và các liên kết đến cộng đồng Android rộng rãi.
 Thư mục sample (các ví dụ mẫu): thư mục con samples chứa bộ mã nguồn
đầy đủ dùng cho một loạt các ứng dụng, gồm cả ApiDemo, nó sử dụng
12
nhiều API. Ứng dụng mẫu là một nơi khám phá tuyệt vời khi bắt đầu phát
triển ứng dụng Android.
 Thư mục tools (các công cụ): chứa toàn bộ các công cụ dòng lệnh để xây

dựng nên các ứng dụng Android. Công cụ được dùng phổ biến và hữu ích
nhất là tiện ích adb (Android Debug Bridge).
 Usb_driver: thư mục chứa các trình điều khiển cần thiết để kết nối môi
trường phát triển với một thiết bị có khả năng chạy Android, chẳng hạn
như G1 hay điện thoại đã được phát triển Android Dev 1. Các tập tin này là
đòi hỏi duy nhất đối với các nhà phát triển đang sử dụng nền Windows.
1.5.3 Cài đặt công cụ:
Chuẩn bị:
o Phần mềm Eclipse IDE (phiên bản 3.2 trở lên), có thể tải trực tiếp
từ trang web />
o Bộ công cụ Android SDK phiên bản mới nhất, tại thời điềm thực
hiện tiểu luận này là phiên bản r11, có thể tải từ trang web
/>Bắt đầu việc cài đặt:
o Giải nén chương trình Eclipse vào một thư mục nào đó (ví dụ:
D:\eclipse\)
o Giải nén bộ Android SDK vào một thư mục bất kỳ (ví dụ:
D:\Android_SDK_r11\)
o Chạy chương trình Eclipse.
o Vào menu Help – Software Updates …
o Chọn tab Available Software
o Chọn Add Site, nhập vào đường dẫn sau:

o Chọn OK.
o Chờ cho chương trình được cài đặt.
13
o Sau khi cài xong, tiếp tục vào menu Window – Preferences
o Chọn tab Android, chỉ đường dẫn đến thư mục đã giải nén
Android SDK ở trên (ở đây là D:\Android_SDK_r11\).
o Hoàn tất.
Lưu ý : Cách cài đặt ở trên đòi hỏi máy tính phải được nối mạng Internet.

1.6 Thiết bị Android ảo (Android Virtual Device - AVD):
Các ứng dụng Android có thể được chạy trên một thiết bị thật sự hoặc trên trình
mô phỏng Android (Android Emulator) kèm với SDK Android.
Từ phiên bản SDK 1.5, Google đã giới thiệu khái niệm về thiết bị Android ảo.
Một thiết bị Android ảo chỉ đơn giản là một tập các thuộc tính cấu hình được áp dụng
cho hình ảnh của một thiết bị mô phỏng để hiển thị ứng dụng lên nó.
Cách tạo một thiết bị Android ảo như sau:
- Trong Eclipse à window à Android SDK and AVD manager.
- Ở cửa sổ mới hiện ra, chọn mục Virtual devices à bấm nút New, hiện ra một
cửa sổ mới như hình sau đây:
14
Hình 3– Tạo một AVD
- Mục Name: đặt tên cho thiết bị, tên gì cũng được, cốt là dễ nhớ và để phân
biệt, không chứa khoản trắng và các ký tự đặc biệt.
- Mục Target: chọn phiên bản hệ điều hành Android.
- Mục SD Card: điền kích thước bộ nhớ của thiết bị hoặc lấy một file SD Card
có sẵn.
- Nhấn nút Create AVD.
15
Hình 4 – Trình mô phỏng thiết bị Android.
1.7 Android project:
1.7.1 Tạo một Android project mới:
- Trong Eclipse, chọn File à New à Android Project.
- Một cửa sổ mới hiện ra, điền các thông tin tương ứng vào cửa sổ.
- Project name: tên project.
- Chọn phiên bản Android.
- Application name: tên ứng dụng.
- Package name: tên gói.
16
- Create activity: tên hoạt động.

- Min SDK Version: API Level tương ứng với phiên bản Android.
- Nhấn nút Finish.
Hình 5 – Tạo một Android project
1.7.2 Cấu trúc một project:
Một Android project gồm các thư mục sau:
17
• Thư mục src chứa source code ứng dụng. Gồm các package và các class.
• Thư mục gen chứa các file tự động phát sinh (mà thường gặp nhất là
R.class).
• Thư mục res để chứa các resource dùng trong ứng dụng (thông qua ID).
• Thư mục assets chứa các resource file mà ứng dụng cần dùng (dưới dạng
file).
• File Manifest là file khai báo thông tin về ứng với hệ thống (như ứng
dụng gồm những màn hình nào, có service nào… xin các quyền gì, phiên
bản bao nhiêu, dùng từ SDK phiên bản nào…).
• File thư viện.
Chương 2: Các thành phần cơ bản của một ứng dụng trên Android
18
2.1 Hoạt động(Activity):
Mỗi một Activity đại diện cho một màn hình. Các ứng dụng phức tạp có thể có
nhiều hơn một Activity. Cần tạo một Activity cho mỗi màn hình cần hiển thị. Cụ thể là
ít nhất một màn hình chính điều khiển các chức năng của ứng dụng, các activity khác
nhằm mục đích nhập thông tin, cung cấp các khung nhìn khác nhau trên dữ liệu hoặc
hỗ trợ các chức năng khác.
Hầu hết các Activity được thiết kế để chiếm giữ toàn bộ màn hình, tuy nhiên có
thể tạo các Activity có một nữa độ trong suốt, các Activity nổi, hoặc các dialog.
2.1.1 Tạo một Activity:
Để tạo một Activity mới, cần thừa kế từ lớp Activity, sử dụng các View để cung
cấp các tương tác với người dùng, khai báo các thành phần giao diện và thực thi các
chức năng của ứng dụng.

package com.paad.myapplication;
import android.app.Activity;
import android.os.Bundle;
public class MyActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
}
}
Một lớp Activity cơ bản đưa ra một màn hình rỗng chứa cửa sổ hiển thị. Vì vậy
việc cần thực hiện đầu tiên là khai báo bố cục cho nó bằng cách sử dụng các View và
19
layout. Activity UI được tạo thành bởi các View. View là các điều khiển giao diện
người dùng, hiển thị dữ liệu và cung cấp tương tác đến người dùng.
Để gắn một giao diện cho một Activity, sử dụng phương thức setContentView
trong lớp Activity được kế thừa.
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
MyView myView = new MyView(this);
setContentView(myView);
}
Có 2 cách để thiết lập giao diện cho Activity: bằng code hoặc thông qua file định
nghĩa layout . Ở trên là cách tạo giao diện bằng code, sau đây là cách tạo giao diện
người thông qua layout, truyền tham số vào cho phương thức setContentView là một
resource ID
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);

setContentView(R.layout.main);
}
Để dùng một Activity cần khai báo bên trong file manifest. Thêm vào một thẻ
activity mới bên trong nút application. Thẻ activity này bao gồm các thuộc tính cho
siêu dữ liệu (label, icon,…). Một Activity mà không được khai báo một thẻ activity
tương ứng sẽ không được khởi chạy.
Ví dụ sau mô tả cách làm thế nào để khai báo Activity đã được tạo ở phần trên:
<activity android:label=”@string/app_name”
20
android:name=”.MyActivity”>
<intent-filter>
<action android:name=”android.intent.action.MAIN” />
<category android:name=”android.intent.category.LAUNCHER” />
</intent-filter>
</activity>
2.1.2 Vòng đời của Activity:
Hình 6 – Vòng đời của Activity
2.1.3 Khởi động một Activity:
Để khởi động một Activity, chúng ta dùng Intent:
o Khai báo tường minh: cung cấp chính xác thông tin của activity cần gọi
(nếu cùng ứng dụng chỉ cần cung cấp tên class, nếu ứng dụng khác nhau
21
thì cung cấp tên package, tên class). Ví dụ: đoạn code bên dưới sẽ khởi
động activity tên là TargetActivity.
Intent intent = new Intent(getApplicationContext(),TargetActivity.class);
startActivity(intent);
o Khai báo không tường minh: cung cấp thao tác cần làm gì, với loại dữ
liệu nào, thao tác thuộc nhóm nào… hệ thống sẽ tìm activity tương ứng
để khởi động. Ví dụ: đoạn code bên dưới sẽ khởi động một activity nào
đó đăng có khả năng xem ảnh.

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(MediaStore.Images.Media.EXTERNAL_CONTENT_URI)
;
startActivity(intent);
Với cách khởi động activity không tường minh, chúng ta cần phải biết một chút
về Intent-filter. Intent-filter sẽ giúp một activity đăng ký với hệ thống mình có thể làm
được thao tác gì, trong nhóm nào, với loại dữ liệu nào. Như vậy khi intent và intent-
filter khớp nhau, activity sẽ được hệ thống khởi động.
2.1.4 Liên lạc giữa 2 activity:
Có thể khởi động một activity với một yêu cầu nào đó và activity kia khi làm
xong công việc sẽ trả lại kết quả cho activity trước. Ví dụ activity A yêu cầu một
activity làm giúp việc chụp ảnh, activity B đáp ứng được việc này, sau khi user chụp
ảnh xong sẽ trả lại file ảnh cho activity A. Để liên lạc 2 activity chúng ta làm nhu sau:
– Khi khởi động một activity, ta có thể gửi kèm dữ liệu trong intent như ví
dụ sau:
intent.putExtra("value1", new String("Hello"));
intent.putExtra(“value2", new Long(100));
– Bên phía activity được khởi động, có thể lấy dữ liệu được gửi như sau:
getIntent().getExtras().getString("value1");
getIntent().getExtras().getLong("value2");
22
2.2 Trình thu phát (BroadcastReceiver):
BroadcastReceiver là một trong bốn loại thành phần trong ứng dụng Android.
Chức năng của nó là dùng để nhận các sự kiện mà các ứng dụng hoặc hệ thống phát đi.
Có 2 cách phát-nhận đó là:
 Không có thứ tự: receiver nào đủ điều kiện thì nhận hết, không phân
biệt và chúng tách rời nhau.
 Có thứ tự: receiver nào đăng ký ưu tiên hơn thì nhận trước, và có thể
truyền thêm thông tin xử lý cho các receiver sau.
2.2.1 Chu kỳ sống:

BroadcastReceiver chỉ có duy nhất một phương thức onReceive().
– Khi có sự kiện mà BroadcastReceiver đã đăng ký nhận được phát đi, thì
phương thức onReceive() của BroadcastReceiver đó sẽ được gọi.
– Sau khi thực thi xong phương thức này, vòng đời của BroadcastReceiver
kết thúc.
 Lưu ý khi sử dụng: Ngay khi onReceive() kết thúc, hệ thống coi như receiver đã
không còn hoạt động và có thể giải phóng tiến trình chứa receiver này bất cứ lúc
nào.
àTránh xử lý các code quá lâu trong onReceive().
à Không có xử lý bất đồng bộ, chờ callback… trong Receiver (cụ thể như
hiển thị Dialog, kết nối service…)
2.2.2 Một số broadcast thông dụng:
o Báo hệ thống khởi động xong.
o Báo pin có sự thay đổi.
o Báo có package mới cài vào hoặc xóa đi.
o Báo tắt máy.
o Báo cắm sạc, rút sạc.
23
o Thông báo tin nhắn tới.
o Thông báo cắm, rút thẻ nhớ.
o Thông báo có cuộc gọi đi.
o Broadcast do người phát triển ứng dụng tự định nghĩa (giúp liên lạc hoặc
thông báo một sự kiện giữa các ứng dụng).
2.2.3 Hàm onReceive():
Phương thức này được gọi khi có sự kiện tương ứng được phát đi. Ở trong
phương thức này, ta truyền vào context (ngữ cảnh) và intent (nơi nhận).
o context: vì lớp Receiver không kế thừa từ lớp Context nên cần truyền
context mà receiver này đang chạy vào. Thứ nhất là để có thể xử lý các
phương thức yêu cầu truyền thêm Context, thứ hai là để sử dụng các
phương thức của lớp Context.

o intent: intent được truyền vào sẽ có đầy đủ thông tin như sự kiện nào mà
receiver này đăng ký đã xảy ra dẫn đến onReceive() được gọi, có gửi
kèm thông tin gì hoặc dữ liệu gì hay không. Xem các api:
Intent.getAction();
Intent.get…Extra(String dataName);
2.3 Dịch vụ (Service):
Service là một trong 4 loại thành phần của một ứng dụng Android. Service chạy
nền và không tương tác trực tiếp với người dùng. Sử dụng Service để:
 Dùng trong các ứng dụng nghe nhạc.
 Dùng để xử lý các thao tác mất thời gian và không nhất thiết phải hiển thị
lên activity (download, upload…).
 Đôi khi cần một ứng dụng vận hành liên tục để xử lý những việc mong
muốn mà không làm phiền người dùng.
 Làm những thao tác tính toán, xử lý đều đặn nào đó và kết quả khi nào
người dùng cần thì mới xem.
2.3.1 Tạo ra một Service:
Để tạo ra một Service, ta tạo ra một class mới kế thừa lớp Service và override
các phương thức onStart(),onCreate() và onBind().
24
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
public class MyService extends Service {
@Override
public void onStart(Intent intent, int startId) {
// TODO: Actions to perform when service is started.
}
@Override
public void onCreate() {
// TODO: Actions to perform when service is created.

}
@Override
public IBinder onBind(Intent intent) {
// TODO: Replace with service binding implementation.
return null;
}
}
Để bắt đầu một Service, sử dụng phương thức startService. Nếu Service yêu cầu
quyền truy cập không tồn tại trong ứng dụng thì một ngoại lệ SecurityException sẽ
được đưa ra. Có 2 cách để bắt đầu một Service mới.
+ Cách 1: khởi động ngầm. Ví dụ:
startService(new Intent(MyService.MY_ACTION));
25
+ Cách 2: khởi động tường minh. Ví dụ:
startService(new Intent(this, MyService.class));
Để dừng một Serivce, sử dùng phương thức stopService, truyền vào Intent xác
định Service cần ngưng hoạt động. Ví dụ:
ComponentName service = startService(new Intent(this, BaseballWatch.class));
// ngừng dịch vụ bằng cách xác định tên dịch vụ
stopService(new Intent(this, service.getClass()));
// ngừng dịch vụ bằng cách tường minh
try {
Class serviceClass = Class.forName(service.getClassName());
stopService(new Intent(this, serviceClass));
} catch (ClassNotFoundException e) {}
2.3.2 Vòng đời của Services:

×