83
Tìm hiể u l  p trình trên Android SVTH: Phm Quang Đạo Nguy n Hoàng Nam 1 Mc l c  Chương 1.  GII THI U ANDROID ............................................................................................................. 5  1.1 Khái ni m vAndroid: ........................................................................................................................... 5  Android khác v i các h điu hành ch y trên thi ết b di động khác ........5  1.1.1  Đặ c tính mca Android: .......................................................................................................... 6  1.1.2 1.2 Ki ến trúc ca Android: ........................................................................................................................... 6  Android Platform: ............................................................................................................................ 7  1.2.1  Tng Linux Kernel: .......................................................................................................................... 7  1.2.2  Native Libraries: ............................................................................................................................... 7  1.2.3  Tng Runtime: .................................................................................................................................... 8  1.2.4  Tng Ap pli cat ion Fr amework: ......................................................... ...... ........ ............ ...... ...... 8 1.2.5 Chương 2.  MÔI TRƯỜNG LP TRÌNH................................................................................................. 10  2.1 Gii thi u: ...................................................................................................................................................... 10  2.2 Android SDK: .............................................................................................................................................. 10  2.3 Máy o Dalvik: ........................................................................................................................................... 11  2.4 Các gói Java c n thiết: .......................................................................................................................... 11  2.5 Thành phn chính ca Eclipse khi t o ng dng trên Android: ........................ 12 2.6 Thành phn quan trng trong mt An droid Pro j ect: ................................................. 13 2.7 Chu ksng ca ng d ng Android ......................................................................................... 13  Chu ksng thành phn........................................................................................................... 14  2.7.1  Activity Stack .................................................................................................................................... 14  2.7.2  Các trng thái ca chu ksng............................................................................................ 15  2.7.3  Chu ksng ca ng d ng ..................................................................................................... 15  2.7.4  Các ski n trong chu ksng ca ng d ng .......................................................... 16 2.7.5  Thi gian sng ca ng d ng............................................................................................... 16  2.7.6  Thi gian hin thca Activity ............................................................................................ 17  2.7.7  Các hàm thc thi ............................................................................................................................ 17  2.7.8 2.8 Các công c cn thiết để lp trình trên Android và h ướ ng d n cài đặt:.......17  Các công c cn thiết để lp trình: ................................................................................... 17  2.8.1  Các bước cài đặt ............................................................................................................................. 17  2.8.2 2.9 Bt đầu lp trình 1 chương trình hello world đầu tiên: ........................................... 20 2.10 Thành phn giao din Android................................................................................................ 23  

Bao Cao Lap Trinh Android_final

Embed Size (px)

Citation preview

8/4/2019 Bao Cao Lap Trinh Android_final

http://slidepdf.com/reader/full/bao-cao-lap-trinh-androidfinal 1/82

Tìm hiể u l ậ p trình trên Android 

SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 1

Mục lục 

Chương 1.  GIỚI THIỆU ANDROID .............................................................................................................5 1.1  Khái niệm về Android: ...........................................................................................................................5 

Android khác với các hệ điều hành chạy trên thiết bị di động khác ........5 1.1.1  Đặc tính mở của Android:..........................................................................................................6 1.1.2

1.2  Kiến trúc của Android:...........................................................................................................................6 Android Platform: ............................................................................................................................7 1.2.1

  Tầng Linux Kernel: ..........................................................................................................................7 1.2.2  Native Libraries: ...............................................................................................................................7 1.2.3  Tầng Runtime: ....................................................................................................................................8 1.2.4

  Tầng Application Framework: ...............................................................................................8 1.2.5

Chương 2.  MÔI TRƯỜNG LẬP TRÌNH.................................................................................................10 2.1  Giới thiệu:......................................................................................................................................................10  2.2  Android SDK: ..............................................................................................................................................10 2.3  Máy ảo Dalvik: ...........................................................................................................................................11 2.4  Các gói Java cần thiết: ..........................................................................................................................11 2.5  Thành phần chính của Eclipse khi t ạo ứng dụng trên Android: ........................12 2.6  Thành phần quan trọng trong một Android Project: .................................................13 2.7  Chu kỳ sống của ứng dụng Android .........................................................................................13 

Chu kỳ sống thành phần...........................................................................................................14  2.7.1

  Activity Stack ....................................................................................................................................14 2.7.2  Các trạng thái của chu kỳ sống............................................................................................15  2.7.3  Chu kỳ sống của ứng dụng .....................................................................................................15 2.7.4

  Các sự kiện trong chu kỳ sống của ứng dụng ..........................................................16 2.7.5  Thời gian sống của ứng dụng...............................................................................................16  2.7.6  Thời gian hiển thị của Activity ............................................................................................17 2.7.7

  Các hàm thực thi ............................................................................................................................17 2.7.8

2.8  Các công cụ cần thiết để lập trình trên Android và hướng dẫn cài đặt:.......17 Các công cụ cần thiết để lập trình: ...................................................................................17 2.8.1

  Các bước cài đặt .............................................................................................................................17 2.8.2

2.9 

Bắt đầu lập trình 1 chương trình hello world đầu tiên: ...........................................20 

2.10  Thành phần giao diện Android................................................................................................23 

8/4/2019 Bao Cao Lap Trinh Android_final

http://slidepdf.com/reader/full/bao-cao-lap-trinh-androidfinal 2/82

Tìm hiể u l ậ p trình trên Android 

SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 2

View ....................................................................................................................................................23 2.10.1

  VIEWGROUP: ...............................................................................................................................23 2.10.2

2.11  Các Control ..............................................................................................................................................26 BUTTON...........................................................................................................................................26  2.11.1

  LISTVIEW .......................................................................................................................................27 2.11.2

  EDITTEXT.......................................................................................................................................29  2.11.3  TEXTVIEW .....................................................................................................................................30 2.11.4  CHECKBOX.....................................................................................................................................30  2.11.5

  MENUOPTION .............................................................................................................................31 2.11.6  CONTEXTMENU.........................................................................................................................32  2.11.7

2.12  Tùy biến control (custom control ):......................................................................................32 2.13  Ví dụ sử dụng Listview...................................................................................................................35 

Chương 4.  LẬP TRÌNH TRÊN ANDROID ...........................................................................................38 4.1  Giới Thiệu Intents: .................................................................................................................................38 

Thành phần Intents:....................................................................................................................38 4.1.1  Sử dụng Intents khởi động cho Activities: ................................................................39 4.1.2  Intent không tường minh thực thi Activity: .............................................................40 4.1.3

  Intent tường minh thực thi Activity ...............................................................................40 4.1.4  Sử dụng Intents gửi đi thông điệp ra ngoài ứng dụng hoặc Activity:...41 4.1.5

4.2  Giới Thiệu Adapters: ............................................................................................................................43 Một số Adapter : .............................................................................................................................43 4.2.1

  Sử dụng Adapter hiển thị dữ liệu: ....................................................................................43 4.2.2

4.3  Ví dụ sử dụng Intent để liên lạc giữa các Activity: ........................................................44 4.4  Kỹ thuật lưu trữ dữ liệu trong Android.................................................................................46 4.5  Lưu trữ dữ liệu ứng dụng một cách đơn giản: .................................................................47 

Tạo và lưu dữ liệu với Share Preferences: ................................................................47 4.5.1

  Truy xuất Shared Preferences.............................................................................................47 4.5.2

4.6  Lưu và đọc các t ập tin trong Android: ....................................................................................49 Truy xuất các t ập tin trong Resources: ........................................................................50 4.6.1

  Các công cụ quản lý t ập tin ....................................................................................................50 4.6.2

4.7  Cơ sở dữ liệu trong Android...........................................................................................................50 Giới thiệu SQLite: ..........................................................................................................................51 4.7.1

  Cursor s và Cont ent Values: ...................................................................................................51 4.7.2

  Sử dụng SQLiteOpenHelper:.................................................................................................52 4.7.3  Truy xuất và t ạo Cơ sở dữ liệu không dùng SQLiteHelper: ..........................52 4.7.4

8/4/2019 Bao Cao Lap Trinh Android_final

http://slidepdf.com/reader/full/bao-cao-lap-trinh-androidfinal 3/82

Tìm hiể u l ậ p trình trên Android 

SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 3

Truy vấn cơ sở dữ liệu ..............................................................................................................52 4.7.5

  Lấy kết quả t ừ Cursors ..............................................................................................................53 4.7.6  Thêm, cập nhật và xóa dòng:................................................................................................53 4.7.7

  Thao tác trên cơ sở dữ liệu Android ..............................................................................54 4.7.8  Giới thiệu Content Providers ...............................................................................................56 4.7.9

4.8  Một ứng dụng Demo sử dụng Cont entProvider để quản lý sách: .....................59 4.9  Maps, Geocoding, Location Based Services .......................................................................59 

Sử dụng dịch vụ định vị ............................................................................................................59 4.9.1

  Cài đặt trên môi trường giả lập với Test Provi ders ...........................................59 4.9.2  Cập nhật vị trí với Emulator Location Providers .................................................59 4.9.3  Chọn một Location Provider ................................................................................................60 4.9.4

  Tìm một Providers có sẵn.......................................................................................................60  4.9.5  Tìm kiếm một Provider theo tiêu chí ............................................................................61 4.9.6

  Tìm một địa chỉ (Finding Your Location)...................................................................61 4.9.7  Theo dõi sử di chuyển (Tracking Movement) ........................................................62 4.9.8  Sử dụng Goecoder.........................................................................................................................63 4.9.9

  Reverse Geocoding..................................................................................................................63 4.9.10  Forward Geocoding ................................................................................................................64 4.9.11  Dùng MapView ...........................................................................................................................65 4.9.12

  Dùng MapActivity ....................................................................................................................66 4.9.13  Sử dụng Overlay ........................................................................................................................67 4.9.14  Dùng MapController ..............................................................................................................68 4.9.15

  Chú ý khi t ạo một ứng dụng có sử dụng MapView ........................................69 4.9.16

4.10  Làm việc trên Background.........................................................................................................70 Giới Thiệu Services .................................................................................................................70 4.10.1

  Tạo Service ....................................................................................................................................71 4.10.2

  Khởi chạy, điều khiển và tương tác với Sercice ...............................................71 4.10.3  Kết nối Activities với Services........................................................................................72 4.10.4  Giới thiệu Thông báo trong Android.........................................................................74 4.10.5

  Giới thiệu Notification Manager ...................................................................................74 4.10.6  Tạo thông báo .............................................................................................................................75 4.10.7

  Kích hoạt thông báo ...............................................................................................................76 4.10.8

4.11  Sử dụng các Media APIs ................................................................................................................76 Chơi nhạc ........................................................................................................................................77 4.11.1

  Ghi âm ...............................................................................................................................................78 4.11.2

4.12  Sử dụng máy ảnh ................................................................................................................................79 

8/4/2019 Bao Cao Lap Trinh Android_final

http://slidepdf.com/reader/full/bao-cao-lap-trinh-androidfinal 4/82

Tìm hiể u l ậ p trình trên Android 

SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 4

Cài đặt điều khiển camera .................................................................................................80 4.12.1

  Sử dụng máy ảnh ......................................................................................................................80 4.12.2  Chụp ảnh ........................................................................................................................................81 4.12.3

Chương 5.  TỔNG KẾT ......................................................................................................................................82 5.1  Kết quả đạt được:....................................................................................................................................82  5.2  Hướng phát triển của đề tài: ..........................................................................................................82 5.3  Tài liệu tham khảo: ................................................................................................................................82 

8/4/2019 Bao Cao Lap Trinh Android_final

http://slidepdf.com/reader/full/bao-cao-lap-trinh-androidfinal 5/82

Tìm hiể u l ậ p trình trên Android 

SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 5

Chương 1. GIỚ I THIỆU ANDROID

  Như chúng ta biết, hiện tại đã có hơn nửa nhân loại sử dụng máy di động để 

thoại và giao tiếp qua các mạng không dây. Con số 3 tỉ ngườ i này sẽ còn tăng lên vàmáy di động càng ngày càng "thông minh" vớ i nhiều chức năng và dịch vụ rất hấp dẫn,

cho nên thị  trường máy di động thông minh sẽ vượ t xa máy vi tính trong một tương lai

rất gần... Vì thế việc lập trình trên thiết bị di động ngày càng phổ biến và phát triển rất

mạnh mẽ.  Từ nền tảng mã nguồn mở, Google đã cho ra mắt Android chạy trên các

thiết bị  di động. Android có rất nhiều công cụ và dụng cụ miễn phí để nghiên cứu và

phát triển phần mềm trên nền tảng của nó. Tài liệu này sẽ giúp chúng ta tìm hiểu về 

Android và cách viết một ứng dụng trên nền tảng này.

1.1  KHÁI NIỆM VỀ ANDROID:

Trướ c hết Android là nền tảng phần mềm dựa trên mã nguồn mở  Linux OS

(Kernel 2.6) cho máy di động và những phần mềm trung gian (middleware) để hổ trợ  

các ứng dụng mà ngườ i sử dụng cần đến. Một cách định nghĩa không quá chuyên môn

thì có thể coi Android là tên một nền tảng mở cho thiết bị di động của Google (gồm hệ 

điều hành, middleware và một số ứng dụng cơ bản). Android sẽ đương đầu vớ i một số 

hệ  điều hành (viết tắt là HDH) dành cho thiết bị di dộng khác đang hâm nóng thị 

trườ ng như Windows Mobile, Symbian và dĩ nhiên là cả OS X (iPhone).

Có thể nói một cách nôm na rằng Android là một HDH chạy trên thiết bị di động,

cũng giống như Windows, Linux hay Mac chạy trên máy vi tính vậy.

 Android khác vớ i các hệ điề u hành chạ y trên thiế t bị di động khác1.1.1

Android đã thu hút đượ c sự chú ý của giớ i công nghệ khắp toàn cầu khi

đứa con của Google sử dụng giấy phép mã nguồn mở. Đó là một sản phẩm k ết

tinh từ  ý tưở ng của Khối Liên minh thiết bị cầm tay mở  do Google dẫn đầu,

gồm 34 thành viên với các công ty hàng đầu về công nghệ và di động toàn cầu

như Qualcomm, Intel, Motorola, Texas Instruments và LG Electronics, các nhà

mạng như T-Mobile, Sprint Nextel, NTT DoCoMo và China Mobile.

Các nhà phát triển có thể sử dụng miễn phí bộ Kit Android Software

Development để xây dựng các ứng dụng của mình.

8/4/2019 Bao Cao Lap Trinh Android_final

http://slidepdf.com/reader/full/bao-cao-lap-trinh-androidfinal 6/82

Tìm hiể u l ậ p trình trên Android 

SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 6

 Đặ c tính mở của Android:1.1.2

Android đượ c xây dựng để cho phép các nhà phát triển để tạo ra các ứng

dụng di động hấp dẫn, tận dụng tất cả  tính năng một chiếc điện thoại đã cung

cấp. Nó đượ c xây dựng để đượ c thực sự mở . Ví dụ, một ứng dụng có thể gọi bất

k ỳ chức năng lõi của điện thoại như thực hiện cuộc gọi, gửi tin nhắn văn bản,

hoặc bằng cách sử dụng máy ảnh, cho phép các nhà phát triển để tạo ra nhiều

ứng dụng phong phú hơn cho người dùng (điều này hiện chưa có trên Windows

Phone7 của Microsoft). Android đượ c xây dựng trên mã nguồn mở  Linux

Kernel. Hơn nữa, nó sử dụng một máy ảo tuỳ chỉnh đượ c thiết k ế để tối ưu hóa

bộ nhớ và tài nguyên phần cứng trong một môi trường di động.

Android không phân biệt giữa các ứng dụng lõi của điện thoại và các

ứng dụng của bên thứ ba. Tất cả có thể được xây dựng để có thể truy cập bằng

khả năng của một thiết bị di động cung cấp cho người sử dụng với một dải rộng

các ứng dụng và dịch vụ. Với các thiết bị xây dựng trên Android, người dùng

có thể hoàn toàn thích ứng với điện thoại đến lợi ích của họ. Vớ i Android, một

nhà phát triển có thể xây dựng một ứng dụng cho phép ngườ i dùng xem vị trí 

của bạn bè của họ và đượ c cảnh báo khi họ đang có trong vùng phụ cận cho họ 

một cơ hội để k ết nối.

Android cung cấp truy cập đến một loạt các thư viện công cụ hữu ích và

có thể được sử dụng để xây dựng các ứng dụng phong phú. Ví dụ, Android cho

  phép các thiết bị giao tiếp với nhau tạo điều kiện cho đồng đẳng rich-to-peer

trong ứng dụng xã hội. Ngoài ra, Android bao gồm một tập hợp đầy đủ công cụ

đã được xây dựng công phu, với việc cung cấp nền tảng phát triển, với năng

suất cao và cái nhìn sâu vào các ứng dụng . 

1.2  KIẾN TRÚC CỦA ANDROID: 

"Understanding Android" là cách mà ta tiếp cận lập trình Android và thấu hiểu

kiến trúc hệ thống của nó. Chúng ta có thể không cần hiểu rõ cấu trúc của một HDH

nhưng Chúng ta vẫn có thể lập trình một ứng dụng trên HDH đó, đây là điều mà nhà

sản xuất muốn khi release SDK vớ i một framework có sẵn của họ. Như chúng ta biết

điều này cũng có mặt tốt và xấu. Framework là một tầng cao cấp dành cho lập trình

8/4/2019 Bao Cao Lap Trinh Android_final

http://slidepdf.com/reader/full/bao-cao-lap-trinh-androidfinal 7/82

Tìm hiể u l ậ p trình trên Android 

SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 7

viên, nó đều có giớ i hạn của nó, chúng ta có thể chỉ có thể lập trình những ứng dụng

phổ biến nhưng không nên tiến tớ i những ứng dụng cao cấp đi sâu vào hệ thống của

HDH. Theo cách của mình, trướ c khi bắt đầu học Android, chúng ta nên nghiên cứu

qua bản thân HDH Android, chúng ta không cần phải hiểu rõ nó như thể nào, mục đích

quan trọng nhất của chúng ta là có cái nhìn chung và toàn diện nhất về Android.

 Android Platform:1.2.1

Bao gồm HDH Android đầy đủ  tính năng, các ứng dụng và các tầng

trung gian để developer có thể mở  rộng, tùy chỉnh hoặc thêm vào các

component của họ.

Có 4 tầng cơ bản trong HDH Android: Application Framework, Android

Runtime, Native Libraries, Linux Kernel ... Mỗi tầng làm việc đều nhờ sự giúp

đỡ của tầng bên dướ i.

T ầng Linux Kernel:1.2.2

Đây là nhân của HDH Android, mọi xử lý của hệ thống đều phải thông

qua tầng này.  Linux Kernel cung cấp các trình điều khiển thiết bị phần cứng

(driver) như: camera, USB, Wifi, Bluetooth, Display, Power Management ...

Android dựa trên Linux phiên bản 2.6 lựa chọn các tính năng cốt lõi như bảo

mật, quản lý bộ nhớ , quản lý tiến trình, mạng stack và các trình điều khiển phần

cứng. Kernel hoạt động như một lớ p trừu tượ ng giữa phần cứng và phần mềm

còn lại của hệ thống.

 Native Libraries:1.2.3

  System C library - có nguồn gốc từ hệ thống thư viện chuẩn C (libc), điều

chỉnh các thiết bị nhúng trên Linux.

  Media Libraries - mở  rộng từ PacketVideo's OpenCORE; thư viện hỗ trợ  

playback và recording của nhiều định dạng video và image 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.

8/4/2019 Bao Cao Lap Trinh Android_final

http://slidepdf.com/reader/full/bao-cao-lap-trinh-androidfinal 8/82

Tìm hiể u l ậ p trình trên Android 

SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 8

  LibWebCore - Android dùng lại 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)

  SGL - 2D engine

  3D libraries - Thư viện 3D dựa trên OpenGL ES 1.0 API, có nâng cấp tăng

tốc "hardware 3D acceleration"

  FreeType - render bitmap và vector font.

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

T ầng Runtime:1.2.4

Mỗi ứng dụng Android chạy trên một proccess riêng của Dalvik VM

(máy ảo). 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ị.

Máy ảo Dalvik thực thi các file mang định dạng .dex (Dalvik Excutable),

định dạng này là định dạng đã đượ c tối ưu hóa để chỉ chiếm một vùng nhớ vừa

đủ xài và nhỏ nhất có thể. VM chạy các class (đã được compile trước đó bở i

1trình biên dịch ngôn ngữ Java), sở   dĩ VM chạy đượ c các class này là nhờ  chương trình DX tool đã convert các class sang định dạng .dex.

T ầng Application Framework:1.2.5

Đây là tầng mà 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 có sẵn mà Google đã

viết để sử dụng các tính năng của phần cứng mà không cần hiểu cấu trúc bên

dướ i.

Bằng cách cung cấp một nền tảng phát triển mở , Android cho các nhà phát

triển khả  năng xây dựng các ứng dụng cực k ỳ phong phú và sáng tạo. Nhà phát

triển đượ c tự do tận dụng các thiết bị phần cứng, thông tin địa điểm truy cập,

các dịch vụ chạy nền, thiết lập hệ thống báo thức, thêm các thông báo để các

thanh trạng thái, và nhiều, nhiều hơn nữa.

Tất cả các ứng dụng thườ ng gồm một bộ các dịch vụ và hệ thống cơ bản

sau:

8/4/2019 Bao Cao Lap Trinh Android_final

http://slidepdf.com/reader/full/bao-cao-lap-trinh-androidfinal 9/82

Tìm hiể u l ậ p trình trên Android 

SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 9

  View UI dùng để xây dựng layout của ứng dụng bao gồm: list view,

text field, button, dialog, form ...

  Content Providers cho phép các ứng dụng có thể truy cập dữ liệu từ 

các ứng dụng khác (như ứng dụng của ta có thể lấy thông tin

Contacts của điện thoại Android), hoặc để chia sẻ dữ liệu của riêng

ứng dụng.

  Resource Manager cung cấp cách thức truy cập đến non-code

resources như các asset, graphic, image, music, video ... 

  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 HDH.  Activity Manager quản lý vòng đờ i của các ứng dụng.

Ở góc nhìn của ngườ i dùng ta có thêm tầng application (là ứng dụng do

chúng ta viết), sau đây là sơ đồ tổng quát như hình 1.1:

1-1 Kiến trúc Android

8/4/2019 Bao Cao Lap Trinh Android_final

http://slidepdf.com/reader/full/bao-cao-lap-trinh-androidfinal 10/82

Tìm hiể u l ậ p trình trên Android 

SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 10

Chương 2.  MÔI TRƯỜ NG LẬP TRÌNH

2.1  GIỚ I THIỆU:

Trong chương này sẽ giớ i thiệu các công cụ lập trình cho Android (Android

Development Tools). Chúng ta sẽ dần làm quen vớ i Eclipse và Android Development

Tool plug-in, thông qua Android SDK và công cụ của nó, chạy một ứng dụng Android

trên Emulator(tạm dịch là trình giả lập giao diện của Android trên PC). Vớ i những kĩ 

năng đó trong tay, chúng ta sẽ tìm hiểu các gói Java packages đượ c cung cấp trong

SDK giúp nâng cao khả năng lập trình trên Android.

2-1 Môi trườ ng lập trình trong Android

2.2  ANDROID SDK:Android SDK, viết tắt của Android Software Development Kit, có thể gọi là

“công cụ phát triể n phần mềm” mà cụ thể ở  đây là phát triển ứng dụng cho Android

OS. Đến đây thì chắc các chúng ta cũng đã hiểu đơn giản Google Adroid SDK là bộ 

công cụ đượ c chính Google xây dựng và phát hành miễn phí đến giớ i Developer để họ 

dễ dàng xây dựng và phát triển các ứng dụng chạy đượ c trên Android OS.

Android SDK có các đặc tính sau:

  Đượ c phát triển và cung cấp miễn phí 

SDK Documentation

Eclipse OpenSource IDE Coding Debugging

Android Development Tools

(plug-in)

SDK

Emulator profileconfiguration

Emulator launch Process & file system viewing

Log viewing

Command-Line tools

•File transfer tools

•GSM simulation  tester 

Android Emulator•Multiple skins•Network connectivity options

•Integrated with Eclipse viaAndroid Development Tools plug-in

Android Development 

Android Device

•Physical phone hardware

8/4/2019 Bao Cao Lap Trinh Android_final

http://slidepdf.com/reader/full/bao-cao-lap-trinh-androidfinal 11/82

Tìm hiể u l ậ p trình trên Android 

SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 11

  Truy cập đến phần cứng Wi-Fi.

  GSM, EDGE và tính năng mạng 3G cho phép việc chuyển dữ liệu, gọi

điện hay gửi tin SMS trong mạng di động.

  Gói API toàn diện cho các dịch vụ nền tảng ví dụ như GPS.

  Truy cập toàn bộ phần cứng điều khiển đa phương tiện như chơi nhạc,

ghi âm hay sử dụng microphone và camera.

  Chia sẻ dữ liệu trong kho dữ liệu.

  Tích hợ p trình duyệt dựa trên bộ WebKit (mã nguồn mở ).

  P2P hổ trợ sử dung Google Talk.

  Hỗ trợ tốt đồ họa 3D nhờ sử dụng OpenGL ES.Android SDK cần phải được cài đặt để xây dựng các ứng dụng Android. Android

SDK bao gồm tài liệu tích hợ p HTML_base lõi chính của Javadoc để thể hiện các gói

và lớ p trong Java.

2.3  MÁY ẢO DALVIK:

Một trong những thành phần quan trọng của Android là máy ảo Dalvik. Thay vì

sử dụng máy ảo Java như trướ c kia Android sử dùng máy ảo của riêng nó đượ c thiết k ế để bảo đảm rằng đa ứng dụng có thể chạy mượ t mà trên một thiết bị di động.

Máy ảo Dalvik sử dụng lõi Linux để xử lý các chức năng ở  mức thấp bao gồm

bảo mật, các tiến trình, các luồng và quản lý vùng nhớ. Nó cũng có thể viết bằng ứng

dụng C/C++ để chạy trực tiếp lên lõi Linux bên dướ i. Giữa phần cứng và các dịch vụ 

hệ thống đượ c quản lý bở i máy ảo Dalvik, nó là một thành phần ở giữa. Bằng cách sử 

dụng máy ảo này để chạy ứng dụng, các nhà phát triển hoàn toàn không phải bận tâm

gì về các phần cứng bên dướ i. Khi máy ảo này chạy nó sẽ tạo ra tập tin có đuôi là .dex,

tập tin này đượ c SDK tạo ra bở i sự chuyển đổi từ các lớ p biên dịch ngôn ngữ Java .

2.4  CÁC GÓI JAVA CẦN THIẾT:

  java.lang  — gói chứa các lớ p lõi của Java

  java.io  — xuất nhập.

  java.net  — k ết nối mạng.

8/4/2019 Bao Cao Lap Trinh Android_final

http://slidepdf.com/reader/full/bao-cao-lap-trinh-androidfinal 12/82

Tìm hiể u l ậ p trình trên Android 

SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 12

   java.util _ chứa các lớ p tiện ích. Bao gồm: Log thường được dùng đề viết

LogCat.

  java.text  — tiện ích sử lý văn bản.

  java.math  — các lớ p toán học.

  javax.net  — các lớ p mạng.

  javax.security  — Security-related classes.

  javax.xml  — các lớp liên quan đến DOM-based XML.

  org.apache.*  — các lớp liên quan đến HTTP-related.

  org.xml  — các lớp liên quan đến SAX-based XML .

Các gói dùng cho lập trình Android:  Android.app — Android application model access

  Android.content — truy xuất dữ liệu trong Android

  Android.net — bao gồm Uri class dùng cho việc truy xuất các nội dung

khác

  Android.graphics —đồ họa

  Android.opengl — các lớ p OpenGL

  Android.os — truy cập ở mức độ hệ thông đến môi trườ ng Android

  Android.provider — các lớp liên quan đến ContentProvider

  Android.telephony — khả  năng truy cập Telephony

  Android.text — Text layout

  Android.util — tập các tiện thao tác trên văn bản,bao gồm XML

  Android.view — thành phần UI (giao diện ngườ i dùng)

  Android.webkit — Browser functionality

  Android.widget — thành phần UI mức độ cao hơn 

Trong đó các gói gần như là lõi của mọi ứng dụng trên Android đó là

Android.app, Android.view và Android.content.

2.5  THÀNH PHẦN CHÍNH CỦA ECLIPSE KHI TẠO Ứ NG DỤNG TRÊN ANDROID:

  Môi trườ ng phát triển Rich Java bao gồm trình biên dịch, class autocompletion,

và tích hợ p Javadoc

  Bẫy lỗi code

8/4/2019 Bao Cao Lap Trinh Android_final

http://slidepdf.com/reader/full/bao-cao-lap-trinh-androidfinal 13/82

Tìm hiể u l ậ p trình trên Android 

SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 13

  Quản lý và chạy Android Emulator profile

  The Dalvik Debug Monitoring Service (DDMS)

  Khung nhìn các tiến trình (Thread and heap views)

  Quản lý Hệ thống tập tin giao diện (Emulator filesystem management)

  Điều khiển dữ liệu và hội thoại (Data and voice network control)

  Điều khiển giao diện (Emulator control)

  Ghi lỗi hệ thống và ứng dụng (System and application logging)

2.6  THÀNH PHẦN QUAN TRỌNG TRONG MỘT ANDROID PROJECT:

  Activity (Android.app.Activity): đây là lớ p khở i tạo giao diện ứng dụng

nội bộ trên Android tương tư như MIDlet trong J2ME. 

  Service (Android.app.Service): cung cấp các dịch vụ  liên quan đến

client/service. Một Service sẽ chạy ngầm bên dưới, sau đó các client

(Activity) sẽ k ết nối và truy xuất các hàm trên dịch thông qua Interface

class.

  Broadcast receiver (Android.content.BroadcastReceiver): đây là một ứng

dụng chạy ngầm dùng để đọc và cập nhật thông tin trên UI, ví dụ như cậpnhật sự thay đỗi giờ , pin...

  Content Provider: cung cấp chức năng truy vấn dữ liệu giữa các ứng dụng

của Android.

  Intent: nền tảng để truyền tải các thông báo. Intent đượ c sử dụng để gửi

các thông báo đi nhằm khở i tạo 1 Activity hay Service để thực hiện công

việc mà chúng ta mong muốn.

2.7  CHU KỲ SỐNG CỦA Ứ NG DỤNG ANDROID 

Một tiến trình Linux gói gọn một ứng dụng Android đã đượ c tạo ra cho ứng

dụng khi codes cần đượ c xây dựng, khở i chạy và sẽ còn chạy cho đến khi:

  Nó không phụ thuộc.

  Hệ thống cần lấy lại bộ nhớ mà nó chiếm giữ cho các ứng dụng khác.

8/4/2019 Bao Cao Lap Trinh Android_final

http://slidepdf.com/reader/full/bao-cao-lap-trinh-androidfinal 14/82

Tìm hiể u l ậ p trình trên Android 

SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 14

Một sự khác thường và đặc tính cơ bản của Android là thờ i gian sống của tiến

trình ứng dụng không được điều khiển trực tiếp bở i chính nó. Thay vào đó, nó đượ c

xác định bở i hệ thống qua một k ết hợ p của:

  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 dùng.

  Bao nhiêu vùng nhớ chiếm lĩnh trong hệ thống.

Chu k  ỳ số ng thành phần2.7.1

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, đôi lúc chúng có thể là active

(visible hoặc invisible) hoặc inactive.

 Activity Stack 2.7.2

Bên trong hệ thống các activity đượ c quản lý như một activity stack. Khi

một Activity mới được start, nó được đặt ở  đỉnh của stack và trở  thành activity

đang chạy activity trướ c sẽ ở   bên dướ i activity mớ i và sẽ không thấy trong suốt

quá trình activity mớ 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. 

Hinh 2-2 Activity stack  

8/4/2019 Bao Cao Lap Trinh Android_final

http://slidepdf.com/reader/full/bao-cao-lap-trinh-androidfinal 15/82

Tìm hiể u l ậ p trình trên Android 

SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 15

Các tr ạng thái của chu k  ỳ số ng2.7.3

 

Một Activity chủ yếu có 4 chu k ỳ chính sau:

  Active hoặc running: Khi Active là đượ c chạy trên màn hình. Activity nà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ườ i dùng

vẫn trông thấy. Có nghĩa là một Activity mớ i ở   trên nó nhưng khô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ạng thá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.

  Killed: Khi hệ thống bị thiếu bộ nhớ , nó sẽ giải phóng các tiến trình theo

nguyên tắc ưu tiên. Các Activity ở  trạng thái stop hoặc paused  cũng có thể bị 

giải phóng và khi nó đượ c hiển thị lại thì các Activity này phải khởi động lại

hoàn toàn và phục hồi lại trạng thái trước đó. 

Chu k  ỳ số ng của ứ ng d ụng2.7.4

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

Hinh2-3 Chu k ỳ sống của Activity 

8/4/2019 Bao Cao Lap Trinh Android_final

http://slidepdf.com/reader/full/bao-cao-lap-trinh-androidfinal 16/82

Tìm hiể u l ậ p trình trên Android 

SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 16

tất cả các thành phầ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 tiế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ông cò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ác thành phần không có khả năng tương

tác với người dùng như là Service, Broadcast receiver. Có nghĩa là những thành

phần không tương tác ngườ i dùng có thể chạy background 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 ụng2.7.5

Nếu một Activity đượ c tạm dừng hoặc dừng hẳn, hệ thống có thể bỏ 

thông tin khác của nó từ vùng nhớ  bở i việc gọi hàm finish() của nó, hoặc đơn

giản giết tiế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àn restart 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ữa cá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.

Tất cả các phương thức là những móc nối mà chúng ta có thể override để 

làm tương thich công việc trong ứng dụng khi thay đổi trạng thái. Tất cả các

Activity bắt buộc phải có onCreate() để khở i tạo ứng dụng. Nhiều Activity sẽ cũng hiện thực onPause() để 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ới ngườ i dùng.

Thờ i gian số ng của ứ ng d ụng2.7.6

Bảy phương thức chuyển tiếp định nghĩa trong chu kỳ sống của một

Activity. Thờ i gian sống của một Activity diễn ra giữa lần đầu tiên gọi

onCreate() đến trạng thái cuối cùng gọi onDestroy(). Một Activity khở i tạo

Hinh 2-4 

8/4/2019 Bao Cao Lap Trinh Android_final

http://slidepdf.com/reader/full/bao-cao-lap-trinh-androidfinal 17/82

Tìm hiể u l ậ p trình trên Android 

SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 17

toàn bộ trạng thái toàn cục trong onCreate(), và giải phóng các tài nguyên đang

tồn tại trong onDestroy().

Thờ i gian hiể n thị của Activity2.7.7

Visible lifetime của một activity diễn ra giữa lần gọi một onStart() cho

đến khi gọi onStop(). Trong suốt khoảng thời gian này ngườ i dùng có thể thấy

activity trên mà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 đến ngườ i dùng.

Các hàm thự c thi2.7.8  OnCreate(...): hàm này đượ c gọi khi lớp Activity đượ c khở i tạo, dùng để 

thiết lập giao diện ứng dụng và thực thi những thao tác cơ bản.

  onStart(): hàm này đượ c gọi khi lớ p ứng dụng xuất hiện trên màn hình.

  onResume(): hàm đượ c gọi ngay sau OnStart hoặc khi ngườ i dùng focus

ứng dụng, hàm này sẽ đưa ứng dụng lên top màn hình.

  onPause(): hàm đượ c gọi khi hệ thống đang focus đến 1 activity trước đó. 

  onStop(): hàm đượ c gọi khi một activity khác đượ c khởi động và focus.

  onRestart(): đưọc gọi khi ứng dụng chuyển sang onStop(), nhưng muốn khở i

động lại bằng onStart().

2.8  CÁC CÔNG CỤ CẦN THIẾT ĐỂ LẬP TRÌNH TRÊN ANDROID VÀ ƯỚ NG DẪN

CÀI ĐẶT:

Các công cụ cần thiết để lậ p trình:2.8.1  Hệ điều hành: Window XP, Win7

  Công cụ lập trình: Eclipse version 3.6 hoặc cao hơn 

  Bộ công cụ Android SDK

Các bước cài đặ t:2.8.2

Chúng ta có 3 bước chính: Cài đặt Eclipse IDE, Plugin Android cho Eclipse

và cuối cùng là cài đặt Emulator (Android SDK). Và được chia thành các

bước nhỏ sau:

8/4/2019 Bao Cao Lap Trinh Android_final

http://slidepdf.com/reader/full/bao-cao-lap-trinh-androidfinal 18/82

Tìm hiể u l ậ p trình trên Android 

SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 18

  Bướ c 1: Vào địa chỉ http://www.eclipse.org/downloads/  download phần

mền lập trình eclipse. Chọn phần Eclipse IDE cho các nhà phát triển

JAVA.

Sau khi đã download eclipse chúng ta giải nén ra để sử dụng.

Sau khi giải nén xong cho chạy chương trình. 

Khi chạy, chương trình muốn lưu thư mục làm việc, chúng ta chọn thư

mục tùy ý và nhấn OK.

  Bướ c 2: truy cập 

www.oracle.com/technetwork/java/javase/downloads/index.html  để 

downloads JAVA SE . Chọn downloads JAVA SE > vào thư mục chứaJAVA SE và tiến hành cài đặt. 

  Bướ c 3: Truy cập developer.Android.com/sdk/index.html . Và tiến hành

download chọn phần Android-sdk_r10-windows.zip .

Sau khi downloads vào thư mục chứa phần download giải nén và chọn

SDK Manager.exe chạy chương trình tự động update.

Vào chương trình eclipse chọn menu Help -> Install New Software… 

Name: Google Android ( tùy ý)

Location : http//:dl-ssl-google.com/Android/eclipse

Sau đó chọn OK.

Hình 2-5  

Chọn Sellect All , chọn vào các ô như hình 2.7

8/4/2019 Bao Cao Lap Trinh Android_final

http://slidepdf.com/reader/full/bao-cao-lap-trinh-androidfinal 19/82

Tìm hiể u l ậ p trình trên Android 

SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 19

Hình 2-6  

Sau đó chương trình tự động cập nhật những bản cần để cài đặt.

Tiếp theo bạn chọn những phần cần thiết để cài đặt hoặc chọn tất cả ->

Next -> chọn I accept the terms of the license agreements ->finsh.

Lưu ý khi cài: windows muốn chứng thực, ở   bướ c này chọn OK.

Sau khi đã cài xong chọn Restsart Now.

  Bướ c 4: Khi chương trình đã cài đặt phần Android SDK hoàn tất và khở i

động lại chương trình, vào Window ->Prefeneces để chỉ đườ ng dẫn củafile SDK.

Hình 2-7 

Ở  bướ c này chọn đườ ng dẫn tới thư mục chứa Android SDK. Sau đó chọn

Apply.

  Bướ c 5: Ở các bước trên đã cấu hình Android SDK trong eclipse , bướ c

tiếp theo sẽ  đi cấu hình để tạo ra 1 máy ảo chứa hệ điệu hành Android.

Vào Window -> Android SDK and AVD Manager.

8/4/2019 Bao Cao Lap Trinh Android_final

http://slidepdf.com/reader/full/bao-cao-lap-trinh-androidfinal 20/82

Tìm hiể u l ậ p trình trên Android 

SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 20

Cửa sổ Android SDK and AVD Manager hiện ra , chương trình đang tự 

động cập nhật. Sau đó chọn Virtual Decvices -> New.

Name ( Tên máy ảo) : AndroidMobile2.2

Size (kích thướ c bộ nhớ  ): 512 MB

Chọn Create AVD

Hình 2-8 

Đã tạo thành công máy ảo , tiếp theo chọn Start…..-> Launch để khởi động

máy ảo.

Hình 2-9 

2.9  BẮT ĐẦU LẬP TRÌNH 1 CƯƠNG TRÌN ELLO WORLD ĐẦU TIÊN:

Lưu ý ở  đây tôi dùng Emulator bảng 2.2.

Mở Eclipse

8/4/2019 Bao Cao Lap Trinh Android_final

http://slidepdf.com/reader/full/bao-cao-lap-trinh-androidfinal 21/82

Tìm hiể u l ậ p trình trên Android 

SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 21

Chọn File > New > Project… 

Chọn Android Project và đặt tên như hình bên dướ i nhé:

Dòng Project Name: HelloAndroid

Dòng Application Name: HelloAndroidPackage name: com.HelloAndroid

Activity name: HelloAndroid_Activity

Min SDK version : 8

2-10

Thế  là chúng ta đã có 1 ứng dụng nhỏ rồi đó.

Sau đó khởi động Android Emulator bằng cách vào menu Window > Android SDK

and ADV manager > chọn thiết bị đã tạo ở phần trên và click Start…>Launch. 

  Hình 2.13

Vậy là ta đã có 1 chiếc điện thoại Mobile Android chạy ngay trên máy tính rồi đó.

Bây giờ chúng ta quay về màn hình Eclipse và Click vào Run…> chọn Android

Application > OK

8/4/2019 Bao Cao Lap Trinh Android_final

http://slidepdf.com/reader/full/bao-cao-lap-trinh-androidfinal 22/82

Tìm hiể u l ậ p trình trên Android 

SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 22

Chúng ta có đượ c ứng dụng cho hình sau:

2-11

Bây giờ  chúng ta sẽ tìm hiểu sâu hơn về ứng dụng này. Quay lại màn hình Eclipse lần

lượ t vào các mục :

Src>HelloAndroid_Activity.java

Res> layout>main.xml

Res>values>string.xml

Đây chính là 3 file quan trọng trong một ứng dụng Android

Bây giờ chúng ta vào file String.xml thay dòng

<string name="hello">Hello World, HelloAndroid_Activity!</string>

Bằng dòng <string name="hello">Xin chào Android!</string> 

Và run… chúng ta sẽ tạo ra 1 ứng dụng có giao diện thuần Việt đúng nghĩa. 

2-12

8/4/2019 Bao Cao Lap Trinh Android_final

http://slidepdf.com/reader/full/bao-cao-lap-trinh-androidfinal 23/82

Tìm hiể u l ậ p trình trên Android 

SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 23

2.10 THÀNH PHẦN GIAO DIỆN ANDROID 

View2.10.1

  2-13 

Trong Android giao diện người dùng đượ c xây dựng từ  các đối tượ ng View.

Trong Android Platform, các screen luôn đượ c bố trí theo một kiểu cấu trúc phân

cấp như hình trên. Một screen là một tập hợ p các Layout và các widget đượ c bố trí có

thứ tự. Để thể hiện một screen thì trong hàm onCreate của mỗi Activity cần phải đượ c

gọi một hàm là setContentView (R.layout.main); hàm này sẽ load giao diện từ file

MAIN.XML lên để phân tích thành mã bytecode.

VIEWGROUP:2.10.2

ViewGroup là sự mở  rộng của class View hay nói cách khác ViewGroup chính

là các WidgetLayout được dùng để bố trí các đối tượ ng khác trong một screen.Có các

loại ViewGroup như sau: 

 Linear Layout

LinearLayout được dùng để bố trí các thành phần giao diện theo chiều ngang

hoặc chiều dọc nhưng trên một line duy nhất mà không có xuống dòng.

  Frame layout

FrameLayout được dùng để bố  trí các đối tượ ng theo kiểu giống như làcác

Layer trong Photoshop. Những đối tượ ng nào thuộc Layer bên dướ i thì sẽ bị che khuất

bởi các đối tượ ng thuộc Layer nằm trên. FrameLayer thường đượ c sử dụng khi muốntạo ra các đối tượ ng có khung hình bên ngoài chẳng hạn như contact image button. 

View

GroupView

 Control

Control

Widget  (compound control) La out  

Control Control

8/4/2019 Bao Cao Lap Trinh Android_final

http://slidepdf.com/reader/full/bao-cao-lap-trinh-androidfinal 24/82

Tìm hiể u l ậ p trình trên Android 

SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 24

  Table layout

Layout này đượ c sử dụng khi cần thiết k ế một table chứa dữ liệu hoặc cần bố trí 

các widget theo các row và column. Chẳng hạn như, giao diện của một chiếc máy tính

đơn giản hoặc một danh sách dữ liệu.

  AbsoluteLayout

Layout này đượ c sử dụng để bố trí các widget vào một vị trí bất kì trong layout

dựa vào 2 thuộc tính toạ độ x, y. Tuy nhiên, kiểu layout này rất ít khi đượ c dùng bở i vì

toạ  độ của các đối tượ ng luôn cố  định và sẽ không tự  điều chỉnh đượ c tỷ lệ khoảng

cách giữa các đối tượ ng. Khi chuyển ứng dụng sang một màn hình có kích thướ c vớ i

màn hình thiết k ế  ban đầu thì vị trí của các đối tượ ng sẽ không còn được chính xác như

 ban đầu.

Dùng câu lệnh <AbsoluteLayout></ AbsoluteLayout> để gọi Layout này.

Muốn định vị một đối tượ ng, phải định vị hai giá trị Android:layout_x="…" và

Android:layout_y="…". 

<AbsoluteLayout  

xmlns:Android="http://schemas.Android.com/apk/res/Android"  

Android:layout_width="fill_parent"  Android:layout_height="fill_parent"  

Android:id="@+id/mainlayout"> 

<Button 

Android:layout_width="wrap_content" 

Android:layout_height="wrap_content" 

Android:text="placed at 100,130 pixels (px)"  

Android:layout_x="100px" 

Android:layout_y="130px"  

 /> 

<AbsoluteLayout> 

Ví dụ: Thử tạo ra những button và cho những button này nằm ở  những vị trí khác

nhau:

Các button này nằm ở những vị trí khác nhau vớ i các chỉ số đo lườ ng khác nhau.

8/4/2019 Bao Cao Lap Trinh Android_final

http://slidepdf.com/reader/full/bao-cao-lap-trinh-androidfinal 25/82

Tìm hiể u l ậ p trình trên Android 

SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 25

  Hình 3.4

  RELATIVE LAYOUT

Layout này cho phép bố trí các widget theo một trục đối xứng ngang

hoặc dọc. Để  đặt được đúng vị trí thì các widget cần được xác định một mối

ràng buộc nào đó vớ i các widget khác. Các ràng buộc này là các ràng buộc trái,

phải, trên, dướ i so vớ i một widget hoặc so vớ i layout parent. Dựa vào những

mối ràng buộc đó mà RetaliveLayout cũng không phụ thuộc vào kích thướ c của

screen thiết bị. Ngoài ra, nó còn có ưu điểm là giúp tiết kiệm layout sử dụng

nhằm mục đích giảm lượ ng tài nguyên sử dụng khi load đồng thời đẩy nhanh

quá trình xử lý.

2-14 Bố trí widget trong RetaliveLayout 

Các đối tượ ng trong Layout này phải có id để tạo mối quan hệ giữa các

đối tượ ng. Android:layout_alignParentRight="true" câu lệnh này giúp đối

tượ ng sau không nằm đè lên đối tượng trước đó.

8/4/2019 Bao Cao Lap Trinh Android_final

http://slidepdf.com/reader/full/bao-cao-lap-trinh-androidfinal 26/82

Tìm hiể u l ậ p trình trên Android 

SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 26

Android:layout_marginLeft="…" cho biết đối tượ ng nằm cách lề phải và trái

  bao nhiêu. Đối tượ ng sau muốn tạo mối quan hệ với đối tượng trướ c, và muốn

cho hai đối tượ ng nằm ở vị trí nào thì sử dụng câu lệnh:

<Android:layout_alignTop= "@id/…">

<?xml  version="1.0" encoding="utf-8"?> 

<RelativeLayout  xmlns:Android="http://schemas.Android.com/apk/res/Android"  

Android:layout_width="fill_parent"  

Android:layout_height="fill_parent"> 

<Button 

Android:id="@+id/ok"  

Android:layout_width="wrap_content" 

Android:layout_height="wrap_content" 

Android:layout_alignParentRight ="true" 

Android:layout_marginLeft="10dip" 

Android:text="Test"  /> 

<Button 

Android:layout_width="wrap_content" 

Android:layout_height="wrap_content" 

Android:layout_alignTop="@id/ok"  

Android:text="Test"  /> 

</ RelativeLayout> 

2.11 CÁC CONTROL 

 BUTTON 2.11.1

Sở  dĩ widget button đượ c giớ i thiệu đầu tiên trong số các widget khác là

vì đây là đối tượ ng có thể nói là đượ c dùng nhiều nhất trong hầu hết các ứng

dụng Android.

Để thiết k ế giao diện vớ i một button ta có 2 cách như sau: <Button

 Android:layout_width="wrap_content"

 Android:layout_height="wrap_content"

 Android:id="@+id/cmdButton1"

 Android:text="Touch me!"

 />

Đây là cách làm ra một button đơn giản. Đoạn mã trên sau khi chạy:

8/4/2019 Bao Cao Lap Trinh Android_final

http://slidepdf.com/reader/full/bao-cao-lap-trinh-androidfinal 27/82

Tìm hiể u l ậ p trình trên Android 

SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 27

2-15

Thực ra nếu không phải đòi hỏi phải custom lại một widget thì

không cần phải sử dụng tớ i code. Trong một số  trườ ng hợ p bắt buộc chúng taphải custom các widget để cho phù hợ p vớ i hoàn cảnh. Chẳng hạn như trong

game, các menu hay các nút điều khiển,… 

Để khai báo một Button trong code ta làm như sau: void showButton()

{

setContentView(R.layout.button);

Button next = (Button) findViewById(R.id.btnButton);

next.setOnClickListener(new View.OnClickListener() {

public  void onClick(View view) {

Toast.makeText (getApplicationContext(), "Bạn vừa click vào Button" ,Toast. LENGTH_SHORT ).show();

}

});

}

nh 2-16 

 LISTVIEW 2.11.2

  Đượ c sử dụng để thể hiện một danh sách các thông tin theo từng cell.

Mỗi cell thông thường đượ c load lên từ một file XML đã đượ c cố định trên đó

số lượ ng thông tin và loại thông tin cần đượ c thể hiện.

8/4/2019 Bao Cao Lap Trinh Android_final

http://slidepdf.com/reader/full/bao-cao-lap-trinh-androidfinal 28/82

Tìm hiể u l ậ p trình trên Android 

SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 28

Để thể hiện đượ c một list thông tin lên một screen thì cần phải có 3 yếu tố 

chính:

  Data Source: Data Source có thể là một ArrayList, HashMap hoặc bất

k ỳ một cấu trúc dữ liệu kiểu danh sách nào.

  Adapter: Adapter là một class trung gian giúp ánh xạ dữ liệu trong Data

Source vào đúng vị trí hiển thị trong ListView. Chẳng hạn, trong Data

Source có một trường name và trong ListView cũng có một TextView để  

thể hiện trườ ng name này. Tuy nhiên, ListView sẽ không thể hiển thị dữ 

liệu trong Data Source lên đượ c nếu như Adapter không gán dữ liệu vào

cho đối tượ ng hiển thị.

 

ListView: ListView là đối tượng để hiển thị các thông tin trong DataSource ra một cách trực quan và ngườ i dùng có thể thao tác trực tiếp trên

đó. 

2-17 

Để gọi đối tượ ng ListView trong xml. Mỗi ListView phải có  ID để gọi

trong Activity.

<ListView  Android:id="@+id/ListView01"  

Android:layout_width="wrap_content" 

Android:layout_height="wrap_content"  />

Để tạo các đối tượ ng trong file Activity thì phải khai báo:

public  class TestActivity extends Activity {

private ListView lv1;

private String lv_arr[] =

{"Android","iPhone","BlackBerry","AndroidPeople"};

@Override 

public  void onCreate(Bundle icicle)

8/4/2019 Bao Cao Lap Trinh Android_final

http://slidepdf.com/reader/full/bao-cao-lap-trinh-androidfinal 29/82

Tìm hiể u l ậ p trình trên Android 

SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 29

{

super.onCreate(icicle);

setContentView(R.layout. main);

lv1=(ListView)findViewById(R.id. ListView01);

  // By using setAdpater method in listview we an add string

array in list. 

lv1.setAdapter(new 

ArrayAdapter<String>(this,Android.R.layout.simple_list_item_

1 , lv_arr));

}

Ví dụ: Tạo ra một ListView gồm các thành phần Android, iPhone,

BlackBerry, AndroidPeople:

2-18

 EDITTEXT 2.11.3

Trong Android đối tượng EditText đượ c sử dụng như một TextField

hoặc một TextBox. Giá trị Android:singleLine bằng false, edittext sẽ là 1

Texbox, ngượ c lại nó là 1 Textfield.

<EditText Android:id="@+id/EditText01" Android:layout_width="wrap_content" 

Android:layout_height="wrap_content" Android:textStyle="bold" 

Android:textSize="20dip" Android:textColor="#000000" Android:text="Hello Android!" 

Android:singleLine="true" 

Android:inputType="textCapWords"   /> 

8/4/2019 Bao Cao Lap Trinh Android_final

http://slidepdf.com/reader/full/bao-cao-lap-trinh-androidfinal 30/82

Tìm hiể u l ậ p trình trên Android 

SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 30

2-19 

TEXTVIEW 2.11.4

TextView có tác dụng là để hiển thị văn bản.

<TextView 

Android:layout_width="fill_parent"  

Android:layout_height="wrap_content" 

Android:text="Hello World! Demo TextView"  

Android:textColor="#07a931" 

Android:textSize="20px"  

Android:gravity="center_horizontal"  

 /> 

Trong đoạn mã trên, Android:text="" dùng để  ghi đoạn text muốn thể 

hiện, Android:textColor="" để định dạng màu chữ, Android:textSize="" kích cở  

chữ, Android:gravity="" dùng để canh chỉnh cho đoạn text. Nếu muốn tìm hiểu

thêm, hãy gõ Android: sau đó nhấn Crtl+ Space để tìm hiểu thêm về các thuộc

tính của nó.

CHECKBOX 2.11.5

Nhận hai giá trị true hoặc false. Đối tượ ng CheckBox cho phép chọn nhiều

item cùng một lúc.

XML:

<CheckBox 

Android:id="@+id/CheckBox01"  Android:layout_width="wrap_content" 

8/4/2019 Bao Cao Lap Trinh Android_final

http://slidepdf.com/reader/full/bao-cao-lap-trinh-androidfinal 31/82

Tìm hiể u l ậ p trình trên Android 

SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 31

Android:layout_height="wrap_content" 

Android:text="True"  Android:checked="true" 

 /> 

Kết quả  như sau: 

2-20

 MENUOPTION 2.11.6

Có 2 cách tạo một MenuOptions:

Tạo bằng code và tập tin XML, dưới đây chúng ta dùng XML 

h 2-21 

Khai báo bằng code XML:

<menu xmlns:Android="https://schemas.Android.com/apk/res/Android" > 

<item  Android:id="@+id/checkbox" Android:title="Checkbox"  /> 

<item  Android:id="@+id/button" Android:title="Button"  /> 

<item  Android:id="@+id/edittext" Android:title="Edittext"  />

 //tiếp tục cho các menu khác……… 

8/4/2019 Bao Cao Lap Trinh Android_final

http://slidepdf.com/reader/full/bao-cao-lap-trinh-androidfinal 32/82

Tìm hiể u l ậ p trình trên Android 

SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 32

</ menu> 

CONTEXTMENU 2.11.7

  ContextMenu đượ c sử dụng để hiển thị các tuỳ chọn khi ngườ i dùng

nhấn dài vào một Button trên màn hình. Để tạo một ContextMenu ta cũng có 2

cách giống như tạo MenuOptions ở trên chỉ khác tên phương thức.

Phương thức:  onCreateContextMenu( ContextMenu menu, View v,

ContextMenuInfo menuInfo)

sẽ đượ c gọi và truyền vào 3 tham số là:

  ContextMenu: đối tượng để add các context menu item

  View: Đối tượng nơi mà xảy ra sự kiện  ContextMenuInfo: Cho biết vị trí xảy ra sự kiện trong ListView.

2-22

2.12 TÙY BIẾN CONTROL (CUSTOM CONTROL):

Chúng ta đã biết Android đã cung cấp cho chúng ta rất nhiều Control hữu

ích.Tuy nhiên ứng dụng của chúng ta đôi khi cũng cần những control do chính chúng

ta tạo ra để đáp ứng các nhu cầu của ứng dụng mà việc sử dụng các control có sẵn rất

khó khăn. 

Ở đây chúng ta sẽ tạo ra một ListView, vớ i màu nền và màu chữ bắt mắt.

  Bướ c 1: Tạo một Class có tên CustomListView như sau: 

8/4/2019 Bao Cao Lap Trinh Android_final

http://slidepdf.com/reader/full/bao-cao-lap-trinh-androidfinal 33/82

Tìm hiể u l ậ p trình trên Android 

SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 33

  Bướ c 2: tạo file colors.xml trong res/values. Tạo ra màu cho paper, margin,

line, text.

  Bướ c 3: tạo file dimens.xml trong res/values tạo giá trị margin cho paper.

  Bướ c 4: vớ i những giá trị đã tạo ta tiếp tục viết code cho hàm init() đã khaibáo trong file CustomListView.java:

 public class CustomListView extends TextView {//cac cong cu ve CustomListView  private Paint marginPaint; private Paint linePaint; private int paperColor;

 private float margin; public CustomListView(Context c, AttributeSet a, int ds) {

super(c, a, ds);init();

}

 public CustomListView(Context c) {super(c);init();

} public CustomListView(Context c, AttributeSet a) {

super(c, a);init();

}

 private  void  init() {

}@Override  protected   void  onDraw(Canvas c) {

//sử dụng lớp cha TextView để vẽ textsuper.onDraw(c);

}} 

<resources> <color name="notepad_paper">#AAFFFF99</color> 

<color name="notepad_lines">#FF0000FF</color> <color name="notepad_margin">#09FF0000</color> <color name="notepad_text">#AA0000FF</color> 

</resources> 

<resources> <dimen name="notepad_margin">30px</dimen> 

</resources> 

8/4/2019 Bao Cao Lap Trinh Android_final

http://slidepdf.com/reader/full/bao-cao-lap-trinh-androidfinal 34/82

Tìm hiể u l ậ p trình trên Android 

SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 34

  Bướ c 5: Tiếp tục viết thêm code cho hàm onDraw()

  Bướ c 6: tạo một file customlistview.xml trong res/layout:

 private  void  init() {Resources myResources = getResources();// tao choi ve, chung ta se su dung trong onDraw marginPaint = new Paint(Paint.ANTI_ALIAS_FLAG );

marginPaint.setColor(myResources.getColor(R.color. notepad_margin));

linePaint = new Paint(Paint.ANTI_ALIAS_FLAG );// lay background paper va margin width paperColor =

myResources.getColor(R.color.notepad_paper );margin =

myResources.getDimension(R.dimen.notepad_margin);} 

@Override 

 protected   void  onDraw(Canvas c) {// ve mau cho paper c.drawColor(paperColor);

//c.drawLine(startX, startY, stopX, stopY, paint) c.drawLine(0, 0, getMeasuredHeight(), 0, linePaint);c.drawLine(0, getMeasuredHeight(),

getMeasuredWidth(),getMeasuredHeight(), linePaint);

// ve margin c.drawLine(margin, 0, margin, getMeasuredHeight(),

marginPaint);// di chuyen text khoang margin vua tao 

c.save();c.translate(margin, 0);// su dung text view de render text super.onDraw(c);c.restore();

<com.example.UserInterface.CustomListView  xmlns:android="http://schemas.android.com/apk/res/android"  

android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" 

android:padding = "10dp" android:scrollbars = "vertical" android:textColor = "@color/notepad_text" android:fadingEdge = "vertical" /> 

8/4/2019 Bao Cao Lap Trinh Android_final

http://slidepdf.com/reader/full/bao-cao-lap-trinh-androidfinal 35/82

Tìm hiể u l ậ p trình trên Android 

SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 35

2.13  VÍ DỤ SỬ DỤNG LISTVIEW 

  Bướ c 1: Khai báo trong file strings.xml và main.xml như sau:

Và trong main.xml, chúng ta khai báo một TextView, một Button, một Listview

có tên lần lượt như sau: txtItem, btnAdd, listItems.   Bướ c 2: Viết trong activity Main.java, sử dụng custom listview vừa tạo ở trên.

  Bướ c 3: tạo một menu bằng đoạn code sau, trướ c khi tạo một menu làm theo

hình sau:

2-23

 public  boolean onCreateOptionsMenu(Menu menu)

<resources> 

<string name="hello">Hello World, Main!</string> <string name="app_name">Ví dụ về ListView</string> <string name="str_btnAdd">Thêm</string> 

</resources>

ArrayList<String> arr = new ArrayList<String>();ArrayAdapter<String> aa;

String flower[]={"Hoa Lan","Hoa Huệ","Hoa Hồng"};String animal[]={"Voi","Sư tử","Hổ"};String currentMenu;@Override 

 public  void  onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);btnAdd = (Button) findViewById(R.id.btnAdd );txtItem = (EditText) findViewById(R.id.txtItem);listItems = (ListView) findViewById(R.id.listItems);

txtItem.setOnKeyListener(this);btnAdd.setOnClickListener( this);arr = new ArrayList<String>();

//doan code su dung customlistview aa = new ArrayAdapter<String>(this,R.layout.customlistview ,arr);

listItems.setAdapter(aa);} 

8/4/2019 Bao Cao Lap Trinh Android_final

http://slidepdf.com/reader/full/bao-cao-lap-trinh-androidfinal 36/82

Tìm hiể u l ậ p trình trên Android 

SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 36

{

super.onCreateOptionsMenu(menu);MenuItem item;item = menu.add("Xóa");item.setIcon(R.drawable.delete);

item = menu.add("Động vật");item.setIcon(R.drawable.animal);item = menu.add("Hoa");item.setIcon(R.drawable.flower );return true;

}

 public  boolean onOptionsItemSelected(MenuItem item){

super.onOptionsItemSelected(item);if (item.hasSubMenu()==false) {

if (item.getTitle().toString() == "Động vật") {currentMenu = "Animal";this.displayPopup("Chọn con vật nào?",

this.animal); }if (item.getTitle().toString() == "Hoa") {

currentMenu = "Flower";this.displayPopup("Chọn hoa nào?",

this.flower);}if (item.getTitle().toString() == "Xóa") {

int index =listItems.getSelectedItemPosition();

this.deleteItem(index);}

}

return true;} 

  Bướ c 4: viết thêm các hàm xử lý sự kiện:

 public  boolean onKey(View v, int keyCode, KeyEvent event) {if (event.getAction() == KeyEvent.ACTION_DOWN  &&

keyCode == KeyEvent.KEYCODE_DPAD_CENTER) {addItem(txtItem.getText().toString());return true;

}return false;

}

@Override  public  void  onClick(View v) {

if (v == btnAdd) {addItem(txtItem.getText().toString());

}}@Override  public  void  onClick(DialogInterface dialog, int i) {

if (currentMenu=="Animal") {this.addItem(animal[i]);

}if (currentMenu=="Flower") {

this.addItem(flower[i]);

}} 

8/4/2019 Bao Cao Lap Trinh Android_final

http://slidepdf.com/reader/full/bao-cao-lap-trinh-androidfinal 37/82

Tìm hiể u l ậ p trình trên Android 

SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 37

  Bướ c 5: và cuối cùng chúng ta sẽ thêm các hàm

 private  void  deleteItem(int index){

if (index>=0) {

String itemName = (String)listItems.getItemAtPosition(index);

arr.remove(index);aa.notifyDataSetChanged();//hiện câu thông báo mờ khi xóa 1 item Toast.makeText(getApplicationContext(), itemName + " đã

được xóa", Toast.LENGTH_SHORT ).show();

}} private  void  displayPopup(String title, String [] item)

{Builder builder = new AlertDialog.Builder(this);

builder.setTitle(title);builder.setItems(item, this);builder.show();

} public  void  addItem(String item)

{if (item.length()>0) {

arr.add(item);aa.notifyDataSetChanged();txtItem.setText("");//hiện câu thông báo mờ khi thêm 1 item vào Toast.makeText(getApplicationContext(), item + " đã

thêm", Toast.LENGTH_SHORT ).show();

}

  Bướ c 6: Chạy chương trình và kết quả như sau: 

2-24

8/4/2019 Bao Cao Lap Trinh Android_final

http://slidepdf.com/reader/full/bao-cao-lap-trinh-androidfinal 38/82

8/4/2019 Bao Cao Lap Trinh Android_final

http://slidepdf.com/reader/full/bao-cao-lap-trinh-androidfinal 39/82

Tìm hiể u l ậ p trình trên Android 

SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 39

4-3 

  Tự định nghĩa action: 

Về nguyên tắc chúng ta có thể đặt tên action của một intent là bất cứ thứ gì theo

chuẩn đặt tên thông thườ ng, hay thậm chí dùng luôn hằng action đã định nghĩa sẵn

như ACTION_VIEW (hay “Android.intent.action.VIEW”). Cái tên VIEW thực chất

chỉ là một tên gợ i tả, chúng ta có thể dùng nó vớ i mục đích thực hiện một activity

để  … gửi mail! Tuy nhiên điều đó rõ ràng là rất “ngớ  ngẩn”. Thay vào đó ta hãy

dùng ACTION_SEND hay ACTION_SENDTO.

Việc đặt tên action cho intent đúng tên gợ i tả còn có một ý nghĩa khác đó là app

của chúng ta có thể đượ c triệu gọi từ một app khác. Ví dụ chúng ta viết một app có

activity đáp ứng intent ACTION_SEND và để chia sẻ một bức ảnh lên trang web

của chúng ta (giống như ta làm với Facebook, Flickr etc.) Khi đó có thể app của

chúng ta sẽ là một lựa chọn chia sẻ ảnh của người dùng điện thoại.

Sử d ụng Intents khởi động cho Activities:4.1.2

Phổ biến nhất trong Intents là việc liên k ết dữ liệu giữa các thành phần

ứng dụng, Intents được dùng để bắt đầu, dừng lại và chuyển tiếp giữa các

Activities trong ứng dụng.

Để mở  một ứng dụng khác trong một ứng dụng có sẵn thì chúng ta gọi

startActivity như sau: startActivity(myIntent);

Để theo dõi thông tin phản hồi từ   phương thức mở  ta sử dụng phương

thức : startActivityForResult(Intent)  

8/4/2019 Bao Cao Lap Trinh Android_final

http://slidepdf.com/reader/full/bao-cao-lap-trinh-androidfinal 40/82

Tìm hiể u l ậ p trình trên Android 

SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 40

4-4 

 Intent không tườ ng minh thự c thi Activity: 4.1.3

  Trong trườ ng hợ p này intent không chỉ định một lớ p cụ thể mà thay vào

đó dùng các dữ liệu khác (action, data, type, etc.) và để hệ thống tự quyết định

xem lớ p nào (app nào) sẽ thích hợp để đáp ứng intent đó. 

Thông tin action và category của activity trong một app đáp ứng intent

đó phải đượ c khai báo trong Manifest của app (AndroidManifest.xml) dướ i

dạng Intent-filter (tất nhiên nếu chúng ta muốn gọi một built-in action thì ta

không cần quan tâm đến vấn đề này).

Ví d ụ: chúng ta muốn cho phép ngườ i dùng thực hiện cuộc gọi từ một

ứng dụng, hơn là thực hiện quay số mớ i, chúng ta có thể sử dụng một ý

định ngầm yêu cầu hành động ("quay số") đượ c thực hiện trên một điện thoại

như trong đoạn mã dưới đây:

if (somethingWeird && itDontLookGood)

{

 Intent intent =newIntent(Intent.ACT  ION_DIAL,Uri.parse(“tel:555 -2368”)); 

startActivity(intent);

 }

 Intent tườ ng minh thự c thi Activity 4.1.4

  Như đã trình bày ở phần trên, intent có thể dùng thuộc tính phụ 

component để chỉ định đích danh tên lớ p sẽ thực thi Activity. Để thực hiện điều

này, lớ p Intent cung cấp các hàm đó là setComponent(ComponentName) và

setClass(Context, Class) và setClassName(Context, String)

setClassName(String, String).Chỉ được dùng để gọi các Activities trong cùng một app

8/4/2019 Bao Cao Lap Trinh Android_final

http://slidepdf.com/reader/full/bao-cao-lap-trinh-androidfinal 41/82

Tìm hiể u l ậ p trình trên Android 

SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 41

Intent intent = new Intent();intent.setClassName("ten_package", "ten_lop_ben_trong_package");

startActivity(intent);

Sử d ụng Intents gửi đi thông điệ p ra ngoài ứ ng d ụng hoặ c Activity:4.1.5

Là một cơ chế truyền tin cấp hệ thống, có khả năng gửi tin đến một tiến

trình. Chúng ta có thể sử dụng Broadcast Receivers để nhận, để trả lờ i hoặc

 phát đi các dữ liệu mà chúng ta muốn.

Broadcast Intent dùng để thông báo cho các ứng dụng khác các sự kiện

của hệ thống hay ứng dụng, mở  ra các mô hình lập trình hướ ng sự kiện giữa

các ứng dụng. Broadcast Intent giúp cho ứng dụng của chúng ta cở i mở  hơn bở i

vì nó phát đi một sự kiện bằng cách sử dụng Intent.

4.1.5.1 Cách thực hiện gửi dữ liệu dùng Intent trong Activity:

Broadcast Intent thực tế  khá đơn giản, trong các thành phần ứng dụng

của chúng ta, chúng ta xây dựng một Intent mà chúng ta muốn quảng bá bằng

cách sử dụng sentBroadcast để gửi đi. 

Ví dụ : Intent intent = new Intent(NEW_LIFEFORM_DETECTED);

intent.putExtra(“lifeformName”, lifeformType); intent.putExtra(“longitude”, currentLongitude); intent .putExtra(“latitude”, currentLatitude); sendBroadcast(intent);

4.1.5.2 Nhận dữ liệu vớ i Broadcast Receiver:

BroadcastReceivers được dùng để nhận dữ liệu từ Broadcast Intents, để 

kích hoạt BroadcastReceivers thì nó cần phải được đăng ký hoăc khai trong

code hoặc trong Mainifest và chúng ta cần phải sử dụng Intents Filter để xác

định Intent đượ c phép gửi dữ liệu đến.

Ví dụ: khở i tạo mớ i một BroadcastReceivers .

import Android.content.BroadcastReceiver;

import Android.content.Context;

import Android.content.Intent;

 public class MyBroadcastReceiver extends BroadcastReceiver {

@Override

 public void onReceive(Context context, Intent intent) { //TODO: React to the Intent received.

8/4/2019 Bao Cao Lap Trinh Android_final

http://slidepdf.com/reader/full/bao-cao-lap-trinh-androidfinal 42/82

Tìm hiể u l ậ p trình trên Android 

SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 42

 }

 }

Thông thườ ng thì BroadcastReceivers sẽ cập nhật nội dung, khở i

động dịch vụ , cập nhật ngườ i dùng cuối, hoặc thông báo ngườ i sử dụng

bằng cách sử dụng quản lý Notification Manager.

Ví dụ  đoan code sau đây cho thấy cách đăng ký

BroadcastReceivers trong code hoặc trong Mainifest.

 public class LifeformDetectedBroadcastReceiver extends BroadcastReceiver {

 public static final String BURN=“com.paad.alien.action.BURN_IT_WITH_FIRE”;  

@Override public void onReceive(Context context, Intent intent) {

 // Get the lifeform details from the intent.Uri data = intent.getData();String type = intent.getStringExtra(“type”); double lat = intent.getDoubleExtra(“latitude”, 0);  

double lng = intent.getDoubleExtra(“longitude”, 0);  Location loc = new Location(“gps”); 

loc.setLatitude(lat);

loc.setLongitude(lng);if (type.equals(“alien”)) {  

 Intent startIntent = new Intent(BURN, data);

 startIntent.putExtra(“latitude”, lat);   startIntent.putExtra(“longitude”, lng);  context.startActivity(startIntent);

 } }

 } 

  Đăg ký Broadcast Receivers trong file Manifest:<receiver Android:name =

”.LifeformDetectedBroadcastReceiver” >

<intent-filter>

<action Android:name =

”com.paad.action.NEW_LIFEFORM”/>  </intent-filter>

</receiver> 

  Đăg ký Broadcast Receivers sử dụng code: // t ạo và đăng ký broadcast receiver.

 IntentFilter filter = new

 IntentFilter(NEW_LIFEFORM_DETECTED);

 LifeformDetectedBroadcastReceiver r = new

 LifeformDetectedBroadcastReceiver();registerReceiver(r, filter); 

8/4/2019 Bao Cao Lap Trinh Android_final

http://slidepdf.com/reader/full/bao-cao-lap-trinh-androidfinal 43/82

Tìm hiể u l ậ p trình trên Android 

SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 43

4.2  GIỚ I THIỆU ADAPTERS:

Adapter là cầu nối để liên k ết dữ liệu vớ i giao diện ngườ i dùng..

Một số Adapter :4.2.1

  Để sử dụng đượ c Adapter ta phải k ế thừa lớ p trừu tượ ng AdapterView,

và chúng ta cũng có thể tạo ra một Adapter tùy ý bằng cách này.

 ArrayAdapter : là một lớ p chung để gắn các Adapter Views vào một

mảng đối tượ ng, theo mặc định thì ArrayAdapter liên k ết cá giá trị toString của

từng đối tượ ng ra TextView trong layout, chúng ta có thể thay thế TextView

bằng các điều khiển khác phức tạp hơn bằng cách sử dụng k ỹ thuật Overriding

  phương thức getView()

SimpleCursorAdapter   : dùng để liên k ết các View vớ i con trỏ để trả về 

câu truy vấn cho Content Provider, nó được định nghĩa trong file XML layout

và liên k ết các giá trị ràng buộc bên trong mỗi cột k ết quả vớ i View trong

layout.

Sử d ụng Adapter hiể n thị d ữ liệu:4.2.2

  Để áp dụng một Adapter đến một class AdapterView ta chỉ cần gọi

  phương thức setAdapter của View đưa vào trong tập Adapter đượ c minh họa

trong đoạn code sau:

 ArrayList<String> myStringArray = new ArrayList<String>();

  ArrayAdapter<String> myAdapterInstance;

int layoutID = Android.R.layout.simple_list_item_1;myAdapterInstance = new ArrayAdapter<String>

(this, layotID,myStringArray);myListView.setAdapter(myAdapterInstance);

SimpleCursorAdapter cho phép chúng ta load dữ liệu từ Cursor đến List

View. SimpleCursorAdapter đượ c tạo ra bằng cách truyền vào các tham số bối

cảnh(context) hiện hành, một layout, một Cursor và hai giá trị: tên các cột và

một mảng các giá trị chứa dữ liệu cột để hiển thị:String uriString = “content://contacts/people/”; 

Cursor myCursor = managedQuery(Uri.parse(uriString), null, null, null, null) ;

String[] fromColumns = new String[] {People.NUMBER, People.NAME};

int[] toLayoutIDs = new int[] { R.id.nameTextView, R.id.numberTextView};

SimpleCursorAdapter myAdapter;

myAdapter = new SimpleCursorAdapter(this,R.layout.simplecursorlayout,

myCursor, fromColumns,

8/4/2019 Bao Cao Lap Trinh Android_final

http://slidepdf.com/reader/full/bao-cao-lap-trinh-androidfinal 44/82

Tìm hiể u l ậ p trình trên Android 

SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 44

toLayoutIDs);

myListView.setAdapter(myAdapter);

4.3  VÍ DỤ SỬ DỤNG INTENT ĐỂ LIÊN LẠC GIỮ A CÁC ACTIVITY:

Chúng ta có 2 lớ p Activity: Activity1 và Activity2. Thiết lập 2 layout cho 2

Activities trên ứng vớ i mỗi lớ p trên sẽ có layout tuần tự sau: activity1.xml,

activity2.xml.

4-5

Tiếp theo đăng ký trong Manifest: <activity Android:name="com.IntentsDemo.Activity1" 

Android:label="@string/app_name"> 

<intent-filter> 

<action Android:name="Android.intent.action.MAIN"   /> <category Android:name="Android.intent.category.LAUNCHER"   /> 

</ intent-filter> 

</ activity> 

<activity Android:name="com.IntentsDemo.Activity2" Android:label="@string/app_name"> 

<intent-filter> 

<action Android:name="Calculator"></ action> <category Android:name="Android.intent.category.DEFAULT"  /> 

</ intent-filter> 

</ activity>

Trong Activity1.java: xử lý 2 sự kiện, nhận về giá trị đượ c gửi từ Activity2, gọi và

truyền giá trị vào Activity2.

-  Hàm xử lý khi click Button:

 //xử lý button đượ c nhấn @Override 

public void onClick(View v) {

 // Tạo intent mớ i và đặt action = "Calculate" Intent intent = new Intent();intent.setAction("Calculator");

 //tự sát activity(có nghĩa là k ết thúc nó rồi đấy)  //finish(); 

-  Hàm nhận giá trị: 

8/4/2019 Bao Cao Lap Trinh Android_final

http://slidepdf.com/reader/full/bao-cao-lap-trinh-androidfinal 45/82

Tìm hiể u l ậ p trình trên Android 

SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 45

 //xử lý k ết quả trả về từ Activity Result @Override 

protected void onActivityResult(int requestCode, int resultCode, Intent data) { // đúng pass không if (requestCode != INTENT_REQUEST_CODE ) {

txtNum1.setText("");txtNum2.setText("");return;

} //nếu đúng là intent từ Activity Result 

else if (resultCode == RESULT_OK ){ //Lấy k ết quả đượ c trả về 

String strNum1 = data.getStringExtra("sA");String strNum2 = data.getStringExtra("sB");

 //Thiết lập giá trị mớ i cho 2 EditboxtxtNum1.setText(strNum1);

txtNum2.setText(strNum2);}else if (resultCode == RESULT_CANCELED ){

txtNum1.setText("0");txtNum2.setText("0");

}}

Trong Activity2: xử lý 2 sự kiện, nhận về giá trị đượ c gửi từ Activity1, gọi và truyền

giá trị vào Activity1.

Hàm xử lý khi click Button:@Override 

public void onClick(View v) {Intent returnResult = new Intent("Calculator");

 // Lấy dữ liệu sau khi đã tính toán String strMul = txtMul.getText().toString();String strSum = txtSum.getText().toString();

 // �?ưa dữ liệu vào Extras của intent returnResult.putExtra("sA", strSum);returnResult.putExtra("sB", strMul); // Kiểm tra dữ liệu, nếu rỗng thì gửi mã CANCEL 

 // ,nếu không gửi mã OK và intent chứa k ết quả if (strSum.equals("") || strMul.equals(""))setResult( RESULT_CANCELED ,returnResult);

else setResult( RESULT_OK ,returnResult);

 // Thông báo k ết thúc Activity finish();

}

-  Hàm nhận giá trị: trong onCreate() 

 // Lấy dữ liệu gửi từ Activity 1 qua intent String strA = getIntent().getStringExtra("A");String strB = getIntent().getStringExtra("B"); // Tính toán vớ i dữ liệu int A = Integer. parseInt (strA);

8/4/2019 Bao Cao Lap Trinh Android_final

http://slidepdf.com/reader/full/bao-cao-lap-trinh-androidfinal 46/82

Tìm hiể u l ậ p trình trên Android 

SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 46

int B = Integer. parseInt (strB);int sum = A+B; strA = Integer.toString(sum);int mul = A*B; strB = Integer.toString(mul); // lưu k ết quả ra màn hình txtSum.setText(strA);txtMul.setText(strB); //xử lý nút Reset btnReset.setOnClickListener(new View.OnClickListener() {

@Override public void onClick(View v) {

Intent returnCancel = new Intent("Calculator");setResult( RESULT_CANCELED ,returnCancel);finish();

}}); 

Chạy chương trình ta đượ c:

4-6 Kết quả Demo Intents

.

4.4  KỸ THUẬT LƯU TRỮ DỮ LIỆU TRONG ANDROID 

Các k ỹ thuật duy trì dữ liệu trong Android nhanh chóng, gọn nhẹ, hiệu quả và

mạnh mẽ:

  Shared Preferences: Khi muốn lưu trữ UI state ,user preferences hay

application setting, chúng ta muốn có một cơ chế gọn nhẹ để lưu trữ một

tập hợ p các giá trị đượ c biết đến, Shared Preferences cho phép chúng ta

lưu trữ nhóm của key/value của dữ liệu gốc.

  Files: Android cho phép tạo và tải các tập tin trên thiết bị di động.

  SQLite Databases: quản lý cấu trúc dữ liệu là cách tốt nhất . Android

cung cấp thư viện quan hệ  cơ sở  dữ liệu SQLite, mỗi ứng dụng có thể 

tạo ra một cơ sở dữ liệu của mình để nó kiểm soát hoàn toàn trên đó. 

  Content Providers: Thay vì theo cơ chế lưu trữ riêng ,Content Providers

cung cấp nội dung cho phép đưa ra một giao diện để sử dụng và chia sẻ 

8/4/2019 Bao Cao Lap Trinh Android_final

http://slidepdf.com/reader/full/bao-cao-lap-trinh-androidfinal 47/82

Tìm hiể u l ậ p trình trên Android 

SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 47

dữ liệu cá nhân. Chúng ta có thể truy cập Content Providers để sử dụng

hệ thống đượ c phép.

4.5  LƯU TRỮ DỮ LIỆU Ứ NG DỤNG MỘT CÁC ĐƠN GIẢN:Có hai cơ chế  để  lưu dữ liêu trong Android là lưu theo kiểu name/value hoặc

key/value.

T ạo và lưu dữ liệu vớ i Share Preferences:4.5.1

  Để tạo hoăc sửa đổi dữ liệu dùng Shared Preferences chúng ta gọi hàm

getSharedPreferences trong ứng dụng Context,đưa vào tên Shared Preferences

muốn thay đổi, Shared Preferences sẽ chia sẻ giữa các thành phần dữ liệu trong

ứng dụng hiện sử dụng nó nhưng không có sẵn trong ứng dụng khác.

Để sửa đổi Shared Preferences Chúng ta gọi lớ p Shared

Preferences.Editor, nhận đối tượ ng Editor bằng cách gọi edit trong đối tượ ng

ShardePreferences muốn thay đổi. Để sửa, lưu gọi commit trên Editor,như doạn

code sau:

 public static final String MYPREFS = “mySharedPreferences”;  

 protected void savePreferences(){ // t ạo đối tượng lưu trữ và truy xuấ t d ữ liệu shared preference

int mode = Activity.MODE_PRIVATE;

SharedPreferences mySharedPreferences = getSharedPreferences(MYPREFS,

mode);

 // nhận về một editor để sửa đổ i shared preferences.

SharedPreferences.Editor editor = mySharedPreferences.edit();

 // lưu trữ vào . shared preference

editor.putBoolean(“isTrue”, true); ed itor.putFloat(“lastFloat”, 1f); editor.putInt(“wholeNumber”, 2); 

editor.putLong(“aNumber”, 3l); editor.putString(“textEntryValue”, “Not Empty”); 

 // Commit the changes.

editor.commit();

 }

Truy xuấ t Shared Preferences4.5.2

  Để  lưu truy cập Shared Preferences thì cũng dùng phương thức

getSharedPreferences ,đưa vào tên của Shared Preferences mà Chúng ta muốn

truy cập, dùng phương thức type-safe get<type> để trích xuất các giá trị lưu. 

8/4/2019 Bao Cao Lap Trinh Android_final

http://slidepdf.com/reader/full/bao-cao-lap-trinh-androidfinal 48/82

Tìm hiể u l ậ p trình trên Android 

SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 48

Ví Dụ:

 public void loadPreferences() {

 // lấ  y về  đối tượ ng Shared Preferences

int mode = Activity.MODE_PRIVATE;

SharedPreferences mySharedPreferences =

getSharedPreferences(MYPREFS,

mode);

 // nhận giá tr ị boolean isTrue = mySharedPreferences.getBoolean(“isTrue”, false);  float lastFloat = mySharedPreferences.getFloat(“lastFloat”, 0f);  

int wholeNumber = mySharedPreferences.getInt(“wholeNumber”, 1);  

long aNumber = mySharedPreferences.getLong(“aNumber”, 0); String stringPreference;

 stringPreference = mySharedPreferences.getString(“textEntryValue”,“”);  }

4.5.2.1 Lưu trữ trạng thái Activity

Nếu muốn lưu thông tin Activity mà không cần phải chia sẻ vớ i các thành phần

khác , Chúng ta có thể gọi Activity.getPreferences(); mà không cần phải chỉ  định

preferences name.  Việc truy xuất tớ i SharedPreferences bị giớ i hạn trong phạm vi một

Activity, mổi Actitvity chỉ hỗ trợ một SharedPreferences không được đặt tên.

Ví d ụ dùng Activity Shared Preferences: protected void saveActivityPreferences(){

 // t ạo đối tượng lưu trữ và truy xuấ t d ữ liệu shared preference

SharedPreferences activityPreferences =

getPreferences(Activity.MODE_PRIVATE);

 // Retrieve an editor to modify the shared preferences.

SharedPreferences.Editor editor = activityPreferences.edit();

 //lấ  y ID text view

TextView myTextView = (TextView)findViewById(R.id.myTextView);

 // // nhậ p giá tr ị mới vào đố i tượ ng Shared Preferences 

.editor.putString(“currentTextValue”,  

myTextView.getText().toString());

 // áp d ụng thay đổ ieditor.commit();

 }

4.5.2.2 Lưu trữ và phục hồi trạng thái thể hiện:

Bằng cách overriding sự kiện onSaveInstanceState của Activity, Chúng ta có

thể dùng tham số Bundle để  lưu trữ các giá trị. Lưu trữ các giá trị này ta dùng phương

8/4/2019 Bao Cao Lap Trinh Android_final

http://slidepdf.com/reader/full/bao-cao-lap-trinh-androidfinal 49/82

Tìm hiể u l ậ p trình trên Android 

SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 49

thức get() and put() như đã giớ i thiệu ở   trên trước khi đưa vào xử lý Bundle trong lớ p

cha. 

Ví dụ thể hiện ở  đoạn code sau:

 private static f inal String TEXTVIEW_STATE_KEY =

“TEXTVIEW_STATE_KEY”; @Override

 public void onSaveInstanceState(Bundle outState) {

TextView myTextView = (TextView)findViewById(R.id.myTextView);

 // lưu trạng thái thể hiện của textview

outState.putString(TEXTVIEW_STATE_KEY,

myTextView.getText().toString());

super.onSaveInstanceState(outState);

 }

Các Bundle lưu truyền trong các phương thức onRestoreInstanceState và

onCreate nếu ứng dụng bắt buộc phải khởi động lại trong các session,đoạn code sau

đây sẽ cho thấy làm thế  nào để trích xuất giá trị từ Bundle và sử dụng chúng để cập

nhật trạng thái Activity.

@Override

 public void onCreate(Bundle icicle) {

super.onCreate(icicle);

setContentView(R.layout.main);TextView myTextView = (TextView)findViewById(R.id.myTextView);

String text = “”; if (icicle != null && icicle.containsKey(TEXTVIEW_STATE_KEY))

text = icicle.getString(TEXTVIEW_STATE_KEY);

myTextView.setText(text);

 } 

4.6  LƯU VÀ ĐỌC CÁC TẬP TIN TRONG ANDROID:

Cũng như các tiêu chuẩn java I/O các lớp và phương thức trong Android cũngcung cấp openFileInput và openFileOutput để  đơn giản hóa việc đọc và viết từ những

dòng và từ local file, như đoạn code dưới đây: 

String FILE_NAME = “tempfile.tmp”; 

 //mở  một file mớ i

FileOutputStream fos = openFileOutput(FILE_NAME,

Context.MODE_PRIVATE);

// đọc file.FileInputStream fis = openFileInput(FILE_NAME);

8/4/2019 Bao Cao Lap Trinh Android_final

http://slidepdf.com/reader/full/bao-cao-lap-trinh-androidfinal 50/82

Tìm hiể u l ậ p trình trên Android 

SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 50

 Nhưng phương pháp này chỉ hộ trợ các tập tin trong các thư mục ứng dụng hiện

hành.

Nếu tập tin chúng ta chỉ  định khi tạo một FileOutputStream không tồn tại, thì

Android sẽ tạo nó cho chúng ta, để thêm một tập tin hiện có thì xác định cơ chế 

Context.MODE_APPEND.

Theo mặc định, các tập tin đượ c tạo ra bằng cách gọi phương thức

openFileOutput để gọi tớ i một ứng dụng khác, ngoài ra chúng ta có thể chỉ định một

Context.MODE_WORD_READABLE hoặc Context.MODE_WORD _WRITEABLE

khi tạo ra mộ tập tin có sẵn trong các ứng dụng như trong đoạn code sau:

String OUTPUT_FILE = “publicCopy.txt”; FileOutputStream fos = openFileOutput(OUTPUT_FILE,

Context.MODE_WORLD_WRITEABLE);

Truy xuấ t các t ậ p tin trong Resources:4.6.1

Nếu ứng dụng của chúng ta đòi hỏi nguồn tài nguyên từ tập tin bên ngoài chúng

ta có thể gộp chúng trong gói res/raw trong project của chúng ta.

Để chỉ  đọc các tập tin gốc chúng ta gọi phương thức openRawResource từ 

nguồn ứng dụng, để nhận đượ c một InputStream dựa trên các quy định nguồn, đưavào một filename là tên biến từ lớp R.raw như sau: 

 Resources myResources = getResources();

  InputStream myFile = myResources.openRawResource(R.raw.<tên file>);

Các công cụ quản lý t ậ p tin4.6.2

Android cung cấp một số công cụ quản lý tập tin cơ bản để giúp quản

lý hệ thống tập tin.Trong số những tiện ích này nằm trong gói java.io.File .

  deleteFile: xóa tập tin đượ c tạo bở i ứng dụng hiện hành.

  fileList: trả về mảng các tập tin đượ c tạo bở i ứng dụng hiện hành.

4.7  CƠ SỞ DỮ LIỆU TRONG ANDROID 

Android cung cấp đầy đủ các quan hệ cơ sở dữ liệu thông qua thư viên SQLite

mà không áp đặt bất k ỳ hạn chế nào. Sử dụng SQLite có thể tạo cơ sở dữ liệu quan hệ 

độc lập cho mỗi ứng dụng.

8/4/2019 Bao Cao Lap Trinh Android_final

http://slidepdf.com/reader/full/bao-cao-lap-trinh-androidfinal 51/82

Tìm hiể u l ậ p trình trên Android 

SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 51

Tất cả  các cơ sở  dữ liệu trong Android được lưu trong thư mục

 /data/data/<package_name>/databases để chia sẻ  cơ sở  dữ liệu qua các ứng dụng ta

dùng Context Provider( như ở phần sau):

Những phần sau đây sẽ tập chung vào tính thiết thực của việc tạo và quản lý cơ 

sở dữ liệu SQLite trong Android.

Giớ i thiệu SQLite:4.7.1

SQLite là hệ thống quản lý các quan hệ cơ sở dữ liệu (RDBMS), nó cũng

đượ c coi là:

  Mã nguồn mở  

  Tiêu chuẩn

  Gọn nhẹ 

  Đơn lớ p

Cursors và Content Values:4.7.2

Content Values là một đối tượ ng sử dụng để chèn các dòng mớ i vào

bảng cơ sở dữ liệu, mỗi đối tượng Content Values đại diện giá trị cho một dòng.

Truy vấn trong Android đượ c trả về là đối tượ ng Cursor. Thay vì giải

nén và trả lại một bản sao của các giá trị k ết quả, Cursors hành động như con

trỏ đến một tập hợ p các dữ liệu nằm bên dướ i. Cursor quản lý việc kiểm soát vị 

trí (row) trong tập k ết quả truy vấn cơ sở dữ liệu.

Các lớ p con trỏ bao gồm một số chức năng để điều hướ ng k ết quả truy

vấn bao gồm, nhưng không giớ i hạn, những điều sau đây: 

  moveToFirst :chuyển con trỏ tới dòng đầu tiên  moveToNext : chuyển con trỏ tớ i dòng tiếp theo.

  moveToPrevious : chuyển con trỏ tớ i dòng duyệt trước đó. 

  getCount :trả về số dòng của k ết quả truy vấn.

  getColumnIndexOrThrow: trả về chỉ số của cột xác định

  getColumnName: trả về tên của cột có chỉ số truyền vào

  getColumnNames: trả về mảng tên các cột

  moveToPosition: đưa con trỏ đến dòng xác định.

 getPosition: trả về vị trí con trỏ 

8/4/2019 Bao Cao Lap Trinh Android_final

http://slidepdf.com/reader/full/bao-cao-lap-trinh-androidfinal 52/82

Tìm hiể u l ậ p trình trên Android 

SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 52

Khi muốn bắt đầu vòng đờ i hoạt động của Cursor thì gọi phương thức

:startManagingCursor vào k ết thúc vòng đờ i con trỏ thì gọi

:stopManagingCursor.

Sử dụng SQLiteOpenHelper:4.7.3

SQLiteOpentHelper là một lớ p trừu tượng và là môi trườ ng tốt để tạo,

truy xuất và cập nhật cở  sở  dữ liệu.Gọi getReadableDatabases hoặc

getWriteableDatabases để mở  hoặc trả về dữ liệu trong trườ ng hợp đọc/ghi

trong cơ sở dữ liệu như sau: 

dbHelper = new myDbHelper(context, DATABASE_NAME, null,

 DATABASE_VERSION);SQLiteDatabase db;

try {

db = dbHelper.getWritableDatabase();

 }

catch (SQLiteException ex){

db = dbHelper.getReadableDatabase();

 }

Truy xuấ t và t ạo Cơ sở d ữ liệu không dùng SQLiteHelper:4.7.4

Chúng ta có thể  truy xuất đế n cơ sở dữ liệu mà không cần sử dụng lớ p

SQLiteHelper với phương thức openorCreateDatabases trong ứng dụng Context

như sau: 

 private static final String DATABASE_NAME = “myDatabase.db”;  private static final String DATABASE  _TABLE = “mainTable”; 

 private static final String DATABASE_CREATE =

“create table “ + DATABASE_TABLE + 

“ ( _id integer primary key autoincrement,” + 

“column_one text not null);”; SQLiteDatabase myDatabase;

 private void createDatabase() {

myDatabase = openOrCreateDatabase(DATABASE_NAME,

Context.MODE_PRIVATE, null);

myDatabase.execSQL(DATABASE_CREATE);

 }

Truy vấn cơ sở d ữ liệu4.7.5

  Ví Dụ:  // tr ả về t ấ t cả các cột 1,3 và ID

8/4/2019 Bao Cao Lap Trinh Android_final

http://slidepdf.com/reader/full/bao-cao-lap-trinh-androidfinal 53/82

Tìm hiể u l ậ p trình trên Android 

SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 53

String[] result_columns = new String[] {KEY_ID, KEY_COL1, KEY_COL3};

Cursor allRows = myDatabase.query(true, DATABASE_TABLE,

result_columns,

null, null, null, null, null, null);

 //tr ả về t ấ t các cột vớ i cột 3 có giá tr ị định sẵ n // sắ  p xế  p theo cột 5

String where = KEY_COL3 + “=” + requiredValue; 

String order = KEY_COL5;

Cursor myResult = myDatabase.query(DATABASE_TABLE, null, where,

null, null, null, order);

 Lấ  y k ế t quả t ừ Cursors4.7.6

  Ví dụ:

int GOLD_HOARDED_COLUMN = 2;

Cursor myGold = myDatabase.query(“GoldHoards”, null, null, null,null,

null, null);

 float totalHoard = 0f;

if (myGold.moveToFirst()) {

do {

 float hoard =

myGold.getFloat(GOLD_HOARDED_COLUMN);totalHoard += hoard;

 } while(myGold.moveToNext());

 }

 float averageHoard = totalHoard / myGold.getCount();

Thêm, cậ p nh ật và xóa dòng:4.7.7

  Thêm:

ContentValues newValues = new ContentValues();

 //đư a giữ liệu vào content newValues.put(COLUMN_NAME, newValue);

[ ... các cột khác tương tự ... ] // thêm vào CSDL

myDatabase.insert(DATABASE_TABLE, null, newValues);

  Cập nhật:

ContentValues updatedValues = new ContentValues();

 // đưa giữ liệu vào content 

updatedValues.put(COLUMN_NAME, newValue);

8/4/2019 Bao Cao Lap Trinh Android_final

http://slidepdf.com/reader/full/bao-cao-lap-trinh-androidfinal 54/82

Tìm hiể u l ậ p trình trên Android 

SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 54

[ ... các cột khác tương tự ... ]String where = KEY_ID + “=” + rowId;  

 // cậ p nhật.

myDatabase.update(DATABASE_TABLE, updatedValues, where,null);

  Xóa dòng:

myDatabase.delete(DATABASE_TABLE, KEY_ID + “=” +

rowId, null);

Thao tác trên cơ sở d ữ liệu Android 4.7.8

import Android.content.Context;

import Android.database.*;

import Android.database.sqlite.*;import Android.database.sqlite.SQLiteDatabase.CursorFactory;

import Android.util.Log;

 public class MyDBAdapter {

 private static final String DATABASE_NAME = “myDatabase.db”;  private static final String DATABASE_TABLE = “mainTable”; 

 private static final int DATABASE_VERSION = 1;

 // khóa chính.

 public static final String KEY_ID=”_id”;  // tên và chỉ só cột.

 public static final String KEY_NAME=”name”;  public static final int NAME_COLUMN = 1;

 // TODO: Create public field for each column in your table.

 // câu SQL t ạo bảng

 private static final String DATABASE_CREATE = “create table “ +  

 DATABASE_TABLE + “ (“ + KEY_ID + 

“ integer primary key autoincrement, “ +  

 KEY_NAME + “ text not null);”;  // biế n Database

 private SQLiteDatabase db;

 // áp d ụng cho ứ ng d ụng nào

 private final Context context;

  //database helper 

 private myDbHelper dbHelper;

 public MyDBAdapter(Context _context) {

context = _context;

dbHelper = new myDbHelper(context, DATABASE_NAME,

null,

 DATABASE_VERSION); }

8/4/2019 Bao Cao Lap Trinh Android_final

http://slidepdf.com/reader/full/bao-cao-lap-trinh-androidfinal 55/82

Tìm hiể u l ậ p trình trên Android 

SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 55

 public MyDBAdapter open() throws SQLException {

db = dbHelper.getWritableDatabase();

return this;

 }

 public void close() {

db.close();

 }

 public long insertEntry(MyObject _myObject) {

ContentValues contentValues = new ContentValues();

return db.insert(DATABASE_TABLE, null, contentValues);

 }

 public boolean removeEntry(long _rowIndex) {

return db.delete(DATABASE_TABLE, KEY_ID +

“=” + _rowIndex, null) > 0;  }

 public Cursor getAllEntries () {

return db.query(DATABASE_TABLE, new String[] {KEY_ID,

KEY_NAME},

null, null, null, null, null);

 }

 public MyObject getEntry(long _rowIndex) {

 MyObject objectInstance = new MyObject();

return objectInstance; }

 public int updateEntry(long _rowIndex, MyObject _myObject) {

String where = KEY_ID + “=” + _rowIndex; 

ContentValues contentValues = new ContentValues();

return db.update(DATABASE_TABLE, contentValues, where,

null);

 }

 private static class myDbHelper extends SQLiteOpenHelper {

 public myDbHelper(Context context, String name,

CursorFactory factory, int version) {

super(context, name, factory, version);

 }

 // Called when no database exists in

@Override

 public void onCreate(SQLiteDatabase _db) {

_db.execSQL(DATABASE_CREATE);

 }

 //gọi khi database có phiên bản mớ i

@Override public void onUpgrade(SQLiteDatabase _db, int _oldVersion,

8/4/2019 Bao Cao Lap Trinh Android_final

http://slidepdf.com/reader/full/bao-cao-lap-trinh-androidfinal 56/82

Tìm hiể u l ậ p trình trên Android 

SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 56

int _newVersion) {

 // Log the version upgrade.

 Log.w(“TaskDBAdapter”, “Upgrading from version “ +  

 _oldVersion + “ to “ + 

_newVersion +

“, which will destroy all old data”);  _db.execSQL(“DROP TABLE IF EXISTS “ + DATABASE_TABLE);

 //t ạo csdl mớ ionCreate(_db);

 }

 }

 }

Giớ i thiệu Content Providers4.7.9

Sử dụng Content Provider bằng lớ p ContenResolver.

ContentResolver cr = getContentResolver();

4.7.9.1 Truy vấn trong Content:

 Như trong cơ sở  dữ liệu, k ết quả tìm kiếm sẽ đượ c trả về Cursors

trong một tập k ết quả. Chúng ta có thể trích xuất các giá trị từ Cursor bằng cách

sử dụng các k ỹ thuật đượ c mô tả trước đó trong phần cơ sở  dữ liệu trên ” Lấy

k ết quả từ Cursors”: 

Content Provider có cách truy vấn hình thức rất giống vớ i các truy

vấn cơ sở dữ liệu. Sử dụng   phương pháp query trên đối tượ ng ContentResolver.

  // lấ  y t ấ t cả dòng

Cursor allRows = getContentResolver().query(MyProvider.CONTENT_URI,

null, null, null, null);

 //tr ả về t ấ t các cột vớ i cột 3 có giá tr ị định sẵ n // sắ  p xế  p theo cột 5

String where = KEY_COL3 + “=” + requiredValue; 

String order = KEY_COL5;

Cursor someRows =

getContentResolver().query(MyProvider.CONTENT_URI,null, where, null,

order);

4.7.9.2 Thêm, cập nhật và xóa dòng:

Đươc thể hiện qua các đoạn code sau:

8/4/2019 Bao Cao Lap Trinh Android_final

http://slidepdf.com/reader/full/bao-cao-lap-trinh-androidfinal 57/82

Tìm hiể u l ậ p trình trên Android 

SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 57

  Thêm :

 // tạo contentvalues

ContentValues newValues = new ContentValues();

 // cho vào csdl

newValues.put(COLUMN_NAME, newValue);

[ ... lặp lại tương tự như những cột khác ... ]

Uri myRowUri =

getContentResolver().insert(MyProvider.CONTENT_URI,

newValues);

 // tạo dòng cho việc thêm

ContentValues[] valueArray = new ContentValues[5];

int count =getContentResolver().bulkInsert(MyProvider.CONTENT_URI,

valueArray);

  Xóa:

// xóa dòng xác định

getContentResolver().delete(myRowUri, null, null);

 // xóa 5 dòng

String where = “_id < 5”; 

getContentResolver().delete(MyProvider.CONTENT_URI,

where, null);

  Cập nhật:

ContentValues newValues = new ContentValues();

newValues.put(COLUMN_NAME, newValue);

 // cập nhật cho 5 dòng

String where = “_id < 5”; 

getContentResolver().update(MyProvider.CONTENT_URI,newValues, where,

null);

4.7.9.3 Sử dụng Media Store Provider

Các Android Media Store quản lý tập tin hình ảnh, kho video, âm

thanh. Bất cứ khi nào chúng ta thêm một tập tin đa phương tiện mớ i cho hệ 

thống tập tin Android là có thể bổ sung vào Media Store để dùng cho các

ứng dụng khác.

8/4/2019 Bao Cao Lap Trinh Android_final

http://slidepdf.com/reader/full/bao-cao-lap-trinh-androidfinal 58/82

Tìm hiể u l ậ p trình trên Android 

SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 58

Lớ p MediaStore bao gồm một số   phương pháptiện lợ i để đơn giản hóa

các tập tin chèn vào Media Store. Ví dụ, đoạn mã sau đây cho thấy làm thế 

nào để chèn một hình ảnh trực tiếp vào Media Store:

 Android.provider.MediaStore.Images.Media.insertImage(

getContentResolver(),

sourceBitmap,

“my_cat_pic”, 

“Photo of my cat!”); 

4.7.9.4 Sử dụng Contacts Provider

Truy cập vào Content Provider đặc biệt mạnh mẽ trên một thiết bị truyền

thông. Android đã phơi bày tất cả các thông tin có sẵn từ các

databases địa chỉ liên hệ đến bất k ỳ ứng dụng qua READ_CONTACTS.

Trong ví dụ sau, Activity’s một con trỏ đến tất cả mọi ngườ i trong cơ sở  

dữ liệu liên lạc, tạo ra một mảng các chuỗi chứa tên của mỗi liên lạc và

số điện thoại.

 // lấ  y d ữ liệu vào cursor 

Cursor cursor = getContentResolver().query(People.CONTENT_URI,

null, null, null, null); // quản lý cursor 

startManagingCursor(cursor);

 // lấ  y chỉ số cột 

int nameIdx = cursor.getColumnIndexOrThrow(People.NAME);

int phoneIdx = cursor. getColumnIndexOrThrow(People.NUMBER);

String[] result = new String[cursor.getCount()];

if (cursor.moveToFirst())

do {

 //lấ  y tên

String name = cursor.getString(nameIdx);

 // số  điện thoại.

String phone = cursor.getString(phoneIdx);

result[cursor.getPosition()] = name + “ (“ + phone + “)”;  } while(cursor.moveToNext());

4.7.9.5 Đăng ký dử dụng Provider

Sử dụng thẻ authorities để xác định trong file XML như sau: <provider Android :name=”MyProvider”

 Android :authorities=”<lớ  p Provider đượ c khai báo trong ứ ng d ụng>” />

8/4/2019 Bao Cao Lap Trinh Android_final

http://slidepdf.com/reader/full/bao-cao-lap-trinh-androidfinal 59/82

Tìm hiể u l ậ p trình trên Android 

SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 59

4.8  MỘT Ứ NG DỤNG DEMO SỬ DỤNG CONTENTPROVIDER ĐỂ QUẢN LÝ SÁCH:

Chương trình có thể cập nhật sách, xóa và thêm sách mớ i. Hiển thị lên

ListView để  ngườ i dùng nhận thấy. Ta có thêm một lớ p BookProvider.java k ế thừa

ContentProvider để thao tác vớ i dữ liệu.

Cụ thể Code có thể tham khảo ở  CD kèm theo. Ứ ng dụng có tên là

Android_ContentProviderUserDemo.

4.9  MAPS,  GEOCODING, LOCATION BASED SERVICES 

Sử d ụng d ịch vụ định vị 4.9.1

  Location Based Services (LBS) là một thuật ngữ chung dùng để mô tả 

sự khác nhau về k ỹ thuật, và dùng để tìm vị trí thiết bị hiện hành. Hai yếu tố 

chính của LBS là:

   LocationMangager : quản lý k ết nối vớ i dịch vụ  định vị trong Android..

   LocationProvider : là một lớ p trừu tượng cơ bản của các công nghệ tìm

kiếm vị trí khác nhau để xác định vị trí thiết bị.

Sử dụng Location Manager ta có thể :

  Xác định vị trí.

  Theo dõi sự chuyển động.

  Đặt trạng thái báo động cho việc phát hiện một sự chuyển động vào

và ra khỏi một khu vực xác định.

Cài đặt trên môi trườ ng giả lậ p vớ i Test Providers4.9.2

  Dịch vụ định vị (LBS) phụ thuộc vào các thiết bị phần cứng cho việc tìm

kiếm các vị trí hiện tại. Khi phát triển và kiểm thử với các môi trườ ng giả lập,

thì phần cứng là ảo và chúng ta có thể ở trong những vị trí khá giống nhau.

Bù lại Android bao gồm các móc nối cho phép chúng ta móc nối vớ i

location Provider để thử nghiệm vớ i ứng dụng location based. 

C ậ p nh ật vị trí vớ i Emulator Location Providers4.9.3

Dùng Location Controls có sẵn từ  DDMS trong Eclipse như hình dướ i

đây để thay đổi trực tiếp vị trí trong thử nghiệm GPS_PROVIDER.

8/4/2019 Bao Cao Lap Trinh Android_final

http://slidepdf.com/reader/full/bao-cao-lap-trinh-androidfinal 60/82

Tìm hiể u l ậ p trình trên Android 

SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 60

Hinh 4-7 

Trong hình trên có các tab Manual, KML và GPX

Sử dung tab Manual chúng ta có thể xác định vĩ độ/ kinh độ.

Sử dụng tab KML và GPX cho phép chúng ta tải các tập tin KML

(Keyhole Markup Language) và GPX (GPS Exchange Format) tương ứng.

Lưu ý vị trí GPS sẽ trả về từ getLastKnownLocation sẽ không thay đổi

trừ khi có ít nhất một ứng dụng yêu cầu cập nhật vị trí. 

Chọn một Location Provider 4.9.4

  Tùy thuộc vào thiết bị mà có những k ỹ thuật riêng, Android có thể dùng

để  xác định vị trí hiện tại, mỗi k ỹ thuật, mỗi Location Provider sẽ cung cấp

những khả  năng khác nhau như xác định độ cao, tốc độ, sự chính xác hoặc các

thông tin liên quan.

Để có đượ c đối tượ ng LocationProvider ta gọi getProvider và truyền vào

tên Provider. Ví dụ dưới đây thì Provider là GPS_PROVIDER 

String providerName = LocationManager.GPS_PROVIDER; LocationProvider gpsProvider;

gpsProvider = locationManager.getProvider(providerName);

Tìm một Providers có sẵ n4.9.5

  Lớ p LocationManager bao gồm các chuỗi hằng số và trả về tên của nhà

cung cấp cho hai Location Provider phổ biến nhất.

 LocationManager.GPS_PROVIDER

 LocationManager.NETWORK_PROVIDER

8/4/2019 Bao Cao Lap Trinh Android_final

http://slidepdf.com/reader/full/bao-cao-lap-trinh-androidfinal 61/82

Tìm hiể u l ậ p trình trên Android 

SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 61

Để có danh sách tất cả tên của nhà cung cấp trên thiết bị ta gọi

getProvider,  sử dụng Boolean để biết nếu chúng ta muốn tất cả, hoặc chỉ lấy

một Provider đầu tiên.

boolean enabledOnly = true;

 List<String> providers = locationManager.getProviders(enabledOnly);  

Tìm kiế m một Provider theo tiêu chí 4.9.6

  Sử dụng lớ p Criteria để yêu cầu nhà cung cấp xử lý chính xác những số 

liệu có sẵn như: vĩ độ và kinh độ, tốc độ, độ cao, chi phí và yêu về cầu năng

lương điện.

Criteria criteria = new Criteria();criteria.setAccuracy(Criteria.ACCURACY_COARSE);

criteria.setPowerRequirement(Criteria.POWER_LOW);

criteria.setAltitudeRequired(false);

criteria.setBearingRequired(false);

criteria.setSpeedRequired(false);

criteria.setCostAllowed(true);

Chúng ta có thể dùng getBestProvider  là sự k ết hợ p tốt nhất trả  để về 

cho Location Provider hoặc dùng getProvider , sử dụng getBestProvider  nhà

cung cấp sẽ trả lại các tiêu chí tốt nhất, sử dụng Boolean cho phép hạn chế 

những k ết quả từ nhà cung cấp đang đượ c hoạt động.

String bestProvider = locationManager.getBestProvider(criteria, true);  

 List<String> matchingProviders =

locationManager.getProviders(criteria,false); 

Tìm một địa chỉ (Finding Your Location)4.9.7

  Mục đích của dịch vụ  định vị là tìm ra vị trí vật lý của thiết bị.

Để truy cập vào Location Manager thực hiện các yêu cầu

LOCATION_SERVICES ta sử dụng phương thức getSystemService như sau: 

String serviceString = Context.LOCATION_SERVICE;

 LocationManager locationManager;

locationManager = (LocationManager)getSystemService(serviceString);  

8/4/2019 Bao Cao Lap Trinh Android_final

http://slidepdf.com/reader/full/bao-cao-lap-trinh-androidfinal 62/82

Tìm hiể u l ậ p trình trên Android 

SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 62

Trướ c khi sử dụng Location Manager thì cần thêm một hoăc nhiều thẻ 

uses-permission  trong file mainfest để truy cập vào các phần cứng của LBS

trong đó bao gồm cả  fine và coarse như sau: 

<uses-permission

 Android :name=” Android .permission.ACCESS_FINE_LOCATION”/> 

<uses-permission

 Android :name=” Android.permission.ACCESS_COARS E_LOCATION”/> 

Chúng ta có thể tìm thấy vị trí bằng cách xác định một Location Provider

sử dụng phương thức getKnowLocation  và đưa vào tên của Location Provider.

Ví dụ:

String provider = LocationManager.GPS_PROVIDER;

 Location location = locationManager.getLastKnownLocation(provider);  

Theo dõi sử di chuyể n (Tracking Movement)4.9.8

  Sử dụng phương thức requestLocationUpdate để cập nhật bất k ỳ một vị 

trí, khi vị trí hiện tại thay đổi chúng ta sử dụng một  LocationListener .

 LocationListener  thực hiện và đăng ký để nhận thông tin.

 LocationListener  rất linh hoạt và nhiều tính năng cho phép chọn nhiều loại sự 

kiện về vị trí dựa trên đặc tính khác nhau.

Phương thức requestLocationUpdate chấp nhận một   Location Provider  

hoặc Criteria để xác định nhà cung cấp đượ c sử dụng.

Đoạn code sau sẽ thể hiện một yêu cầu cập nhật thườ ng xuyên dựa trên

mức tối thiểu về thờ i gian và khoảng cách.

String provider = LocationManager.GPS_PROVIDER;

int t = 5000; // milliseconds

int distance = 5; // meters

 LocationListener myLocationListener = new LocationListener() {

 public void onLocationChanged(Location location) {

 // Update application based on new location.

 }

  public void onProviderDisabled(String provider){

 // Update application if provider disabled.

 }

 public void onProviderEnabled(String provider){

 // Update application if provider enabled. }

8/4/2019 Bao Cao Lap Trinh Android_final

http://slidepdf.com/reader/full/bao-cao-lap-trinh-androidfinal 63/82

Tìm hiể u l ậ p trình trên Android 

SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 63

 public void onStatusChanged(String provider, int status,Bundle extras){

 // Update application if provider hardware status changed.

 }

 };

locationManager.requestLocationUpdates(provider, t, distance,

myLocationListener); 

Sử d ụng Goecoder 4.9.9

  Geocoding cho phép chuyển giữa các địa chỉ và các mô tả khác

vào kinh độ / vĩ độ của bản đồ tọa độ. Điều này cung cấp cho chúng ta một

khung cảnh giúp dễ nhận biết các vị trí và tọa độ đượ c sử dụng trong các dịch

vụ dựa trên vị trí và hoạt động dựa trên bản đồ. Để thực hiện việc này lớ p

Geocoder thực hiện một cuộc gọi mạng (tự động) cho một dịch vụ web.

Lớ p Geocoder cung cấp hai chức năng truy cập mã địa lý:

  Forward Geocoding: tìm vĩ độ và kinh độ của đia chỉ.

  Reverse Geocoding: chuyển địa chỉ ra vĩ độ, kinh độ.

Cách tạo một Geocoder:

Geocoder geocoder = new Geocoder(getApplicationContext(),

Locale.getDefault());

Cả hai chức năng mã hoá địa lý trả về một danh sách các đối

tượ ng Address. Mỗi danh sách có thể chứa nhiều k ết quả.

 Reverse Geocoding4.9.10

Trả về địa chỉ khi đượ c cung cấp kinh độ, vĩ độ.

Để thực hiện việc tra cứu chuyển đổi chúng ta đưa vào một vĩ độ và kinh

độ  đến Geocoder và phương thức getFromLocation sẽ.   Reverse Geocoding sẽ 

trả về một danh sách địa chỉ phù hợ p, nếu Geocoder  không giải quyết được địa

chỉ này với các quy định thì nó sẽ trả về null.

  Location =

locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER

);

double latitude = location.getLatitude();

double longitude = location.getLongitude();

Geocoder gc = new Geocoder(this, Locale.getDefault()); List<Address> addresses = null;

8/4/2019 Bao Cao Lap Trinh Android_final

http://slidepdf.com/reader/full/bao-cao-lap-trinh-androidfinal 64/82

Tìm hiể u l ậ p trình trên Android 

SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 64

try {

addresses = gc.getFromLocation(latitude, longitude, 10);

 }

catch (IOException e)

{}

Forward Geocoding4.9.11

  Để tra cứu Forward Geocoding, gọi getFromLocationName trên trườ ng

Geocoder. Đưa vị trí tạo độ mà chúng ta muốn và số  lượ ng tối đa của các k ết

quả trả lại, chúng ta sẽ nhận được các địa chỉ thích hợ p, như thể hiện trong

đoạn code dưới đây: 

 List <Address>result = geocoder.getFromLocationName(aStreetAddress,

maxResults); 

Locale cung cấp bối cảnh địa lý để giải thích các yêu cầu tìm kiếm của

chúng ta như tên của một vị trí có thể tồn tại trong nhiều khu vực. Nếu có thể 

thì ta xem xét lựa chọn một Locale ở  khu vực để tránh sự nhập nhằng tên, như

thể hiện trong đoạn code sau:

Geocoder fwdGeocoder = new Geocoder(this, Locale.US);String streetAddress = “160 Riverside Drive, New York, New York”;List<Address> locations = null;

try {

locations = fwdGeocoder.getFromLocationName(streetAddress,

10);

 }

catch (IOException e){}

 // để có nhiều địa chỉ  , sử d ụng getFromLocationName

 List<Address> locations = null;

try {

locations = fwdGeocoder.getFromLocationName(streetAddress,

10,n, e, s, w);

 }

catch (IOException e) {}

Hình sau cho thấy việc dùng Geocoder   để chuyển một địa chỉ kiểu

String vào một đối tượ ng cung cấp vĩ độ và kinh độ.

8/4/2019 Bao Cao Lap Trinh Android_final

http://slidepdf.com/reader/full/bao-cao-lap-trinh-androidfinal 65/82

Tìm hiể u l ậ p trình trên Android 

SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 65

Hinh 4-8 

 Dùng MapView4.9.12

  MapView là một control thu nhỏ của nhiều Google Maps API trong

hình thức View cho các ứng dụng Android. MapView hiển thị giao diện của

bản đồ, nó có đượ c sử dụng qua mạng như bản đồ là sự di chuyển và thu

nhỏ, giống như phiên bản web của Google Maps.

Nhiều khái niệm tiêu chuẩn Google Map API cũng có mặt trong Android

thông qua các MapView, ví dụ MapView hỗ trợ chế  độ vệ tinh, chế 

độ xem đườ ng phố, và chế độ giao thông ta khai báo như sau:  

mapView.setSatellite(true);

mapView.setStreetView(true);

mapView.setTraffic(true);

Chúng ta cũng có thể truy cập vào các Map View để tìm ra kinh độ hiện

hành và độ    phóng đại, cũng như các điểm trung tâm và hiện đang nhìn thấyvà khoảng vĩ độ (ở dạng thập phân).

GeoPoint center = mapView.getMapCenter();

int latSpan = mapView.getLatitudeSpan();

int longSpan = mapView.getLongitudeSpan();

Chúng ta cũng có thể hiển thị bản đồ điều khiển zoom một cách tùy ý.

View zoomControls = mapView.getZoomControls();

mapView.addView(zoomControls, lp);

mapView.displayZoomControls(true);

8/4/2019 Bao Cao Lap Trinh Android_final

http://slidepdf.com/reader/full/bao-cao-lap-trinh-androidfinal 66/82

Tìm hiể u l ậ p trình trên Android 

SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 66

MapView là một ViewGroup hãy khai báo nó trong XML.

<com.google.Android.maps.MapView

Android:id="@+id/map_view"

Android:layout_width="fill_parent"Android:layout_height="fill_parent"

Android:enabled="true"

Android:clickable="true"

Android:apiKey="05lSygx-ttd-J5GXfsIB-dlpNtggca4I4DMyVqQ"  />

Chú ý: Android:apiKey ở   đây chúng ta phải đăng ký qua Google, nó hoàn toàn

miễn phí. 

 Dùng MapActivity4.9.13

  MapActivity là một lớp cơ bản.Lớ p MapActivity xử  lý vòng đờ i ứng

dụng và quản lý nền tảng cần thiết cho việc hiển thị bản đồ, chúng ta chỉ có thể 

sử dụng một MapView trong MapActivity.

Để sử dụng bản đồ trong ứng dụng chúng ta cần phải tạo một Activity

mớ i k ế thừa từ MapActivity và cần thêm vào trong file XML, trong thẻ 

<Aplication>:

<uses-library Android :name=”com.google. Android .maps”/> 

MapView điều khiển chỉ có thể đượ c sử dụng trong một Activity mở  

rộng MapActivity. Overriding phương thức onCreate đặt ra các màn hình bao

gồm một MapView, và ghi đè lên isRouteDisplayed để trả về true nếu Activity

sẽ đượ c hiển thị thông tin định tuyến.

Đoạn code sau sẽ trình bày cách khở i tạo mớ i lớ p bản đồ  cơ sở  

 MyMapActivity :

import com.google.Android.maps.MapActivity;

import com.google.Android.maps.MapController;

import com.google.Android.maps.MapView;

import Android.os.Bundle;

 public class MyMapActivity extends MapActivity {

 private MapView mapView;

 private MapController mapController;

@Override

 public void onCreate(Bundle icicle) {

super.onCreate(icicle);

8/4/2019 Bao Cao Lap Trinh Android_final

http://slidepdf.com/reader/full/bao-cao-lap-trinh-androidfinal 67/82

Tìm hiể u l ậ p trình trên Android 

SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 67

setContentView(R.layout.map_layout);

mapView = (MapView)findViewById(R.id.map_view);

 }

@Override

 protected boolean isRouteDisplayed() {

 // IMPORTANT: This method must return true if your 

 Activity

 // is displaying driving directions. Otherwise return

 false.

return false;

 }

 }

Hinh 4-9 

Sử d ụng Overlay4.9.14

  Overlay là một cách để thêm các chú thích và xử lý nhấn vào MapView.

Để thêm một lớ p mớ i Overlay chúng ta tạo một lớ p mớ i k ế thừa từ lớ p Overlay,ghi đè các phương thức vẽ  để vẽ các chú thích mà chúng ta muốn thêm và ghi

đè lên onTap để phản lại cho ngườ i dùng khi click chuột như đoạn code sau:

import Android.graphics.Canvas;

import com.google.Android.maps.MapView;

import com.google.Android.maps.Overlay;

 public class MyOverlay extends Overlay {

@Override

 public void draw(Canvas canvas, MapView mapView, boolean shadow) {

if (shadow == false) {

8/4/2019 Bao Cao Lap Trinh Android_final

http://slidepdf.com/reader/full/bao-cao-lap-trinh-androidfinal 68/82

Tìm hiể u l ậ p trình trên Android 

SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 68

[ ... vẽ trên lớ  p trên cùng của layout ... ]

 }

else {

[ ... vẽ tên lớp dướ i, bóng mờ ... ] }

 }

@Override

 public boolean onTap(GeoPoint point, MapView mapView) {

 //tr ả về true nế u tích vào một điể m màn hình do Overlay quản lý 

return false;

 }

 } 

 Dùng MapController 4.9.15  Dùng MapContrller để quay và phóng to một MapView, dùng

getController như đoạn code sau:

 MapController mapController = myMapView.getController();

Bản đồ các địa điểm trong các lớ p bản đồ Android được đại diện bởi đối

tượ ng GeoPoint, trong đó vĩ độ và kinh độ đo bằng microdegrees.

Trướ c khi chúng ta có thể sử dụng các giá trị vĩ độ và kinh độ lưu

trữ trong các đối tượ ng Location đượ c sử dụng bở i các location-based

services, chúng ta cần phải chuyển đổi chúng sang microdegrees và lưu

trữ chúng như GeoPoints, như trong đoạn mã sau đây: 

 Double lat = 37.422006*1E6;

 Double lng = -122.084095*1E6;

GeoPoint point = new GeoPoint(lat.intValue(), lng.intValue());

Khi muốn biết điểm và phóng to hình trong MapView ta sử dụng

  phương thức setCenter và setZoom có sẵn trong MapCotroller của MapView

như đoạn code dưới đây: 

mapController.setCenter(point);

mapController.setZoom(1);

Phương thức setCenter sẽ nhảy tớ i một vị trí mớ i ta sử dụng như sau: mapController.animateTo(point)  

8/4/2019 Bao Cao Lap Trinh Android_final

http://slidepdf.com/reader/full/bao-cao-lap-trinh-androidfinal 69/82

8/4/2019 Bao Cao Lap Trinh Android_final

http://slidepdf.com/reader/full/bao-cao-lap-trinh-androidfinal 70/82

Tìm hiể u l ậ p trình trên Android 

SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 70

  Lấy key:

Vào cmd gõ:

keytool -list -alias Androiddebugkey -keystore <đườ ng d ẫ n file

keystore> -storepass Android -keypass Android 

Vào link  http://code.google.com/Android/maps-api-signup.html dán 

MD5 fingerprint code vào và click Generate API key , site s ẽ tự sinh cho

chúng ta 1 key.

4.10  LÀM VIỆC TRÊN BACKGROUND 

Giớ i Thiệu Services4.10.1

  Không giống như các hoạt động khác, Services trình bày một giao diện

đồ họa phong phú cho ngườ i dùng. Services chạy trên nền cập nhật Content

Providers, đóng Intent và kích hoạt thông báo, Services là những cách để thực

hiện xử lý hoàn hảo hoặc xử lý sự kiện thườ ng xuyên ngay cả khi ứng dụng của

chúng ta không nhìn thấy hoạt động của services, không hoạt động hoặc bị tắt.

Tuy không có giao diện trực quan nhưng Serviecs vẫn có thể  đượ c bắt

đầu, dừng lại và kiểm soát từ các thành phần ứng dụng khác bao gồm Services,

Activities và Broadcast Receivers. Nếu ứng dụng của chúng ta thườ ng xuyên

hoặc liên tục thực hiện các hoạt động mà không phụ thuộc trực tiếp vào dữ liệu

người dùng đưa vào (input), Sevices có thể là câu trả lờ i.

Máy nghe nhạc MP3, giám sát tọa độ là những ví dụ của ứng dụng có thể 

chạy và cập nhật mà không có một thành phần tương tác trực quan có thể nhìn

thấy. 

Các Services đượ c thiết k ế  để chạy nền, vì vậy cần phải đượ c bắt đầu,

dừng lại, và kiểm soát bở i các thành phần ứng dụng khác.

Trong các phần sau đây, chúng ta sẽ học cách để tạo ra một Service mớ i

và làm thế  nào để bắt đầu và k ết thúc nó bằng cách sử dụng phương thức 

8/4/2019 Bao Cao Lap Trinh Android_final

http://slidepdf.com/reader/full/bao-cao-lap-trinh-androidfinal 71/82

Tìm hiể u l ậ p trình trên Android 

SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 71

 startServices. Sau đó sẽ học cách để ràng buộc một Services cho một Activity,

cung cấp một giao diện phong phú hơn cho tương tác. 

T ạo Service4.10.2

  Để xác định một Services ta tạo ra một lớ p mớ i k ế thừa tử lớ p Service cơ  

sở . Chúng ta cần ghi đè lên onBind  và  onCreate như trình bày sau đây: 

import Android.app.Service;

import Android.content.Intent;

import Android.os.IBinder;

 public class MyService extends Service {

@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;

 }

 }

Trong hầu hết các trườ ng hợ p chúng ta nên ghi đè lên  onStart. Điều này

sẽ đượ c gọi bất k ỳ khi nào Services đượ c bắt đầu khi gọi đến startService, dướ i

đây là thể hiện phương thức ghi đè lên onStart như sau: 

@Override

 public void onStart(Intent intent, int startId) {

 // TODO: Actions to perform when service is started.

 }

Một khi chúng ta đã xây dựng một Service mớ i chúng ta phải đăng ký

trong tập tin mainifest trong tab <service> như sau: 

<service Android :enabled=”true” Android :name=”.MyService”></service> 

Khở i chạy, điề u khiển và tương tác vớ i Sercice4.10.3

  Để khở i chạy một Service chúng ta gọi startService.

Nếu Service yêu cầu quyền truy cập mà ứng dụng của chúng ta không có

thì lờ i gọi này sẽ bị chuyển vào SecurityException  như sau: 

 // khở i t ạo không tườ ng minhstartService(new Intent(MyService.MY_ACTION));

8/4/2019 Bao Cao Lap Trinh Android_final

http://slidepdf.com/reader/full/bao-cao-lap-trinh-androidfinal 72/82

Tìm hiể u l ậ p trình trên Android 

SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 72

 // khở i t ạo tườ ngm inh

startService(new Intent(this, MyService.class));

Để dừng một Service ta gọi stopService, đưa vào một Intent để xác định

các Service ngăn chặn.

ComponentName service = startService(new Intent(this,

 BaseballWatch.class));

 // sử d ụng tên service để d ừ ng Service.

stopService(new Intent(this, service.getClass()));

 // d ừng service tườ ng minh

try {

Class serviceClass = Class.forName(service.getClassName());

stopService(new Intent(this, serviceClass));

 }

catch (ClassNotFoundException e) {}

Nếu  startService  đượ c gọi thì Service đó đang đượ c chạy, phương thức 

 onStart của Service đượ c thực hiện một lần nữa. Các cuộc gọi đến startService

sẽ không lồng lên nhau do đó có một cuộc gọi duy nhất, để chấm dứt thì sử 

dụng  stopService không k ể là bao nhiêu lần startService đã đượ c gọi.

K ế t nố i Activities vớ i Services4.10.4

  Khi một hoạt động liên k ết vớ i một Service thì bản thân nó duy trì một

tham chiếu đến Service đó, nó cho phép gọi một phương thức trên Service đang

chạy.

Liên k ết này có sẵn cho các hoạt động, sẽ đượ c thừa hưở ng tất cả từ giao

diện vớ i một Service. Để hỗ trợ  các ràng buộc cho một Service thì thực hiện

  phương thức onBind  như trong ví dụ đơn giản sau đây:

 private final IBinder binder = new MyBinder();

@Override

 public IBinder onBind(Intent intent) {

return binder;

 }

 public class MyBinder extends Binder {

 MyService getService() {

return MyService.this; }

8/4/2019 Bao Cao Lap Trinh Android_final

http://slidepdf.com/reader/full/bao-cao-lap-trinh-androidfinal 73/82

Tìm hiể u l ậ p trình trên Android 

SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 73

 }

Sự k ết nối giữa các Service và các hoạt động đượ c thể hiện như một

Serviceconnection. Ta cần phải thực hiện một ServiceConnection mớ i, ghi đè

lên phương thức onServiceConnection và  onServiceDisconnected   để có thể 

tham chiếu đến một Service k ết nối đã đượ c thành lập.

 // liên k ế t vớ i service

 private MyService serviceBinder;

 // điề u khiể n k ế t nố i giữ a Acitivity và Service

 private ServiceConnection mConnection = new ServiceConnection() {

 public void onServiceConnected(ComponentName className,

 IBinder service) { // đượ c gọi khi k ế t nối đượ c t ạo.

serviceBinder =

((MyService.MyBinder)service).getService();

 }

 public void onServiceDisconnected(ComponentName className)

{

 // khi ngắ t k ế t nố i.serviceBinder = null;

 }

 };

Để gọi Services cần truyền vào một Intent trong phương thức

bindService: 

@Override

 public void onCreate(Bundle icicle) {

super.onCreate(icicle);

 // Bind to the service

 Intent bindIntent = new Intent(MyActivity.this, MyService.class);bindService(bindIntent, mConnection,

Context.BIND_AUTO_CREATE);

 }

Liên lạc vớ i một Service trong một ứng dụng khác bằng cách sử dụng

Broadcast Intent hay biến Bundle trong Intent đượ c sử dụng khi khởi động Service.

8/4/2019 Bao Cao Lap Trinh Android_final

http://slidepdf.com/reader/full/bao-cao-lap-trinh-androidfinal 74/82

Tìm hiể u l ậ p trình trên Android 

SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 74

Giớ i thiệu Thông báo trong Android 4.10.5

  Thông báo là một cách cho các ứng dụng của chúng ta để cảnh báo đối

vớ i ngườ i sử dụng, mà không cần sử dụng một hành động. Thông báo đượ c xử 

lý bở i các Manager Notification, nó bao gồm các khả năng:

  Tạo một biểu tượ ng mớ i trên thanh trạng thái. 

  Hiển thị thêm thông tin trong cửa sổ mở rộng của thanh trạng thái. 

  Đèn Flash/LEDs. 

  Điện thoại rung. 

  Ân thanh báo động(nhạc chuông,âm thanh thông tin lưu trữ). 

Thông báo có thể tồn tại qua sự lặp lại liên tiếp hoặc bằng các sử dụng

một biểu tượ ng trên thanh trạng thái.Tình trạng các biểu tượ ng có thể đượ c cập

nhật thườ ng xuyên hoặc mở  rộng để hiển thị thêm thông tin sử dụng tình trạng

cửa sổ  như trong hình dướ i.

Hinh 4-11 

Giớ i thiệu Notification Manager 4.10.6

  Notification Manager là một hệ thống dịch vụ đượ c sử dụng để xử lý các

thông báo, để tham chiếu đến nó bằng cách sử dụng phương thức:

getSystemService như thể hiện trong đoạn code sau:

String svcName = Context.NOTIFICATION_SERVICE;

 NotificationManager notificationManager;

notificationManager =

(NotificationManager)getSystemService(svcName);

8/4/2019 Bao Cao Lap Trinh Android_final

http://slidepdf.com/reader/full/bao-cao-lap-trinh-androidfinal 75/82

Tìm hiể u l ậ p trình trên Android 

SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 75

Sử dụng Manager thông báo, chúng ta có thể kích hoạt thông báo mớ i,

sửa đổi những cái hiện có, hoặc loại bỏ những cái không còn cần thiết hoặc

không mong muốn. 

T ạo thông báo4.10.7

  Tạo và cấu hình một thông báo mới đượ c thực hiện trong ba phần:

Trướ c tiên, tạo một đối tượ ng thông báo mới đưa vào biểu tượng để hiển

thị trên thanh trạng thái cùng vớ i các thanh trạng thái tickertext và thờ i gian

thông báo như trong đoạn code sau:

 // chọn hình ảnh làm icon trên thanh tác vụ 

int icon = R.drawable.icon;

 // chuỗ i xuấ t hiện khi chạ y thông báo

String tickerText = “Notification”; 

 // The extended status bar orders notification in time order 

long when = System.currentTimeMillis();

 Notification notification = new Notification(icon, tickerText, when);

Các ticker-text sẽ di chuyển dọc theo các thanh trạng thái khi các thông

báo đượ c phát ra.Thứ hai, cấu hình sự xuất hiện của các thông báo trong cửa sổ trạng

tháimở  rộng sử dụng  phương pháp setLatestEventInfo . Điều này mở  rộng cửa

sổ trạng thái hiển thị biểu tượ ng và thời gian quy định trong xây dựng và cũng

cho thấy tiêu đề và một chuỗi các chi tiết. Thông báo thườ ng xuất hiện

cho một yêu cầu một hành động hoặc sự chú ý, vì vậy chúng ta có thể chỉ 

định một PendingIntent sẽ thoát nếu ngườ i dùng nhấp vào mục thông báo.

Context context = getApplicationContext();

 // chuỗ i hiện khi mở r ộngcử a sổ thông báo

String expandedText = “Extended status text”; 

 // tiêu đề của

String expandedTitle = “Notification Title”;  // Intent để khở i chạ y activity khi cử a sổ thông báo mở r ộng đượ c click 

 Intent intent = new Intent(this, MyActivity.class);

PendingInten tlaunchIntent= PendingIntent.getActivity(context,

0,intent, 0);

8/4/2019 Bao Cao Lap Trinh Android_final

http://slidepdf.com/reader/full/bao-cao-lap-trinh-androidfinal 76/82

Tìm hiể u l ậ p trình trên Android 

SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 76

notification.setLatestEventInfo(context,expandedTitle,expandedTe

 xt,

launchIntent);

Chúng ta cũng có thể sử dụng thuộc tính number  để hiển thị số sự 

kiện cho một biểu tượ ng trên thanh trạng thái đượ c thể hiện. Thiết lập giá trị 

này lớn hơn 1, tất cả sự  thay đổi của một thông báo chúng ta không cần phải

kích hoạt nó để áp dụng sự  thay đổi, để loại bỏ các lớ p phủ(các thông báo phủ 

lên nhau), ta thiết lập giá trị là 0 hoặc -1

notification.number++;

Cuối cùng, chúng ta có thể cải thiện một Thông báo bằng cách sử dụng các thuộc tính khác nhau trên các đối tượ ng thông báo chẳng hạn thiết

bị đèn LED, rung điện thoại, và âm thanh (nhac, chuông). 

Kích hoạt thông báo4.10.8

  Để bật một thông báo và đưa vào trong phương thức notify trong đối

tượ ng NotificationManager một số nguyên ID, như trong đoạn code sau:

int notificationRef = 1;notificationManager.notify(notificationRef, notification);

Chúng ta có thể sử dụng các ID để hủy bỏ Thông báo bằng cách gọi

  phương thức Cancel trên NotificationManager, như thể hiện sau:

notificationManager.cancel(notificationRef);  

4.11 SỬ DỤNG CÁC MEDIA APIS 

Các công nghệ hiện đại ngày nay có thể cạnh tranh với điện thoại di động có

mặt ở khắp mọi nơi là máy nghe nhạc và các phương tiện xách tay k ỹ thuật số. Kết quả 

thăm dò thị  trườ ng cho thấy thiết bị điện thoại di động là một sự quan tâm đáng kể đối

vớ i nhiều ngườ i tiêu dùng.

Android đưa ra nhiều thư viện cho ứng dụng và cung cấp các chức năng đa

  phương tiện gồm cả ghi âm và video, âm thanh và hình ảnh được lưu trữ tại cục bộ 

trong một ứng dụng.

Android hỗ trợ  các định dang đa phương tiện sau đây: 

8/4/2019 Bao Cao Lap Trinh Android_final

http://slidepdf.com/reader/full/bao-cao-lap-trinh-androidfinal 77/82

Tìm hiể u l ậ p trình trên Android 

SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 77

JPEG, PNG, OGG, Mpeg 4, 3GPP, MP3, Bitmap

Chơi nhạc4.11.1

  Đa phương tiện trong Android đượ c xử lý bở i lớ p MediaPlayer . Chúngta có thể xem lại các thông tin được lưu trữ trong ứng dụng, đia chỉ của tập tin,

hoặc từ mạng URI.

Để  chơi nhạc, ta tạo mớ i một   Media Player , và gán cho nó đườ ng dẫn

đến tập tin nhạc để chơi bằng các sử dụng phương thức sedDataSource . Trướ c

khi chúng ta có thể bắt đầu chơi nhạc, chúng ta cần phải chuẩn bị  như trong

đoạn mã sau:

String MEDIA_FILE_PATH =

Settings.System.DEFAULT_RINGTONE_URI.toString();

 MediaPlayer mpFile = new MediaPlayer();

try {

mpFile.setDataSource(MEDIA_FILE_PATH);

mpFile.prepare();

mpFile.start();

 }

catch (IllegalArgumentException e) {}

catch (IllegalStateException e) {}

catch (IOException e) {}

Ngoài ra, tạo một phương thức tĩnh (static) làm việc như shortcuts, chấp

nhận các đườ ng dẫn đến file nhạc như một tham số như trong đoạn mã sau:

 MediaPlayer mpRes = MediaPlayer.create(context, R.raw.my_sound);

Một Media Player  đượ c gọi để bắt đầu chơi như thể hiện sau đây: 

mpRes.start();mpFile.start();

Media Player bao gồm các chức năng dừng lại, tạm dừng và phương

thức tìm kiếm cũng như phương thức tìm vị trí, thời gian và kích thướ c hình

ảnh của các thông tin liên quan.

Để lặp vòng hoặc phát lặp lại ta sử dụng phương thức setLooping.

Một khi chúng ta không sử dụng Media Player, ta gọi release  để giải

 phóng tài nguyên liên quan như trình bày sau: 

8/4/2019 Bao Cao Lap Trinh Android_final

http://slidepdf.com/reader/full/bao-cao-lap-trinh-androidfinal 78/82

Tìm hiể u l ậ p trình trên Android 

SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 78

mpRes.release();

mpFile.release();

Ghi âm4.11.2

  Ghi âm đượ c xử lý bở i lớ p  MediaRecorder  để ghi âm thanh hoặc video,

tạo một đối tượ ng MediaRecorder  như trong đoạn code sau:

 MediaRecorder mediaRecorder = new MediaRecorder()

Trướ c khi chúng ta có thể ghi âm bất k ỳ media trong Android, ứng dụng

của chúng ta cần đượ c cấp phép RECORD_AUDIO hoặc RECORD_VIDEO.

Thêm một thẻ uses-permission trong ứng dụng manifest như sau:

<uses-permission Android :name=” Android .permission.RECORD_AUDIO”/> 

<uses-permission

 Android :name=” Android .permission.RECORD_VIDEO”/> 

Máy ghi âm(Media Recorder) có thể sử dụng để cấu hình các video và

quay phim (bao gồm cả  camera và microphone), định dạng đầu ra, kích thướ c

video, tỷ lệ khung hình, video và thu âm video để sử dụng.

Các đoạn code sau đây cho thấy làm thế  nào để cấu hình một máy ghiâm để ghi lại âm thanh từ micro bằng cách sử dụng định dạng mặc định và mã

hóa.

 // lấ  y nguồn video

mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);

 // thiế t lập định d ạng đầu ra

mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFA

ULT);

 // thiế t lậ p bộ mã hóa âm thanh để sử d ụng

mediaRecorder.setAudioEncoder (MediaRecorder.AudioEncoder.DEFAULT);

Khi chúng ta xác định đầu vào và định dạng đầu ra, chỉ định một tập tin

để lưu trữ các media sử dụng phương thức setOutputFile  như hình dưới đây:

mediaRecorder.setOutputFile(“myoutputfile.mp4”); 

Để bắt đầu ghi âm, ta gọi prepare bằng phương thức start  như sau: 

mediaRecorder.prepare();mediaRecorder.start();

8/4/2019 Bao Cao Lap Trinh Android_final

http://slidepdf.com/reader/full/bao-cao-lap-trinh-androidfinal 79/82

Tìm hiể u l ậ p trình trên Android 

SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 79

Khi hoàn thành ta gọi stop để k ết thúc, tiếp theo là release để giải phóng

nguồn tài nguyên máy ghi âm.

mediaRecorder.stop();

mediaRecorder.release(); 

Sau khi ghi âm một media mớ i ta tạo ra một đối tượ ng ContentValues

mới để thêm một ghi âm mớ i vào Media Store.Các dữ liệu mà chúng ta chỉ định

ở  đây có thể bao gồm các chi tiết như tên, thờ i gian, mã địa lý cho tập tin mớ i

như thể hiện trong đoạn code sau đây: 

ContentValues content = new ContentValues(3);

content.put(Audio.AudioColumns.TITLE, “TheSoundandtheFury”);  

content.put(Audio.AudioColumns.DATE_ADDED,

System.currentTimeMillis() / 1000);

content.put(Audio.Media.MIME_TYPE, “audio/amr”);  

Chúng ta cũng cần phải chỉ ra đườ ng dẫn cho tâp tin đượ c tạo:

content.put(MediaStore.Audio.Media.DATA,“myoutputfile.mp4”); 

Có thể truy cập vào ContentResolver  của ứng dụng, sử dụng để thêm

một dòng mớ i vào  MediaStore như trong đoạn code sau:

ContentResolver resolver = getContentResolver();Uri uri = resolver.insert(Audio.Media.EXTERNAL_CONTENT_URI,

content);

Khi thông tin của một tập tin đượ c lưu trữ, chúng ta có thể thông báo nó

đã sẵn sàng dùng một Intent để   phát như sau: 

sendBroadcast(new

 Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,uri));  

4.12  SỬ DỤNG MÁY ẢNH Sự phổ biến của máy ảnh k ỹ thuật số  (đặc biệt là trong điên thoại di động) đã

gây ra một sự giảm giá đáng kể. Bây giờ  thật là khó, thậm chí tìm một điện thoại đi

động mà không có máy ảnh và các thiết bị Android không phải là trườ ng hợ p ngoại lệ.

Để truy cập vào phần cứng máy ảnh chúng ta cần phải thêm một CAMERA cho

phép trong ứng dụng manifest như trình bày sau đây: 

<uses-permission Android :name=” Android .permission.CAMERA”/> 

8/4/2019 Bao Cao Lap Trinh Android_final

http://slidepdf.com/reader/full/bao-cao-lap-trinh-androidfinal 80/82

8/4/2019 Bao Cao Lap Trinh Android_final

http://slidepdf.com/reader/full/bao-cao-lap-trinh-androidfinal 81/82

Tìm hiể u l ậ p trình trên Android 

SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 81

 public void onPreviewFrame(byte[] _data, Camera _camera) {

 // TODO Do something with the preview image.

 }

 }); 

Chụ p ảnh4.12.3

Chụp ảnh bằng cách gọi takePicture  trên đối tượng Camera, đưa vào một

ShutterCallback  và PictureCallback  thực hiện cho hình ảnh RAW và JPEG.

Mỗi lần gọi hình ảnh sẽ nhận đượ c một mảng (byte) đại diện cho hình ảnh

trong các định dạng thích hợ p, trong khi gọi lại cánh cửa chớp đượ c kích hoạt

ngay sau đó cánh cửa chớp được đóng lại.

 private void takePicture() {

camera.takePicture(shutterCallback, rawCallback,

 jpegCallback);

 }

ShutterCallback shutterCallback = new ShutterCallback() {

 public void onShutter() {

 // TODO Do something when the shutter closes.

 }};

PictureCallback rawCallback = new PictureCallback() { public void onPictureTaken(byte[] _data, Camera _camera) {

 // TODO Do something with the image RAW data.

 }};

PictureCallback jpegCallback = new PictureCallback() {

 public void onPictureTaken(byte[] _data, Camera

_camera) {

 // TODO Do something with the image JPEG data.

 }

 };

8/4/2019 Bao Cao Lap Trinh Android_final

http://slidepdf.com/reader/full/bao-cao-lap-trinh-androidfinal 82/82

Tìm hiể u l ậ p trình trên Android 

Chương 5. TỔNG KẾT

5.1  KẾT QUẢ ĐẠT ĐƯỢ C:

  Tìm hiều đượ c nền tảng cơ bản của hệ điều hành trên thiết bị di động Android.

Một hệ  điều hành mã nguồn mở   trên di động đang nổi lên và phát triển chóng

mặt trên thế giớ i trong thờ i gian gần đây. Một đặc tính tuyệt vờ i của Android là

tính mở của nó, dựa trên đặc tính này các nhà sản xuất có thể tùy biến để tạo ra

các giao diện đặc trưng cho từng ngườ i sử dụng. Ngoài ra Android thể hiện ưu

thế vượ t trội hơn các hệ điều hành trên thiết bị di động khác khi đượ c tích hợ p

sẵn các dịch vụ hỗ trợ  từ  Google đầy đủ nhất: Gmail, Google Talk, Google

Calendar… 

  Nắm bắt đượ c cách tạo giao diện từ những công cụ Android cung cấp và cách

tùy chỉnh các công cụ này: Linear Layout, Relative Layout, … các control :

Listview, Button, Checkbox, …. 

  Tìm hiểu và thực hành lập trình đượ c những chương trình nhỏ  đầu tiên trên

thiết bị giả lập trên PC, dùng Eclipse và SDK mà Google cung c ấp. Qua từng

chương chúng ta đã đi qua tìm hiểu các thành phần quan trọng cơ bản của

Android như: Activity, Intent, Broadcast Resever, ContentProvider, MapView,

Geocoder, Services, … và sử dụng phần cứng cơ bản của Android đó là

Camera để quay phim, chụp ảnh.

5.2  HƯỚ NG PHÁT TRIỂN CỦA ĐỀ TÀI:

  Tiếp tục tìm hiểu các thành phần khác của Android nhằm nắm vững hơn và

nhiều hơn về các thành phần của Android.

  Xây dựng một ứng dụng mang tính khả thi trên hệ điều hành này.