You are on page 1of 82

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

Mục lục
 Chương 1. 1.1 GIỚI THIỆU 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 Đặc tính mở của Android:..........................................................................................................6 Android Platform: ............................................................................................................................7 Tầng Linux Kernel: ..........................................................................................................................7 Native Libraries: ...............................................................................................................................7 Tầng Runtime: ....................................................................................................................................8 Tầng Application Framework: ...............................................................................................8 MÔI TRƯỜNG LẬP TRÌNH.................................................................................................10

Khái niệm về Android: ...........................................................................................................................5

1.1.1 1.1.2
1.2

Kiến trúc của Android:...........................................................................................................................6

1.2.1 1.2.2 1.2.3 1.2.4 1.2.5
Chương 2. 2.1 2.2 2.3 2.4 2.5 2.6 2.7

Giới thiệu:......................................................................................................................................................10 Android SDK: ..............................................................................................................................................10 Máy ảo Dalvik: ...........................................................................................................................................11 Các gói Java cần thiết: ..........................................................................................................................11 Thành phần chính của Eclipse khi tạo ứng dụng trên Android: ........................12 Thành phần quan trọng trong một Android Project: .................................................13 Chu kỳ sống của ứng dụng Android .........................................................................................13 Chu kỳ sống thành phần...........................................................................................................14 Activity Stack ....................................................................................................................................14 Các trạng thái của chu kỳ sống............................................................................................15 Chu kỳ sống của ứng dụng .....................................................................................................15 Các sự kiện trong chu kỳ sống của ứng dụng ..........................................................16 Thời gian sống của ứng dụng...............................................................................................16 Thời gian hiển thị của Activity ............................................................................................17 Các hàm thực thi ............................................................................................................................17 Các công cụ cần thiết để lập trình: ...................................................................................17 Các bước cài đặt .............................................................................................................................17

2.7.1 2.7.2 2.7.3 2.7.4 2.7.5 2.7.6 2.7.7 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

2.8.1 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

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

1

Tìm hiểu lập trình trên Android
2.10.1 2.10.2 2.11 2.11.1 2.11.2 2.11.3 2.11.4 2.11.5 2.11.6 2.11.7 2.12 2.13 4.1 View ....................................................................................................................................................23 VIEWGROUP: ...............................................................................................................................23 BUTTON...........................................................................................................................................26 LISTVIEW .......................................................................................................................................27 EDITTEXT.......................................................................................................................................29 TEXTVIEW .....................................................................................................................................30 CHECKBOX.....................................................................................................................................30 MENUOPTION .............................................................................................................................31 CONTEXTMENU.........................................................................................................................32

Các Control ..............................................................................................................................................26

Tùy biến control (custom control):......................................................................................32 Ví dụ sử dụng Listview...................................................................................................................35 LẬP TRÌNH TRÊN ANDROID ...........................................................................................38 Thành phần Intents:....................................................................................................................38 Sử dụng Intents khởi động cho Activities: ................................................................39 Intent không tường minh thực thi Activity: .............................................................40 Intent tường minh thực thi Activity ...............................................................................40 Sử dụng Intents gửi đi thông điệp ra ngoài ứng dụng hoặc Activity:...41 Một số Adapter : .............................................................................................................................43 Sử dụng Adapter hiển thị dữ liệu: ....................................................................................43 Giới Thiệu Intents: .................................................................................................................................38

Chương 4.

4.1.1 4.1.2 4.1.3 4.1.4 4.1.5
4.2 4.2.1 4.2.2 4.3 4.4 4.5

Giới Thiệu Adapters: ............................................................................................................................43

Ví dụ sử dụng Intent để liên lạc giữa các Activity:........................................................44 Kỹ thuật lưu trữ dữ liệu trong Android.................................................................................46 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 Truy xuất Shared Preferences.............................................................................................47 Truy xuất các tập tin trong Resources: ........................................................................50 Các công cụ quản lý tập tin ....................................................................................................50 Giới thiệu SQLite: ..........................................................................................................................51 Cursors và Content Values: ...................................................................................................51 Sử dụng SQLiteOpenHelper:.................................................................................................52 Truy xuất và tạo Cơ sở dữ liệu không dùng SQLiteHelper:..........................52

4.5.1 4.5.2
4.6

Lưu và đọc các tập tin trong Android: ....................................................................................49

4.6.1 4.6.2
4.7 4.7.1 4.7.2 4.7.3 4.7.4

Cơ sở dữ liệu trong Android...........................................................................................................50

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

2

Tìm hiểu lập trình trên Android
4.7.5 4.7.6 4.7.7 4.7.8 4.7.9 4.8 4.9 Truy vấn cơ sở dữ liệu ..............................................................................................................52 Lấy kết quả từ Cursors ..............................................................................................................53 Thêm, cập nhật và xóa dòng:................................................................................................53 Thao tác trên cơ sở dữ liệu Android ..............................................................................54 Giới thiệu Content Providers ...............................................................................................56

Một ứng dụng Demo sử dụng ContentProvider để quản lý sách: .....................59 Maps, Geocoding, Location Based Services.......................................................................59 Sử dụng dịch vụ định vị ............................................................................................................59 Cài đặt trên môi trường giả lập với Test Providers ...........................................59 Cập nhật vị trí với Emulator Location Providers .................................................59 Chọn một Location Provider ................................................................................................60 Tìm một Providers có sẵn.......................................................................................................60 Tìm kiếm một Provider theo tiêu chí ............................................................................61 Tìm một địa chỉ (Finding Your Location)...................................................................61 Theo dõi sử di chuyển (Tracking Movement) ........................................................62 Sử dụng Goecoder.........................................................................................................................63 Reverse Geocoding..................................................................................................................63 Forward Geocoding ................................................................................................................64 Dùng MapView ...........................................................................................................................65 Dùng MapActivity ....................................................................................................................66 Sử dụng Overlay ........................................................................................................................67 Dùng MapController ..............................................................................................................68 Chú ý khi tạo một ứng dụng có sử dụng MapView ........................................69 Giới Thiệu Services .................................................................................................................70 Tạo Service ....................................................................................................................................71 Khởi chạy, điều khiển và tương tác với Sercice ...............................................71 Kết nối Activities với Services........................................................................................72 Giới thiệu Thông báo trong Android.........................................................................74 Giới thiệu Notification Manager ...................................................................................74 Tạo thông báo .............................................................................................................................75 Kích hoạt thông báo ...............................................................................................................76 Chơi nhạc ........................................................................................................................................77 Ghi âm ...............................................................................................................................................78

4.9.1 4.9.2 4.9.3 4.9.4 4.9.5 4.9.6 4.9.7 4.9.8 4.9.9 4.9.10 4.9.11 4.9.12 4.9.13 4.9.14 4.9.15 4.9.16
4.10

Làm việc trên Background.........................................................................................................70

4.10.1 4.10.2 4.10.3 4.10.4 4.10.5 4.10.6 4.10.7 4.10.8
4.11

Sử dụng các Media APIs ................................................................................................................76

4.11.1 4.11.2
4.12

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

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

3

Tìm hiểu lập trình trên Android
4.12.1 4.12.2 4.12.3 Chương 5. 5.1 5.2 5.3 Cài đặt điều khiển camera .................................................................................................80 Sử dụng máy ảnh ......................................................................................................................80 Chụp ảnh ........................................................................................................................................81 TỔNG KẾT ......................................................................................................................................82

Kết quả đạt được:....................................................................................................................................82 Hướng phát triển của đề tài: ..........................................................................................................82 Tài liệu tham khảo: ................................................................................................................................82

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

4

1.Tìm hiểu lập trình trên Android Chương 1. cũng giống như Windows. 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. các nhà mạng như T-Mobile.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. Sprint Nextel. Intel. SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 5 . 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. Linux hay Mac chạy trên máy vi tính vậy. GIỚI THIỆU ANDROID Như chúng ta biết. 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. 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.1 Android khác với các hệ điều hành chạy trên thiết bị di động khác 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ở.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. Đó 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. middleware và một số ứng dụng cơ bản). 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ừ nền tảng mã nguồn mở. 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. 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.. 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. Texas Instruments và LG Electronics. 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ẽ. 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.. 1. Google đã cho ra mắt Android chạy trên các thiết bị di động. Motorola. Symbian và dĩ nhiên là cả OS X (iPhone). 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.1. NTT DoCoMo và China Mobile.

1. tận dụng tất cả tính năng một chiếc điện thoại đã cung cấp. Android bao gồm một tập hợp đầy đủ công cụ đã được xây dựng công phu. với năng suất cao và cái nhìn sâu vào các ứng dụng . Ví dụ. Như chúng ta biết điều này cũng có mặt tốt và xấu. 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ụ. Ngoài ra. Hơn nữa. Nó được xây dựng để được thực sự mở. 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.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ó. 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.1. đâ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ọ.Tìm hiểu lập trình trên Android 1. Android được xây dựng trên mã nguồn mở Linux Kernel. 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ọ.2 Đặc tính mở của Android: 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. 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. Framework là một tầng cao cấp dành cho lập trình SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 6 . 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. Ví dụ. với việc cung cấp nền tảng phát triển. Với Android. gửi tin nhắn văn bản. 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 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ới các thiết bị xây dựng trên Android. hoặc bằng cách sử dụng máy ảnh. 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. 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 đó.

and PNG  Surface Manager .1 Android Platform: Bao gồm HDH Android đầy đủ tính năng.. USB.3 Native Libraries:  System C library . AMR. nó đều có giới hạn của nó. quản lý tiến trình..mở rộng từ PacketVideo's OpenCORE.  Media Libraries .264.2. chúng ta nên nghiên cứu qua bản thân HDH Android. Display. Bluetooth.Tìm hiểu lập trình trên Android viên. trước khi bắt đầu học Android. Android Runtime.2 Tầng Linux Kernel: Đây là nhân của HDH Android. Wifi. các ứng dụng và các tầng trung gian để developer có thể mở rộng.quản lý việc hiển thị và kết hợp đồ họa 2D và 3D.2. thư viện hỗ trợ playback và recording của nhiều định dạng video và image phổ biến: MPEG4. chúng ta không cần phải hiểu rõ nó như thể nào. mạng stack và các trình điều khiển phần cứng. 1. 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. Android dựa trên Linux phiên bản 2. Mỗi tầng làm việc đều nhờ sự giúp đỡ của tầng bên dưới. Theo cách của mình.có nguồn gốc từ hệ thống thư viện chuẩn C (libc). Native Libraries. Có 4 tầng cơ bản trong HDH Android: Application Framework. 1.6 lựa chọn các tính năng cốt lõi như bảo mật.. mọi xử lý của hệ thống đều phải thông qua tầng này. H. AAC. MP3.2. 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. Linux Kernel . điều chỉnh các thiết bị nhúng trên Linux. SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 7 . Linux Kernel cung cấp các trình điều khiển thiết bị phần cứng (driver) như: camera. JPG. 1. Power Management . 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.. quản lý bộ nhớ. tùy chỉnh hoặc thêm vào các component của họ.

Tìm hiểu lập trình trên Android
 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.

1.2.4 Tầng Runtime:
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.

1.2.5 Tầng Application Framework:
Đâ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:

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

8

Tìm hiểu lập trình trên Android
 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

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

9

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

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

Eclipse OpenSource IDE
  Coding Debugging

Command-Line tools •File transfer tools •GSM simulation tester

Android Development Tools (plug-in)  SDK  Emulator profile configuration  Emulator launch
  Process & file system viewing Log viewing

Android Emulator •Multiple skins •Network connectivity options •Integrated with Eclipse via Android Development Tools plugin Android Development

Android Device •Physical phone hardware

SDK Documentation

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í

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

10

Tìm hiểu lập trình trên Android
 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.

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

11

app—Android application model access  Android.* — các lớp liên quan đến HTTP-related. 2.util—tập các tiện thao tác trên văn bản.opengl—các lớp OpenGL  Android.graphics—đồ họa  Android. Android.  java. Các gói dùng cho lập trình Android:  Android.bao gồm XML  Android.  javax.  java.security —Security-related classes.math —các lớp toán học.text—Text layout  Android.provider—các lớp liên quan đến ContentProvider  Android.app.webkit—Browser functionality  Android.view và Android. class autocompletion.  org.  javax.net —các lớp mạng.text —tiện ích sử lý văn bản.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.apache.view—thành phần UI (giao diện người dùng)  Android.content.net—bao gồm Uri class dùng cho việc truy xuất các nội dung khác  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.util _ chứa các lớp tiện ích.  org. Bao gồm: Log thường được dùng đề viết LogCat.telephony—khả năng truy cập Telephony  Android. và tích hợp Javadoc  Bẫy lỗi code SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 12 .os—truy cập ở mức độ hệ thông đến môi trường Android  Android.xml —các lớp liên quan đến SAX-based XML .xml —các lớp liên quan đến DOM-based XML.content—truy xuất dữ liệu trong Android  Android.  javax.Tìm hiểu lập trình trên Android  java.

Service): cung cấp các dịch vụ liên quan đến client/service. 2.  Service (Android.content.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.  Intent: nền tảng để truyền tải các thông báo. pin.. 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..app.  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. ví dụ như cập nhật sự thay đỗi giờ.6 THÀNH PHẦN QUAN TRỌNG TRONG MỘT ANDROID PROJECT:  Activity (Android. 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. SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 13 . Một Service sẽ chạy ngầm bên dưới.Tìm hiểu lập trình trên Android  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.app.  Broadcast receiver (Android.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.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.  Hệ thống cần lấy lại bộ nhớ mà nó chiếm giữ cho các ứng dụng khác.

2 Activity Stack Bên trong hệ thống các activity được quản lý như một activity stack.  Bao nhiêu vùng nhớ chiếm lĩnh trong hệ thống. đôi lúc chúng có thể là active (visible hoặc invisible) hoặc inactive. 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. Hình 2-2 Activity stack SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 14 . 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.7. 2. Khi một Activity mới được start. Thay vào đó.7.  Những phần đó quan trọng như thế nào đối với người dùng.Tìm hiểu lập trình trên Android 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ó. 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. 2. 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.1 Chu kỳ sống thành phần Các thành phần ứng dụng có một chu kỳ sống.

7.Tìm hiểu lập trình trên Android 2. 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ớ. Nó vẫn còn trạng thái và thông tin thành viên trong nó. 2. 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 đó. nó sẽ giải phóng các tiến trình theo nguyên tắc ưu tiên.7.  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.4 Chu kỳ sống của ứng dụng Trong một ứng dụng Android có chứa nhiều thành phần và mỗi thành phần đều có một chu trình sống riêng.  Killed: Khi hệ thống bị thiếu bộ nhớ.3 Các trạng thái của chu kỳ sống Hình 2-3 Chu kỳ sống của Activity 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. Và ứng dụng chỉ được gọi là kết thúc khi SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 15 . 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. Activity này tập trung vào những thao tác của người dùng trên ứng dụng.  Stopped: Nếu nó hoàn toàn bao phủ bởi Activity khác.

nó phải được hoàn toàn restart và phục hồi lại trạng thái trước. 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ó. 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().7. 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.5 Các sự kiện trong chu kỳ sống của ứng dụng Nếu một Activity được tạm dừng hoặc dừng hẳn. 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. 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. Một Activity khởi tạo SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 16 .6 Thời gian sống của ứng dụng Bảy phương thức chuyển tiếp định nghĩa trong chu kỳ sống của một Activity. 2. Activity là một thành phần cho phép người dùng giao tiếp với ứng dụng. 2. 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. nó phải báo việc chuyển của nó bằng việc gọi hàm transition. Khi một Activity chuyển qua chuyển lại giữa các trạng thái.Tìm hiểu lập trình trên Android tất cả các thành phần trong ứng dụng kết thúc.7. Hình 2-4 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. Tuy nhiê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. Broadcast receiver.

 onResume(): hàm được gọi ngay sau OnStart hoặc khi người dùng focus ứng dụng.6 hoặc cao hơn  Bộ công cụ Android SDK 2. 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.Tìm hiểu lập trình trên Android toàn bộ trạng thái toàn cục trong onCreate().7.  onRestart(): đưọc gọi khi ứng dụng chuyển sang onStop().): hàm này được gọi khi lớp Activity được khởi tạo. Win7  Công cụ lập trình: Eclipse version 3. Và được chia thành các bước nhỏ sau: SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 17 . hàm này sẽ đưa ứng dụng lên top màn hình. 2. 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.. 2.1 Các công cụ cần thiết để lập trình:  Hệ điều hành: Window XP. Plugin Android cho Eclipse và cuối cùng là cài đặt Emulator (Android SDK).8. nhưng muốn khởi động lại bằng onStart().7.  onStop(): hàm được gọi khi một activity khác được khởi động và focus. và giải phóng các tài nguyên đang tồn tại trong onDestroy().8 CÁC CÔNG CỤ CẦN THIẾT ĐỂ LẬP TRÌNH TRÊN ANDROID VÀ CÀI ĐẶT: ƯỚNG DẪN 2. có nghĩa là nó không bị foreground hoặc đang tương tác với người dùng.  onPause(): hàm được gọi khi hệ thống đang focus đến 1 activity trước đó.  onStart(): hàm này được gọi khi lớp ứng dụng xuất hiện trên màn hình.8 Các hàm thực thi  OnCreate(.. dùng để thiết lập giao diện ứng dụng và thực thi những thao tác cơ bản. 2.8.2 Các bước cài đặt: Chúng ta có 3 bước chính: Cài đặt Eclipse IDE.7 Thời gian hiển thị của Activity Visible lifetime của một activity diễn ra giữa lần gọi một onStart() cho đến khi gọi onStop().

Sau khi đã download eclipse chúng ta giải nén ra để sử dụng. chọn vào các ô như hình 2. Chọn phần Eclipse IDE cho các nhà phát triển JAVA. downloads JAVA SE . chương trình muốn lưu thư mục làm việc.zip .oracle.org/downloads/ download phần mền lập trình eclipse. Khi chạy.exe chạy chương trình tự động update. Sau khi downloads vào thư mục chứa phần download giải nén và chọn SDK Manager.html JAVA SE và tiến hành cài đặt. Chọn downloads JAVA SE > vào thư mục chứa  Bước 3: Truy cập developer. chúng ta chọn thư mục tùy ý và nhấn OK. Vào chương trình eclipse chọn menu Help -> Install New Software… Name: Google Android ( tùy ý) Location : http//:dl-ssl-google. Và tiến hành download chọn phần Android-sdk_r10-windows.Android. Hình 2-5 Chọn Sellect All .com/technetwork/java/javase/downloads/index.com/sdk/index.com/Android/eclipse Sau đó chọn OK.html .eclipse.Tìm hiểu lập trình trên Android  Bước 1: Vào địa chỉ http://www.7 SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 18 .  Bước 2: truy cập để www. Sau khi giải nén xong cho chạy chương trình.

 Bước 5: Ở các bước trên đã cấu hình Android SDK trong eclipse .  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. Hình 2-7 Ở bước này chọn đường dẫn tới thư mục chứa Android SDK. SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 19 . Lưu ý khi cài: windows muốn chứng thực.Tìm hiểu lập trình trên Android Hình 2-6 Sau đó chương trình tự động cập nhật những bản cần để cài đặt. vào Window ->Prefeneces để chỉ đường dẫn của file SDK. 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. Vào Window -> Android SDK and AVD Manager. 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. Sau khi đã cài xong chọn Restsart Now. ở bước này chọn OK. Sau đó chọn Apply.

Mở Eclipse SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 20 .Tìm hiểu lập trình trên Android Cửa sổ Android SDK and AVD Manager hiện ra . tiếp theo chọn Start…. 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 . chương trình đang tự động cập nhật.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.-> Launch để khởi động máy ảo..2. Hình 2-9 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 đó.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.Tìm hiểu lập trình trên Android 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: HelloAndroid Package name: com. Bây giờ chúng ta quay về màn hình Eclipse và Click vào Run…> chọn Android Application > OK SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 21 .

Tìm hiểu lập trình trên Android 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. 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.xml Res>values>string. Quay lại màn hình Eclipse lần lượt vào các mục : Src>HelloAndroid_Activity.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.java Res> layout>main. 2-12 SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 22 .

2 VIEWGROUP: 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.XML lên để phân tích thành mã bytecode.main). 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.10. Một screen là một tập hợp các Layout và các widget được bố trí có thứ tự. SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 23 .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.layout. hàm này sẽ load giao diện từ file MAIN. FrameLayer thường được sử dụng khi muốn tạo ra các đối tượng có khung hình bên ngoài chẳng hạn như contact image button. Để 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.Tìm hiểu lập trình trên Android 2.10 THÀNH PHẦN GIAO DIỆN ANDROID 2. 2. Trong Android Platform.  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.10.1 View View GroupView Ưw Layout Widget Control (compound control) Control 2-13 Control Control Trong Android giao diện người dùng được xây dựng từ các đối tượng View. 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.

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. <AbsoluteLayout xmlns:Android="http://schemas. y. Chẳng hạn như.Android.Tìm hiểu lập trình trên Android  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. phải định vị hai giá trị Android:layout_x="…" và Android:layout_y="…".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. 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. Tuy nhiên.  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. SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 24 . 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. Dùng câu lệnh <AbsoluteLayout></ AbsoluteLayout> để gọi Layout này. Muốn định vị một đối tượng. 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.

trên. SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 25 . 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. phải. 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. 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ý.Tìm hiểu lập trình trên Android Hình 3. Để đặ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.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. dưới so với một widget hoặc so với layout parent. Các ràng buộc này là các ràng buộc trái. 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 đó.

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 2.0" encoding="utf-8"?> <RelativeLayout xmlns:Android="http://schemas. Đoạn mã trên sau khi chạy: SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 26 .1 BUTTON 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.11. Để 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.Tìm hiểu lập trình trên Android Android:layout_marginLeft="…" cho biết đối tượng nằm cách lề phải và trái bao nhiêu.Android. 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. Đối tượng sau muốn tạo mối quan hệ với đối tượng trước.

11. Chẳng hạn như trong game. Trong một số trường hợp bắt buộc chúng ta phải custom các widget để cho phù hợp với hoàn cảnh. Button next = (Button) findViewById(R.layout. next. 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. Toast.2 LISTVIEW Được sử dụng để thể hiện một danh sách các thông tin theo từng cell. SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 27 .OnClickListener() { public void onClick(View view) { Toast.button).makeText(getApplicationContext(). các menu hay các nút điều khiển. } }).show().LENGTH_SHORT). } nh 2-16 2.Tìm hiểu lập trình trên Android 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.setOnClickListener(new View. "Bạn vừa click vào Button".… Để khai báo một Button trong code ta làm như sau: void showButton() { setContentView(R.id.btnButton).

private String lv_arr[] = {"Android". <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. 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ị."AndroidPeople"}. 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.  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. HashMap hoặc bất kỳ một cấu trúc dữ liệu kiểu danh sách nào. Chẳng hạn.Tìm hiểu lập trình trên Android Để 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."iPhone".  ListView: ListView là đối tượng để hiển thị các thông tin trong Data Source 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. @Override public void onCreate(Bundle icicle) SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 28 ."BlackBerry". Mỗi ListView phải có ID để gọi trong Activity. Tuy nhiên.

lv1. AndroidPeople: 2-18 2. edittext sẽ là 1 Texbox. ngược lại nó là 1 Textfield. Giá trị Android:singleLine bằng false. } Ví dụ: Tạo ra một ListView gồm các thành phần Android.Tìm hiểu lập trình trên Android { super.id. setContentView(R.layout.ListView01).3 EDITTEXT Trong Android đối tượng EditText được sử dụng như một TextField hoặc một TextBox.layout. BlackBerry.onCreate(icicle). lv_arr)). lv1=(ListView)findViewById(R.main).R.Android. // By using setAdpater method in listview we an add string array in list.setAdapter(new ArrayAdapter<String>(this.11. <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" /> SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 29 .simple_list_item_ 1 . iPhone.

5 CHECKBOX Nhận hai giá trị true hoặc false. Android:gravity="" dùng để canh chỉnh cho đoạn text. 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ó. <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.Tìm hiểu lập trình trên Android 2-19 2.11. Android:textSize="" kích cở chữ. XML: <CheckBox Android:id="@+id/CheckBox01" Android:layout_width="wrap_content" SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 30 . 2. Nếu muốn tìm hiểu thêm.4 TEXTVIEW TextView có tác dụng là để hiển thị văn bản.11. Android:textColor="" để định dạng màu chữ. Đối tượng CheckBox cho phép chọn nhiều item cùng một lúc.

Android.6 MENUOPTION Có 2 cách tạo một MenuOptions: Tạo bằng code và tập tin XML.11. dưới đây chúng ta dùng XML h 2-21 Khai báo bằng code XML: <menu xmlns:Android="https://schemas.Tìm hiểu lập trình trên Android Android:layout_height="wrap_content" Android:text="True" Android:checked="true" /> Kết quả như sau: 2-20 2.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 ……… SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 31 .

với màu nền và màu chữ bắt mắt. 2-22 2. Phương thức: onCreateContextMenu( ContextMenu menu.  Bước 1: Tạo một Class có tên CustomListView như sau: SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 32 . 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.Tìm hiểu lập trình trên Android </menu> 2.7 CONTEXTMENU 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. Ở đây chúng ta sẽ tạo ra một ListView.11.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.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.

margin. } }  Bước 2: tạo file colors.onDraw(c). } private void init() { TextView { AttributeSet a. public CustomListView(Context c.xml trong res/values.Tìm hiểu lập trình trên Android public class CustomListView extends //cac cong cu ve CustomListView private Paint marginPaint. super(c. private Paint linePaint.xml trong res/values tạo giá trị margin cho paper. Tạo ra màu cho paper. } public CustomListView(Context c) super(c). super(c. a). init(). private float margin. <resources> <dimen name="notepad_margin">30px</dimen> </resources>  Bước 4: với những giá trị đã tạo ta tiếp tục viết code cho hàm init() đã khai báo trong file CustomListView. int ds) { { AttributeSet a) { } @Override protected void onDraw(Canvas c) { //sử dụng lớp cha TextView để vẽ text super. private int paperColor. init(). text. init(). <resources> <color <color <color <color </resources> name="notepad_paper">#AAFFFF99</color> name="notepad_lines">#FF0000FF</color> name="notepad_margin">#09FF0000</color> name="notepad_text">#AA0000FF</color>  Bước 3: tạo file dimens. ds). } public CustomListView(Context c. a. line.java: SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 33 .

drawColor(paperColor). linePaint = new Paint(Paint. // tao choi ve. getMeasuredHeight().xml trong res/layout: <com.restore(). }  Bước 6: tạo một file customlistview. stopY.drawLine(0.ANTI_ALIAS_FLAG). marginPaint).ANTI_ALIAS_FLAG).notepad_margin).Tìm hiểu lập trình trên Android private void init() { Resources myResources = getResources(). c.color. // su dung text view de render text super.notepad_paper). 0.getColor(R. paint) c.setColor(myResources.drawLine(0.drawLine(startX. getMeasuredWidth(). }  Bước 5: Tiếp tục viết thêm code cho hàm onDraw() @Override protected void onDraw(Canvas c) { // ve mau cho paper c.getDimension(R. getMeasuredHeight(). 0. margin = myResources. margin.dimen.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" /> SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 34 .color. 0. getMeasuredHeight(). linePaint). c.onDraw(c). // di chuyen text khoang margin vua tao c.translate(margin. // lay background paper va margin width paperColor = myResources.getColor(R. marginPaint.notepad_ margin)). getMeasuredHeight(). linePaint). startY.CustomListView xmlns:android="http://schemas.android.drawLine(margin. chung ta se su dung trong onDraw marginPaint = new Paint(Paint. c.example. //c.UserInterface. stopX. 0). // ve margin c.save().

setOnClickListener( this).Tìm hiểu lập trình trên Android 2. String flower[]={"Hoa Lan".main). //doan code su dung customlistview aa = new ArrayAdapter<String>(this. @Override public void onCreate(Bundle savedInstanceState) { super.listItems).xml và main. ArrayList<String> arr = new ArrayList<String>().13 VÍ DỤ SỬ DỤNG LISTVIEW  Bước 1: Khai báo trong file strings."Hoa Huệ". setContentView(R. arr = new ArrayList<String>(). txtItem = (EditText) findViewById(R. listItems = (ListView) findViewById(R.id.customlistview.setOnKeyListener(this). btnAdd = (Button) findViewById(R.R. txtItem."Sư tử". String animal[]={"Voi".  Bước 2: Viết trong activity Main. sử dụng custom listview vừa tạo ở trên. btnAdd.txtItem). trước khi tạo một menu làm theo hình sau: 2-23 public boolean onCreateOptionsMenu(Menu menu) SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 35 . chúng ta khai báo một TextView."Hổ"}.layout.xml như sau: <resources> <string name="hello">Hello World.id.xml. }  Bước 3: tạo một menu bằng đoạn code sau. Main!</string> <string name="app_name">Ví dụ về ListView</string> <string name="str_btnAdd">Thêm</string> </resources> Và trong main.btnAdd). listItems. ArrayAdapter<String> aa."Hoa Hồng"}. btnAdd.onCreate(savedInstanceState).id.setAdapter(aa). listItems. một Button.arr).java. một Listview có tên lần lượt như sau: txtItem.layout. String currentMenu.

this.deleteItem(index). if (item.getTitle(). item.getText().KEYCODE_DPAD_CENTER) { addItem(txtItem.animal). } } return true. } if (currentMenu=="Flower") { this. item = menu. } if (item.drawable. } } @Override public void onClick(DialogInterface dialog. return true.toString() == int index = listItems. KeyEvent event) { if (event.onCreateOptionsMenu(menu). this. item. } return false. } } SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 36 .onOptionsItemSelected(item).add("Động vật").add("Hoa").animal). int i) { if (currentMenu=="Animal") { this.setIcon(R. } item) "Động vật") { vật nào?". item = menu. } public boolean onOptionsItemSelected(MenuItem { super. } if (item. MenuItem item.flower).addItem(flower[i]). item.ACTION_DOWN && keyCode == KeyEvent. "Hoa") { nào?".getTitle().setIcon(R.drawable. } @Override public void onClick(View v) { if (v == btnAdd) { addItem(txtItem.toString() == currentMenu = "Animal".toString()).setIcon(R. "Xóa") {  Bước 4: viết thêm các hàm xử lý sự kiện: public boolean onKey(View v.getText().toString()).getSelectedItemPosition().displayPopup("Chọn hoa this.toString() == currentMenu = "Flower".flower).getAction() == KeyEvent.getTitle(). return true.displayPopup("Chọn con this.delete).hasSubMenu()==false) { if (item. int keyCode.drawable.add("Xóa"). item = menu.Tìm hiểu lập trình trên Android { super.addItem(animal[i]). this.

show().length()>0) { arr. Toast.Tìm hiểu lập trình trên Android  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.makeText(getApplicationContext().remove(index).setTitle(title). //hiện câu thông báo mờ khi xóa 1 item Toast. String [] item) { Builder builder = new AlertDialog.setItems(item.getItemAtPosition(index). this). arr.add(item).makeText(getApplicationContext(). //hiện câu thông báo mờ khi thêm 1 item vào Toast. itemName + " đã được xóa". aa.notifyDataSetChanged().LENGTH_SHORT). builder.LENGTH_SHORT). } public void addItem(String item) { if (item.show().Builder(this).show(). item + " đã thêm". } }  Bước 6: Chạy chương trình và kết quả như sau: 2-24 SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 37 . aa. builder. Toast. txtItem. } } private void displayPopup(String title.setText(""). builder.notifyDataSetChanged().

1 GIỚI THIỆU INTENTS: Intent là cầu nối giữa các Activity (ứng dụng Android thường bao gồm nhiều Activity. Intent chính là người đưa thư. 4-1 4.Tìm hiểu lập trình trên Android Chương 4.content. giúp chúng ta triệu gọi cũng như truyền các dữ liệu cần thiết để thực hiện một Activity từ một Activity khác. LẬP TRÌNH TRÊN ANDROID 4.1.Intent.1 Thành phần Intents: Thực ra Intent là một cấu trúc dữ liệu được mô tả trong Android. mỗi Activity hoạt động độc lập với nhau và thực hiện những công việc khác nhau). 4-2  Các Action định nghĩa sẵn: SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 38 .

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. dừng lại và chuyển tiếp giữa các Activities trong ứng dụng. Thay vào đó ta hãy dùng ACTION_SEND hay ACTION_SENDTO. 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.2 Sử dụng Intents khởi động cho Activities: 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. Để 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) SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 39 .action. Intents được dùng để bắt đầu.intent.Tìm hiểu lập trình trên Android 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.) 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. Để 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).VIEW”). hay thậm chí dùng luôn hằng action đã định nghĩa sẵn như ACTION_VIEW (hay “Android. 4.1. 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”.

ACTION_DIAL. 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. 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. startActivity(intent). Chỉ được dùng để gọi các Activities trong cùng một app SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 40 . hơn là thực hiện quay số mới.1. intent có thể dùng thuộc tính phụ component để chỉ định đích danh tên lớp sẽ thực thi Activity. Class) và setClassName(Context.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). String) setClassName(String.4 Intent tường minh thực thi Activity Như đã trình bày ở phần trên.3 Intent không tường minh thực thi Activity: 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. 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. Để thực hiện điều này.Uri.) và để hệ thống tự quyết định xem lớp nào (app nào) sẽ thích hợp để đáp ứng intent đó. lớp Intent cung cấp các hàm đó là setComponent(ComponentName) và setClass(Context. etc.1. data. String).Tìm hiểu lập trình trên Android 4-4 4. type. } 4.parse(“tel:555-2368”)).

"ten_lop_ben_trong_package"). intent.BroadcastReceiver. Ví dụ: khởi tạo mới một BroadcastReceivers . Chúng ta có thể sử dụng Broadcast Receivers để nhận.Tìm hiểu lập trình trên Android Intent intent = new Intent(). 4. startActivity(intent). Ví dụ : Intent intent = new Intent(NEW_LIFEFORM_DETECTED). SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 41 . currentLatitude). lifeformType). 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. intent.2 Nhận dữ liệu với Broadcast Receiver: BroadcastReceivers được dùng để nhận dữ liệu từ Broadcast Intents. Intent intent) { //TODO: React to the Intent received. intent. 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. 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.1.1.content. sendBroadcast(intent).content. 4. có khả năng gửi tin đến một tiến trình.putExtra(“latitude”.5 Sử dụng Intents gửi đi thông điệp ra ngoài ứng dụng hoặc Activity: Là một cơ chế truyền tin cấp hệ thống. mở ra các mô hình lập trình hướng sự kiện giữa các ứng dụng. để 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.1. intent. trong các thành phần ứng dụng của chúng ta. để trả lời hoặc phát đi các dữ liệu mà chúng ta muốn.putExtra(“lifeformName”. public class MyBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context.content.Context.Intent.putExtra(“longitude”. import Android.5.setClassName("ten_package". currentLongitude).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. import Android. import Android. 4.

registerReceiver(r.getDoubleExtra(“longitude”. double lng = intent. SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 42 .setLongitude(lng).BURN_IT_WITH_FIRE”. } } }  Đă g ký Broadcast Receivers trong file Manifest: <receiver Android:name = ”.paad.equals(“alien”)) { Intent startIntent = new Intent(BURN. LifeformDetectedBroadcastReceiver r = new LifeformDetectedBroadcastReceiver().putExtra(“latitude”.paad. startIntent. Location loc = new Location(“gps”).action. data). double lat = intent. cập nhật người dùng cuối. loc. filter). 0).LifeformDetectedBroadcastReceiver” > <intent-filter> <action Android:name = ”com. Intent intent) { // Get the lifeform details from the intent.getStringExtra(“type”).NEW_LIFEFORM”/> </intent-filter> </receiver>  Đă g ký Broadcast Receivers sử dụng code: // tạo và đăng ký broadcast receiver.startActivity(startIntent). lng). public class LifeformDetectedBroadcastReceiver extends BroadcastReceiver { public static final String BURN=“com.getDoubleExtra(“latitude”. Ví dụ đoan code sau đây cho thấy cách đăng ký BroadcastReceivers trong code hoặc trong Mainifest. 0). String type = intent. loc. Uri data = intent. context. @Override public void onReceive(Context context.action. if (type. IntentFilter filter = new IntentFilter(NEW_LIFEFORM_DETECTED). alien.Tìm hiểu lập trình trên Android } } Thông thường thì BroadcastReceivers sẽ cập nhật nội dung. startIntent.putExtra(“longitude”. lat).setLatitude(lat).getData(). khởi động dịch vụ . hoặc thông báo người sử dụng bằng cách sử dụng quản lý Notification Manager.

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.nameTextView. SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 43 ..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.simplecursorlayout. và chúng ta cũng có thể tạo ra một Adapter tùy ý bằng cách này. int layoutID = Android. null. null. 4.NAME}.2.parse(uriString). một layout. People.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.R. layotID.NUMBER.id. 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. myListView. String[] fromColumns = new String[] {People.2 Sử dụng Adapter hiển thị dữ liệu: Để áp dụng trong đoạn code sau: ArrayList<String> myStringArray = new ArrayList<String>(). myAdapter = new SimpleCursorAdapter(this. myCursor. ArrayAdapter<String> myAdapterInstance. ArrayAdapter: là một lớp chung để gắn các Adapter Views vào một mảng đối tượng.layout.id. 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.R. null). 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 SimpleCursorAdapter cho phép chúng ta load dữ liệu từ Cursor đến List View. R. myAdapterInstance = new ArrayAdapter<String> (this. fromColumns. 4.simple_list_item_1.setAdapter(myAdapterInstance).1 Một số Adapter : Để sử dụng được Adapter ta phải kế thừa lớp trừu tượng AdapterView. SimpleCursorAdapter myAdapter.Tìm hiểu lập trình trên Android 4.numberTextView}. 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.2. null. int[] toLayoutIDs = new int[] { R.myStringArray).

gọi và truyền giá trị vào Activity2. 4.intent.IntentsDemo. nhận về giá trị được gửi từ Activity2.DEFAULT" /> </intent-filter> </activity> Trong Activity1.xml. } - Hàm nhận giá trị: SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 44 .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. 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().java: xử lý 2 sự kiện. intent. //tự sát activity(có nghĩa là kết thúc nó rồi đấy) //finish(). 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.category.intent.xml.action.IntentsDemo.MAIN" /> <category Android:name="Android.setAction("Calculator").Tìm hiểu lập trình trên Android toLayoutIDs).Activity2" Android:label="@string/app_name"> <intent-filter> <action Android:name="Calculator"></action> <category Android:name="Android.LAUNCHER" /> </intent-filter> </activity> <activity Android:name="com.setAdapter(myAdapter).Activity1" Android:label="@string/app_name"> <intent-filter> <action Android:name="Android. myListView. 4-5 Tiếp theo đăng ký trong Manifest: <activity Android:name="com.category.intent.

Tìm hiểu lập trình trên Android //xử lý kết quả trả về từ Activity Result @Override protected void onActivityResult(int requestCode.setText(strNum2).returnResult). Hàm xử lý khi click Button: @Override public void onClick(View v) { Intent returnResult = new Intent("Calculator"). txtNum2.returnResult).getStringExtra("sA"). txtNum2. // Kiểm tra dữ liệu.getText().putExtra("sA".setText(""). int resultCode.equals("")) setResult(RESULT_CANCELED. // Tính toán với dữ liệu int A = Integer.parseInt(strA).setText("").nếu không gửi mã OK và intent chứa kết quả if(strSum. SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 45 .Hàm nhận giá trị: trong onCreate() // Lấy dữ liệu gửi từ Activity 1 qua intent String strA = getIntent().putExtra("sB".getStringExtra("sB"). strMul). return. Intent data) { //đúng pass không if(requestCode != INTENT_REQUEST_CODE) { txtNum1.getStringExtra("A"). // �?ưa dữ liệu vào Extras của intent returnResult. else setResult(RESULT_OK. // Thông báo kết thúc Activity finish(). nếu rỗng thì gửi mã CANCEL // . String strB = getIntent(). } } Trong Activity2: xử lý 2 sự kiện. String strNum2 = data. gọi và truyền giá trị vào Activity1. strSum). } . String strSum = txtSum.getText().toString().setText("0"). //Thiết lập giá trị mới cho 2 Editbox txtNum1.toString(). returnResult.setText("0"). txtNum2. nhận về giá trị được gửi từ Activity1. // Lấy dữ liệu sau khi đã tính toán String strMul = txtMul.getStringExtra("B").setText(strNum1).equals("") || strMul. } //nếu đúng là intent từ Activity Result else if(resultCode == RESULT_OK){ //Lấy kết quả được trả về String strNum1 = data. } else if(resultCode == RESULT_CANCELED){ txtNum1.

 Content Providers: Thay vì theo cơ chế lưu trữ riêng .toString(mul). // lưu kết quả ra màn hình txtSum. gọn nhẹ.returnCancel).  Files: Android cho phép tạo và tải các tập tin trên thiết bị di động. int sum = A+B.  SQLite Databases: quản lý cấu trúc dữ liệu là cách tốt nhất .user preferences hay application setting.OnClickListener() { @Override public void onClick(View v) { Intent returnCancel = new Intent("Calculator"). strA = Integer. setResult(RESULT_CANCELED. hiệu quả và mạnh mẽ:  Shared Preferences: Khi muốn lưu trữ UI state . Chạy chương trình ta được: 4-6 Kết quả Demo Intents . txtMul.parseInt(strB). 4.Content Providers cung cấp nội dung cho phép đưa ra một giao diện để sử dụng và chia sẻ SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 46 . } }).Tìm hiểu lập trình trên Android int B = Integer. //xử lý nút Reset btnReset.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. strB = Integer.toString(sum).setText(strB).setOnClickListener(new View. 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 đó.setText(strA). int mul = A*B. finish(). Android cung cấp thư viện quan hệ cơ sở dữ liệu SQLite. Shared Preferences cho phép chúng ta lưu trữ nhóm của key/value của dữ liệu gốc. 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.

5.edit().commit(). } 4.Editor. 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. SharedPreferences mySharedPreferences = getSharedPreferences(MYPREFS. Để sửa. // nhận về một editor để sửa đổi shared preferences. protected void savePreferences(){ // tạo đối tượng lưu trữ và truy xuất dữ liệu shared preference int mode = Activity. editor. mode).putBoolean(“isTrue”.putFloat(“lastFloat”.5.putString(“textEntryValue”.2 Truy xuất Shared Preferences Để lưu truy cập Shared Preferences thì cũng dùng phương thức getSharedPreferences . SharedPreferences. lưu gọi commit trên Editor.như doạn code sau: public static final String MYPREFS = “mySharedPreferences”. shared preference editor.putLong(“aNumber”. editor. SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 47 . // Commit the changes.MODE_PRIVATE.5 LƯU TRỮ DỮ LIỆU ỨNG DỤNG MỘT CÁC key/value. Chúng ta có thể truy cập Content Providers để sử dụng hệ thống được phép.Editor editor = mySharedPreferences. editor. editor. 4.Tìm hiểu lập trình trên Android dữ liệu cá nhân. // lưu trữ vào . 1f).1 Tạo và lưu dữ liệu với Share Preferences: Để 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. Để sửa đổi Shared Preferences Chúng ta gọi lớp Shared Preferences. dùng phương thức type-safe get<type> để trích xuất các giá trị lưu. ĐƠN GIẢN: Có hai cơ chế để lưu dữ liêu trong Android là lưu theo kiểu name/value hoặc 4.putInt(“wholeNumber”. 3l). 2).đưa vào tên Shared Preferences muốn thay đổi.đưa vào tên của Shared Preferences mà Chúng ta muốn truy cập. true). nhận đối tượng Editor bằng cách gọi edit trong đối tượng ShardePreferences muốn thay đổi. “Not Empty”). editor.

Lưu trữ các giá trị này ta dùng phương SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 48 . } 4.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 .2. //lấy ID text view TextView myTextView = (TextView)findViewById(R.editor.toString()). Chúng ta có thể dùng tham số Bundle để lưu trữ các giá trị.MODE_PRIVATE).getFloat(“lastFloat”.getString(“textEntryValue”.putString(“currentTextValue”. mà không cần phải chỉ định preferences name.commit(). 1). Việc truy xuất tới SharedPreferences bị giới hạn trong phạm vi một Activity. stringPreference = mySharedPreferences.id. // Retrieve an editor to modify the shared preferences. } 4.5.getPreferences(). // áp dụng thay đổi editor. // nhận giá trị boolean isTrue = mySharedPreferences.“”).getInt(“wholeNumber”. 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. String stringPreference.MODE_PRIVATE. myTextView. mode).getText(). float lastFloat = mySharedPreferences.5.getLong(“aNumber”.edit().myTextView).Editor editor = activityPreferences. long aNumber = mySharedPreferences. int wholeNumber = mySharedPreferences. SharedPreferences. 0). // // nhập giá trị mới vào đối tượng Shared Preferences . Chúng ta có thể gọi Activity. SharedPreferences mySharedPreferences = getSharedPreferences(MYPREFS.Tìm hiểu lập trình trên Android Ví Dụ: public void loadPreferences() { // lấy về đối tượng Shared Preferences int mode = Activity. mổi Actitvity chỉ hỗ trợ một SharedPreferences không được đặt tên. false). 0f).2.getBoolean(“isTrue”.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.

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ũng cung 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. if (icicle != null && icicle. myTextView.putString(TEXTVIEW_STATE_KEY. Ví dụ thể hiện ở đoạn code sau: private static final String TEXTVIEW_STATE_KEY = “TEXTVIEW_STATE_KEY”.main). //mở một file mới FileOutputStream // đọc file. } 4.id.đ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.containsKey(TEXTVIEW_STATE_KEY)) text = icicle. TextView myTextView = (TextView)findViewById(R. Context. // lưu trạng thái thể hiện của textview 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.onSaveInstanceState(outState).MODE_PRIVATE). myTextView. String text = “”.tmp”.toString()).getText().myTextView).getString(TEXTVIEW_STATE_KEY). super.Tìm hiểu lập trình trên Android 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. FileInputStream fis = openFileInput(FILE_NAME).onCreate(icicle). @Override public void onCreate(Bundle icicle) { super. như đoạn code dưới đây: String FILE_NAME = “tempfile.myTextView). setContentView(R. @Override public void onSaveInstanceState(Bundle outState) { TextView myTextView = (TextView)findViewById(R.id.setText(text). SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 49 .layout. fos = openFileOutput(FILE_NAME.

<tên file>).openRawResource(R.io.6.6.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.MODE_APPEND.2 Các công cụ quản lý tập tin 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. FileOutputStream fos = openFileOutput(OUTPUT_FILE. Sử dụng SQLite có thể tạo cơ sở dữ liệu quan hệ độc lập cho mỗi ứng dụng. 4.Trong số những tiện ích này nằm trong gói java.  deleteFile: xóa tập tin được tạo bởi ứng dụng hiện hành. Context. 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.raw như sau: Resources myResources = getResources().  fileList: trả về mảng các tập tin được tạo bởi ứng dụng hiện hành.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. để thêm một tập tin hiện có thì xác định cơ chế Context.MODE_WORD_READABLE hoặc Context.File . để nhận được một InputStream dựa trên các quy định nguồn.raw. SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 50 .txt”. Để 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.1 Truy xuất các tập tin trong Resources: 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.MODE_WORLD_WRITEABLE). 4. đưa vào một filename là tên biến từ lớp R. ngoài ra chúng ta có thể chỉ định một Context. Theo mặc định.Tìm hiểu lập trình trên Android 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. InputStream myFile = myResources. 4. 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.

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. nó cũng được coi là:  Mã nguồn mở  Tiêu chuẩn  Gọn nhẹ  Đơn lớp 4. 4. getPosition: trả về vị trí con trỏ SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 51 . 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. 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. 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. moveToPrevious: chuyển con trỏ tới dòng duyệt trước đó.Tìm hiểu lập trình trên Android 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.7. nhưng không giới hạn. Truy vấn trong Android được trả về là đối tượng Cursor.1 Giới thiệu SQLite: SQLite là hệ thống quản lý các quan hệ cơ sở dữ liệu (RDBMS). Thay vì giải nén và trả lại một bản sao của các giá trị kết quả. 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. getCount :trả về số dòng của kết quả truy vấn.7.2 Cursors và Content Values: 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.

} catch (SQLiteException ex){ db = dbHelper. Context.” + “column_one text not null).db”. } 4. SQLiteDatabase db. DATABASE_NAME.getWritableDatabase(). DATABASE_VERSION). null. private static final String DATABASE_CREATE = “create table “ + DATABASE_TABLE + “ ( _id integer primary key autoincrement.3 và ID SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 52 .Tìm hiểu lập trình trên Android Khi muốn bắt đầu vòng đời hoạt động của Cursor thì gọi phương thức :startManagingCursor :stopManagingCursor. truy xuất và cập nhật cở sở dữ liệu. null).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.7. vào kết thúc vòng đời con trỏ thì gọi 4. try { db = dbHelper.5 Truy vấn cơ sở dữ liệu Ví Dụ: // trả về tất cả các cột 1. private void createDatabase() { myDatabase = openOrCreateDatabase(DATABASE_NAME.7.”.4 Truy xuất và tạo Cơ sở dữ liệu không dùng SQLiteHelper: 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. } 4.execSQL(DATABASE_CREATE).getReadableDatabase().3 Sử dụng SQLiteOpenHelper: SQLiteOpentHelper là một lớp trừu tượng và là môi trường tốt để tạo.7. myDatabase. private static final String DATABASE_TABLE = “mainTable”.MODE_PRIVATE. SQLiteDatabase myDatabase.

order). newValues). Cursor myResult = myDatabase. null. null.moveToNext()). null.query(DATABASE_TABLE. null. String order = KEY_COL5.7 Thêm.insert(DATABASE_TABLE. null. } float averageHoard = totalHoard / myGold.moveToFirst()) { do { float hoard = myGold. result_columns. 4. 4. float totalHoard = 0f. DATABASE_TABLE. null.. null). newValue).getCount().put(COLUMN_NAME. where. null. null.Tìm hiểu lập trình trên Android String[] result_columns = new String[] {KEY_ID.6 Lấy kết quả từ Cursors Ví dụ: int GOLD_HOARDED_COLUMN = 2. totalHoard += hoard. null.. Cursor myGold = myDatabase. KEY_COL3}. các cột khác tương tự . null. KEY_COL1. ] // thêm vào CSDL myDatabase.7.query(true. [ . null. null). if (myGold. cập nhật và xóa dòng:  Thêm: ContentValues newValues = new ContentValues(). SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 53 . null. null. null.. Cursor allRows = myDatabase. newValue).put(COLUMN_NAME.getFloat(GOLD_HOARDED_COLUMN).query(“GoldHoards”.  Cập nhật: ContentValues updatedValues = new ContentValues(). //đưa giữ liệu vào content newValues.7. null. // đưa giữ liệu vào content updatedValues.. //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. } while(myGold.

import Android. where. DATABASE_VERSION). // câu SQL tạo bảng private static final String DATABASE_CREATE = “create table “ + DATABASE_TABLE + “ (“ + KEY_ID + “ integer primary key autoincrement.database. 4. public static final String KEY_NAME=”name”. public static final String KEY_ID=”_id”. null. //database helper private myDbHelper dbHelper.Tìm hiểu lập trình trên Android [ .util.. public static final int NAME_COLUMN = 1. “ + KEY_NAME + “ text not null). // khóa chính. // TODO: Create public field for each column in your table.content..update(DATABASE_TABLE. KEY_ID + “=” + rowId.sqlite. import Android.7. // cập nhật.Log.Context. import Android. // biến Database private SQLiteDatabase db. private static final String DATABASE_TABLE = “mainTable”.database. dbHelper = new myDbHelper(context. DATABASE_NAME.  Xóa dòng: myDatabase.*. null).SQLiteDatabase. public class MyDBAdapter { private static final String DATABASE_NAME = “myDatabase. // áp dụng cho ứng dụng nào private final Context context.8 Thao tác trên cơ sở dữ liệu Android import Android. import Android.”. private static final int DATABASE_VERSION = 1.CursorFactory..database.sqlite. myDatabase. // tên và chỉ só cột. } SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 54 .*. ] String where = KEY_ID + “=” + rowId. null). updatedValues.db”. public MyDBAdapter(Context _context) { context = _context.. các cột khác tương tự.delete(DATABASE_TABLE.

} public void close() { db.close(). } //gọi khi database có phiên bản mới @Override public void onUpgrade(SQLiteDatabase _db. KEY_NAME}. version). null). null. return objectInstance. ContentValues contentValues = new ContentValues().insert(DATABASE_TABLE. null. int version) { super(context. } public MyObject getEntry(long _rowIndex) { MyObject objectInstance = new MyObject(). MyObject _myObject) { String where = KEY_ID + “=” + _rowIndex. contentValues. } public long insertEntry(MyObject _myObject) { ContentValues contentValues = new ContentValues(). where. factory. } public Cursor getAllEntries () { return db. KEY_ID + “=” + _rowIndex. CursorFactory factory. } public int updateEntry(long _rowIndex.getWritableDatabase().execSQL(DATABASE_CREATE). return this. null. name. } public boolean removeEntry(long _rowIndex) { return db. null.update(DATABASE_TABLE.delete(DATABASE_TABLE. } private static class myDbHelper extends SQLiteOpenHelper { public myDbHelper(Context context.query(DATABASE_TABLE. null) > 0. contentValues).Tìm hiểu lập trình trên Android public MyDBAdapter open() throws SQLException { db = dbHelper. int _oldVersion. SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 55 . return db. } // Called when no database exists in @Override public void onCreate(SQLiteDatabase _db) { _db. String name. null. new String[] {KEY_ID. null). return db.

_db. //tạo csdl mới onCreate(_db). cập nhật và xóa dòng: Đươc thể hiện qua các đoạn code sau: SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 56 .7.9 Giới thiệu Content Providers Sử dụng Content Provider bằng lớp ContenResolver.CONTENT_URI. Log. order).2 Thêm. //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.Tìm hiểu lập trình trên Android int _newVersion) { // Log the version upgrade. null.9. null).execSQL(“DROP TABLE IF EXISTS “ + DATABASE_TABLE).CONTENT_URI. null.9.null. Cursor someRows = getContentResolver(). // lấy tất cả dòng Cursor allRows = getContentResolver(). which will destroy all old data”). where. 4. null.query(MyProvider. ContentResolver cr = getContentResolver(). null.query(MyProvider. } } } 4. 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.7. String order = KEY_COL5. 4. Sử dụng phương pháp query trên đối tượng ContentResolver.w(“TaskDBAdapter”.1 Truy vấn trong Content: Như trong cơ sở dữ liệu.7. “Upgrading from version “ + _oldVersion + “ to “ + _newVersion + “. kết quả tìm kiếm sẽ được trả về Cursors trong một tập kết quả.

4. int count = getContentResolver().insert(MyProvider.put(COLUMN_NAME. // xóa 5 dòng String where = “_id < 5”..bulkInsert(MyProvider. where.CONTENT_URI.CONTENT_URI. // tạo dòng cho việc thêm ContentValues[] valueArray = new ContentValues[5].update(MyProvider.put(COLUMN_NAME. valueArray).delete(myRowUri.delete(MyProvider. lặp lại tương tự như những cột khác . [ . null).3 Sử dụng Media Store Provider Các Android Media Store quản lý tập tin hình ảnh. // cho vào csdl newValues. getContentResolver().  Xóa: // xóa dòng xác định getContentResolver().CONTENT_URI. // cập nhật cho 5 dòng String where = “_id < 5”. ] Uri myRowUri = getContentResolver(). where.. null. newValues. newValues). newValue).Tìm hiểu lập trình trên Android  Thêm : // tạo contentvalues ContentValues newValues = new ContentValues(). newValue). getContentResolver().. SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 57 . 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. kho video.  Cập nhật: ContentValues newValues = new ContentValues(). newValues. âm thanh.9.7..CONTENT_URI. null). null).

int phoneIdx = cursor. String[] result = new String[cursor. 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.moveToNext()).query(People. 4.insertImage( getContentResolver(). result[cursor.Tìm hiểu lập trình trên Android Lớp MediaStore bao gồm một số phương pháp tiện lợi để đơn giản hóa các tập tin chèn vào Media Store. null.7. // quản lý cursor startManagingCursor(cursor).provider. null. // lấy chỉ số cột int nameIdx = cursor. null).getString(phoneIdx). “my_cat_pic”.moveToFirst()) do { //lấy tên String name = cursor.9.NUMBER).MediaStore. Activity’s một con trỏ đến tất cả mọi người trong cơ sở dữ liệu liên lạc. // lấy dữ liệu vào cursor Cursor cursor = getContentResolver().CONTENT_URI.9. “Photo of my cat!”). 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. // số điện thoại.Images.7.getColumnIndexOrThrow(People. null. if (cursor.getString(nameIdx). đ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.Media.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. 4.getPosition()] = name + “ (“ + phone + “)”.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>”/> SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 58 . Ví dụ. sourceBitmap. Trong ví dụ sau.getCount()]. String phone = cursor.NAME). } while(cursor. getColumnIndexOrThrow(People.

1 Sử dụng dịch vụ định vị Location Based Services (LBS) là một thuật ngữ chung dùng để mô tả sự khác nhau về kỹ thuật.  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ị. LOCATION BASED SERVICES 4. thì phần cứng là ảo và chúng ta có thể ở trong những vị trí khá giống nhau.  Đặ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. Ta có thêm một lớp BookProvider. SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 59 . Cụ thể Code có thể tham khảo ở CD kèm theo. Hiển thị lên ListView để người dùng nhận thấy. GEOCODING. 4. Sử dụng Location Manager ta có thể :  Xác định vị trí.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.  Theo dõi sự chuyển động.2 Cài đặt trên môi trường giả lập với Test Providers 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. Ứng dụng có tên là Android_ContentProviderUserDemo. 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.9. 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. Khi phát triển và kiểm thử với các môi trường giả lập.Tìm hiểu lập trình trên Android 4. 4.java kế thừa ContentProvider để thao tác với dữ liệu.9.3 Cập nhật vị trí với Emulator Location Providers 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. xóa và thêm sách mới.9. và dùng để tìm vị trí thiết bị hiện hành. 4.9 MAPS..

gpsProvider = locationManager. Để có được đối tượng LocationProvider ta gọi getProvider và truyền vào tên Provider. 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í. mỗi kỹ thuật. 4. 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.Tìm hiểu lập trình trên Android Hình 4-7 Trong hình trên có các tab Manual. 4.9. tốc độ.NETWORK_PROVIDER SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 60 . sự chính xác hoặc các thông tin liên quan.4 Chọn một Location Provider Tùy thuộc vào thiết bị mà có những kỹ thuật riêng. mỗi Location Provider sẽ cung cấp những khả năng khác nhau như xác định độ cao. LocationManager.5 Tìm một Providers có sẵn 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. LocationProvider gpsProvider.getProvider(providerName). KML và GPX Sử dung tab Manual chúng ta có thể xác định vĩ độ/ kinh độ. Android có thể dùng để xác định vị trí hiện tại.GPS_PROVIDER LocationManager.GPS_PROVIDER. Ví dụ dưới đây thì Provider là GPS_PROVIDER String providerName = LocationManager.9.

Criteria criteria = new Criteria(). criteria.9. chi phí và yêu về cầu năng lương điện. hoặc chỉ lấy một Provider đầu tiên.getProviders(enabledOnly).6 Tìm kiếm một Provider theo tiêu chí 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 độ. criteria. tốc độ. locationManager = (LocationManager)getSystemService(serviceString).getBestProvider(criteria. sử dụng getBestProvider nhà cung cấp sẽ trả lại các tiêu chí tốt nhất.setAltitudeRequired(false).Tìm hiểu lập trình trên Android Để có danh sách tất cả tên của nhà cung cấp trên thiết bị ta gọi getProvider. List<String> matchingProviders = locationManager.setCostAllowed(true). độ cao. criteria.setSpeedRequired(false).7 Tìm một địa chỉ (Finding Your Location) Mục đích của dịch vụ định vị là tìm ra vị trí vật lý của thiết bị.setBearingRequired(false). 4.getProviders(criteria. Để 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. 4. boolean enabledOnly = true. 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. List<String> providers = locationManager.setAccuracy(Criteria.setPowerRequirement(Criteria.false). true).POWER_LOW). criteria. String bestProvider = locationManager. SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 61 .LOCATION_SERVICE. sử dụng Boolean để biết nếu chúng ta muốn tất cả. criteria. 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. LocationManager locationManager.ACCURACY_COARSE). criteria.9.

9. khi vị trí hiện tại thay đổi chúng ta sử dụng một LocationListener. } public void onProviderDisabled(String provider){ // Update application if provider disabled.ACCESS_COARSE_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. Location location = locationManager. Ví dụ: String provider = LocationManager.getLastKnownLocation(provider). LocationListener 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.permission. int t = 5000.ACCESS_FINE_LOCATION”/> <uses-permission Android:name=”Android. thực hiện và đăng ký để nhận thông tin. // milliseconds int distance = 5. } public void onProviderEnabled(String provider){ // Update application if provider enabled. // meters LocationListener myLocationListener = new LocationListener() { public void onLocationChanged(Location location) { // Update application based on new location. 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. } SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 62 . Đ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.GPS_PROVIDER. 4. String provider = LocationManager.8 Theo dõi sử di chuyển (Tracking Movement) Sử dụng phương thức requestLocationUpdate để cập nhật bất kỳ một vị trí.permission.GPS_PROVIDER.Tìm hiểu lập trình trên Android 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.

Tìm hiểu lập trình trên Android public void onStatusChanged(String provider. Locale. một danh sách các đối Locale. double latitude = location. 4.GPS_PROVIDER ). } }. Mỗi danh sách có thể chứa nhiều kết quả. int status. SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 63 . t.getDefault()). myLocationListener).getLastKnownLocation(LocationManager.  Reverse Geocoding: chuyển địa chỉ ra vĩ độ. double longitude = location. Reverse Geocoding sẽ trả về một danh sách địa chỉ phù hợp.9. 4. vĩ độ.Bundle extras){ // Update application if provider hardware status changed. Để 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. Đ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 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ẽ.9.9 Sử dụng Goecoder 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 độ.requestLocationUpdates(provider.10 Reverse Geocoding Trả về địa chỉ khi được cung cấp kinh độ. Location = locationManager. Cả hai chức năng mã hoá địa lý trả về tượng Address. distance.getLongitude(). Geocoder gc = new Geocoder(this. 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.getLatitude(). 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ỉ. kinh độ. locationManager. List<Address> addresses = null. Cách tạo một Geocoder: Geocoder geocoder = new Geocoder(getApplicationContext().getDefault()).

s. gọi getFromLocationName trên trường Geocoder. 10). try { locations = fwdGeocoder. 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 độ. try { locations = fwdGeocoder.n. 10). List<Address> locations = null.US). 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. 10. } catch (IOException e) {} 4. longitude.11 Forward Geocoding Để tra cứu Forward Geocoding. Locale. e. String streetAddress = “160 Riverside Drive.getFromLocationName(aStreetAddress.getFromLocationName(streetAddress.Tìm hiểu lập trình trên Android try { addresses = gc. Đư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.9. 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. SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 64 . như thể hiện trong đoạn code sau: Geocoder fwdGeocoder = new Geocoder(this. như thể hiện trong đoạn code dưới đây: List <Address>result = geocoder. } catch (IOException e){} //để có nhiều địa chỉ.getFromLocationName(streetAddress. New York”. sử dụng getFromLocationName List<Address> locations = null.getFromLocation(latitude. maxResults). New York. chúng ta sẽ nhận được các địa chỉ thích hợp.

lp).setSatellite(true).getZoomControls(). int latSpan = mapView. int longSpan = mapView.12 Dùng MapView 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. nó có được sử dụng qua mạng như bản đồ là sự di chuyển và thu nhỏ. View zoomControls = mapView.setStreetView(true).addView(zoomControls. ví dụ MapView hỗ trợ chế độ vệ tinh. mapView.getLongitudeSpan(). 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.setTraffic(true). mapView.getLatitudeSpan().9.Tìm hiểu lập trình trên Android Hình 4-8 4. mapView. cũng như các điểm trung tâm và hiện đang nhìn thấy và khoảng vĩ độ (ở dạng thập phân). GeoPoint center = mapView. Chúng ta cũng có thể hiển thị bản đồ điều khiển zoom một cách tùy ý. chế độ xem đường phố. giống như phiên bản web của Google Maps. MapView hiển thị giao diện của bản đồ.getMapCenter(). 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. và chế độ giao thông ta khai báo như sau: mapView. mapView. SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 65 .displayZoomControls(true).

9.maps. private MapController mapController. import Android.Android.Bundle.Android.os.MapController. Đ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.Android. Overriding phương thức onCreate đặt ra các màn hình bao gồm một MapView.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 đồ.maps.maps.google.13 Dùng MapActivity MapActivity là một lớp cơ bản.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. SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 66 . chúng ta chỉ có thể sử dụng một MapView trong MapActivity.MapView. trong thẻ <Aplication>: <uses-library Android:name=”com. Để 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.google.maps.onCreate(icicle). @Override public void onCreate(Bundle icicle) { super. import com.Android. public class MyMapActivity extends MapActivity { private MapView mapView. và ghi đè lên isRouteDisplayed để trả về true nếu Activity sẽ được hiển thị thông tin định tuyến.Android. nó hoàn toàn miễn phí.Tìm hiểu lập trình trên Android MapView là một ViewGroup hãy khai báo nó trong XML. 4. import com. <com.google.maps”/> MapView điều khiển chỉ có thể được sử dụng trong một Activity mở rộng MapActivity.google.google.MapActivity.

google. import com.Android. 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.9.google.Tìm hiểu lập trình trên Android setContentView(R.Overlay. Để 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.maps.layout.14 Sử dụng Overlay Overlay là một cách để thêm các chú thích và xử lý nhấn vào MapView. public class MyOverlay extends Overlay { @Override public void draw(Canvas canvas.MapView.id. import com. return false.map_layout).Canvas. Otherwise return false.Android.graphics. MapView mapView. } @Override protected boolean isRouteDisplayed() { // IMPORTANT: This method must return true if your Activity // is displaying driving directions.maps.map_view). } } Hình 4-9 4. mapView = (MapView)findViewById(R. boolean shadow) { if (shadow == false) { SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 67 .

.... vẽ tên lớp dưới. } } 4. lng. Phương thức setCenter sẽ nhảy tới một vị trí mới ta sử dụng như sau: mapController..084095*1E6.. như trong đoạn mã sau đây: Double lat = 37.. chúng ta cần phải chuyển đổi chúng sang microdegrees và lưu trữ chúng như GeoPoints.15 Dùng MapController Dùng MapContrller để quay và phóng to một MapView.9.animateTo(point) SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 68 . Double lng = -122.setZoom(1). ] } else { [ . 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.422006*1E6. 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.getController().intValue()). ] } } @Override public boolean onTap(GeoPoint point. GeoPoint point = new GeoPoint(lat. 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. bóng mờ .setCenter(point).intValue(). dùng getController như đoạn code sau: MapController mapController = myMapView.Tìm hiểu lập trình trên Android [ . trong đó vĩ độ và kinh độ đo bằng microdegrees. vẽ trên lớp trên cùng của layout . mapController. 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..

16 Chú ý khi tạo một ứng dụng có sử dụng MapView Không giống như cách tạo và chạy ứng dụng như các chương trước.keystore Vào Windows > Prefs > Android > Build để lấy đường dẫn như bên dưới SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 69 .9. có một sự khác biệt nho nhỏ khi chạy ứng dụng MapView đó là việc chọn Emulator hay chọn các Emulator có hỗ trợ Google APIs. sau đây là cách lấy key (chúng ta phải kết nối Internet) :  Lấy debug.Tìm hiểu lập trình trên Android 4. Hình 4-10 Tạo emulator hỗ trợ Geocoder và MapView Một chú ý nữa đó là phải có <Android:apiKey> khi dùng MapView.

html dán MD5 fingerprint code vào và click Generate API key . Máy nghe nhạc MP3. 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. và kiểm soát bởi các thành phần ứng dụng khác.10 LÀM VIỆC TRÊN BACKGROUND 4. vì vậy cần phải được bắt đầu.com/Android/maps-api-signup. 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. site sẽ tự sinh cho chúng ta 1 key.google. 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). 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. Tuy không có giao diện trực quan nhưng Serviecs vẫn có thể được bắt đầu. Services trình bày một giao diện đồ họa phong phú cho người dùng.Tìm hiểu lập trình trên Android  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.10.1 Giới Thiệu Services Không giống như các hoạt động khác. Activities và Broadcast Receivers. Sevices có thể là câu trả lời. 4. Services chạy trên nền cập nhật Content Providers. dừng lại. 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 SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 70 . đóng Intent và kích hoạt thông báo. không hoạt động hoặc bị tắt. Các Services được thiết kế để chạy nền.

10. import Android.Tìm hiểu lập trình trên Android startServices.Service. Chúng ta cần ghi đè lên onBind và onCreate như trình bày sau đây: import Android. 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=”.app.Intent. dưới đây là thể hiện phương thức ghi đè lên onStart như sau: @Override public void onStart(Intent intent.MY_ACTION)). Sau đó sẽ học cách để ràng buộc một Services cho một Activity.IBinder. public class MyService extends Service { @Override public void onCreate() { // TODO: Actions to perform when service is created.10.3 Khởi chạy.os. return null. Điều này sẽ được gọi bất kỳ khi nào Services được bắt đầu khi gọi đến startService.content. 4.2 Tạo Service Để 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ở. } @Override public IBinder onBind(Intent intent) { // TODO: Replace with service binding implementation. import Android. điều khiển và tương tác với Sercice Để khởi chạy một Service chúng ta gọi startService.MyService”></service> 4. SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 71 . } } Trong hầu hết các trường hợp chúng ta nên ghi đè lên onStart. 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 minh startService(new Intent(MyService. cung cấp một giao diện phong phú hơn cho tương tác.

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. // dừng service tường minh try { Class serviceClass = Class. service. để chấm dứt thì sử dụng stopService không kể là bao nhiêu lần startService đã được gọi. serviceClass)).getClassName()).class)). Liên kết này có sẵn cho các hoạt động. MyService.this.class)). ComponentName service = startService(new Intent(this. 4. // sử dụng tên service để dừng Service. nó cho phép gọi một phương thức trên Service đang chạy. } SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 72 . } catch (ClassNotFoundException e) {} Nếu startService được gọi thì Service đó đang được chạy. BaseballWatch. Để dừng một Service ta gọi stopService. @Override public IBinder onBind(Intent intent) { return binder. Để 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(). stopService(new Intent(this. sẽ được thừa hưởng tất cả từ giao diện với một Service. stopService(new Intent(this.10.getClass())). } public class MyBinder extends Binder { MyService getService() { return MyService. phương thức onStart của Service được thực hiện một lần nữa.forName(service.Tìm hiểu lập trình trên Android // khởi tạo tườngm inh startService(new Intent(this.4 Kết nối Activities với Services 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 đó. đưa vào một Intent để xác định các Service ngăn chặn.

Để 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. Context.Tìm hiểu lập trình trên Android } Sự kết nối giữa các Service và các hoạt động được thể hiện như một Serviceconnection. SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 73 .class). } public void onServiceDisconnected(ComponentName className) { // khi ngắt kết nối. IBinder service) { // được gọi khi kết nối được tạo. 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.MyBinder)service). } }.getService().this. } 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. serviceBinder = ((MyService. MyService. mConnection. // Bind to the service Intent bindIntent = new Intent(MyActivity. serviceBinder = null.BIND_AUTO_CREATE). // liên kết với service private MyService serviceBinder. Ta cần phải thực hiện một ServiceConnection mới.onCreate(icicle). bindService(bindIntent. // điều khiển kết nối giữa Acitivity và Service private ServiceConnection mConnection = new ServiceCo nnection() { public void onServiceConnected(ComponentName className.

NotificationManager notificationManager.  Đèn Flash/LEDs.  Ân thanh báo động(nhạc chuông. notificationManager (NotificationManager)getSystemService(svcName).  Hiển thị thêm thông tin trong cửa sổ mở rộng của 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. Thông báo được xử lý bởi các Manager Notification. Hình 4-11 4.10.5 Giới thiệu Thông báo trong Android 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.10. 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.  Điện thoại rung. 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.âm thanh thông tin lưu trữ). để 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.6 Giới thiệu Notification Manager Notification Manager là một hệ thống dịch vụ được sử dụng để xử lý các thông báo.Tìm hiểu lập trình trên Android 4. = SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 74 .NOTIFICATION_SERVICE.

hoặc loại bỏ những cái không còn cần thiết hoặc không mong muốn. Đ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. // The extended status bar orders notification in time order long when = System. Notification notification = new Notification(icon. Context context = getApplicationContext(). MyActivity. 4. // Intent để khởi chạy activity khi cửa sổ thông báo mở rộng được click Intent intent = new Intent(this. when). SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 75 . 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ú ý.7 Tạo thông báo 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. 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.10. // chuỗi hiện khi mở rộngcửa sổ thông báo String expandedText = “Extended status text”. 0). Thứ hai. sửa đổi những cái hiện có. chúng ta có thể kích hoạt thông báo mới.Tìm hiểu lập trình trên Android Sử dụng Manager thông báo.class). tickerText.currentTimeMillis(). // tiêu đề của String expandedTitle = “Notification Title”. 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. 0. PendingInten tlaunchIntent= PendingIntent.intent. 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.getActivity(context. 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.drawable.icon. // chuỗi xuất hiện khi chạy thông báo String tickerText = “Notification”.

4. Cuối cùng.cancel(notificationRef). 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. notification). notificationManager. chuông). Thiết lập giá trị này lớn hơn 1. 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. 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.expandedTe xt.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ố.8 Kích hoạt thông báo Để 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.number++. 4. để loại bỏ các lớp phủ(các thông báo phủ lên nhau). âm thanh và hình ảnh được lưu trữ tại cục bộ trong một ứng dụng. như thể hiện sau: notificationManager.Tìm hiểu lập trình trên Android notification. ta thiết lập giá trị là 0 hoặc -1 notification. 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. 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.10. Android hỗ trợ các định dang đa phương tiện sau đây: SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 76 . như trong đoạn code sau: int notificationRef = 1.expandedTitle.notify(notificationRef. rung điện thoại. launchIntent). và âm thanh (nhac. 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.setLatestEventInfo(context.

try { mpFile.start(). MP3. PNG.System. tạo một phương thức tĩnh (static) làm việc như shortcuts. ta gọi release để giải phóng tài nguyên liên quan như trình bày sau: SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 77 . MediaPlayer mpFile = new MediaPlayer(). 3GPP. tạm dừng và phương thức tìm kiếm cũng như phương thức tìm vị trí.start(). mpFile. đia chỉ của tập tin. Để lặp vòng hoặc phát lặp lại ta sử dụng phương thức setLooping.raw.prepare().Tìm hiểu lập trình trên Android JPEG. hoặc từ mạng URI. Một khi chúng ta không sử dụng Media Player.my_sound). mpFile. 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. Media Player bao gồm các chức năng dừng lại. 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.setDataSource(MEDIA_FILE_PATH). 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 .DEFAULT_RINGTONE_URI.1 Chơi nhạc Đa phương tiện trong Android được xử lý bởi lớp MediaPlayer. ta tạo mới một Media Player. Mpeg 4. } catch (IllegalArgumentException e) {} catch (IllegalStateException e) {} catch (IOException e) {} Ngoài ra. thời gian và kích thước hình ảnh của các thông tin liên quan. OGG. Để chơi nhạc. Một Media Player được gọi để bắt đầu chơi như thể hiện sau đây: mpRes. R.start(). Bitmap 4.11. Chúng ta có thể xem lại các thông tin được lưu trữ trong ứng dụng.toString().create(context. mpFile.

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. định dạng đầu ra.release(). ứng dụng của chúng ta cần được cấp phép RECORD_AUDIO hoặc RECORD_VIDEO.11. // thiết lập bộ mã hóa âm thanh để sử dụng mediaRecorder.2 Ghi âm Ghi âm được xử lý bởi lớp MediaRecorder để ghi âm thanh hoặc video. 4. // lấy nguồn video mediaRecorder. SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 78 . ta gọi prepare bằng phương thức start như sau: mediaRecorder. Để bắt đầu ghi âm.permission. // thiết lập định dạng đầu ra mediaRecorder. tỷ lệ khung hình.AudioSource.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). 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.prepare().release().DEFA ULT).setAudioEncoder (MediaRecorder. Thêm một thẻ uses-permission trong ứng dụng manifest như sau: <uses-permission Android:name=”Android. Khi chúng ta xác định đầu vào và định dạng đầu ra.mp4”).RECORD_AUDIO”/> <uses-permission Android:name=”Android.start(). kích thước video.AudioEncoder. video và thu âm video để sử dụng.setOutputFormat(MediaRecorder.MIC).OutputFormat. mediaRecorder. 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.Tìm hiểu lập trình trên Android mpRes.setAudioSource(MediaRecorder.permission. mpFile.DEFAULT).

“TheSoundandtheFury”).mp4”).permission. thời gian.AudioColumns. content.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ể. Khi thông tin của một tập tin được lưu trữ. mediaRecorder. System.put(MediaStore.put(Audio. tiếp theo là release để giải phóng nguồn tài nguyên máy ghi âm.Media.CAMERA”/> SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 79 . 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ệ.DATE_ADDED. Uri uri = resolver. mã địa lý cho tập tin mới như thể hiện trong đoạn code sau đây: ContentValues content = new ContentValues(3).uri)).DATA. content. Có thể truy cập vào ContentResolver của ứng dụng.release().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. sử dụng để thêm một dòng mới vào MediaStore như trong đoạn code sau: ContentResolver resolver = getContentResolver().EXTERNAL_CONTENT_URI. 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.insert(Audio. mediaRecorder.ACTION_MEDIA_SCANNER_SCAN_FILE. 4.Tìm hiểu lập trình trên Android Khi hoàn thành ta gọi stop để kết thúc. “audio/amr”).MIME_TYPE. content.Media. Bây giờ thật là khó. Để 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.put(Audio.stop().Audio.AudioColumns. Chúng ta cũng cần phải chỉ ra đường dẫn cho tâp tin được tạo: content. 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.currentTimeMillis() / 1000).“myoutputfile.Media.TITLE. content).put(Audio.

4.stopPreview().setPreviewCallback(new PreviewCallback() { SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 80 . Chúng ta có thể sử dụng phương thức set* trên thông số để quay trở lại thiết lập các sửa đổi. Để áp dụng sự thay đổi ta gọi setParameters đưa vào các giá trị thay đổi như sau: Camera.setParameters(parameters). sử dụng phương thức tĩnh open trên lớp Camera.12. đưa vào một PreviewCallback mới thực hiện ghi đè lên phương thức onPreviewFrame như trình bày sau: camera. Gọi phương thức setPreviewCallback trên đối tượng Camera.12. parameters. 4.Parameters để thiết lập cho Camera hiện hành.setPictureFormat(PixelFormat. camera.release().setPreviewDisplay(mySurface).Parameters parameters = camera.startPreview().JPEG). Khi đã hoàn thành với Camera. để kết thúc dịch vụ này ta gọi release sử dụng các mô hình đơn giản thể hiện trong đoạn code sau: Camera camera = Camera.Tìm hiểu lập trình trên Android Để truy cập vào dịch vụ Camera.2 Sử dụng máy ảnh Truy cập vào các video của máy ảnh có nghĩa là chúng ta có thể kết hợp trực tiếp các video vào các ứng dụng của chúng ta.1 Cài đặt điều khiển camera Đã có sẵn một đối tượng Camera. Gọi phương thức getParameters trên Camera để truy cập vào các thông số hiện hành. [ … Do things with the camera … ] camera. Chúng ta cũng có thể chỉ định một PreviewCallback để chọn cho mỗi khung hình xem. camera. Máy ảnh được hiển thị trong thời gian thực hiện trên một giao diện như thể hiên trong đoạn code sau đây: camera. Một thú vị nhất mà ứng dụng Android đã sử dụng chức năng này như là lớp cơ sở. […] camera. cho phép thao tác hoặc hiển thị khung hình xem.open().getParameters().

}}.12. đưa vào một ShutterCallback và PictureCallback thực hiện cho hình ảnh RAW và JPEG.Tìm hiểu lập trình trên Android public void onPreviewFrame(byte[] _data. } ShutterCallback shutterCallback = new ShutterCallback() { public void onShutter() { // TODO Do something when the shutter closes. PictureCallback rawCallback = new PictureCallback() { public void onPictureTaken(byte[] _data. 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. Camera _camera) { // TODO Do something with the image JPEG data. Camera _camera) { // TODO Do something with the image RAW data. }}. Camera _camera) { // TODO Do something with the preview image. PictureCallback jpegCallback = new PictureCallback() { public void onPictureTaken(byte[] _data.3 Chụp ảnh Chụp ảnh bằng cách gọi takePicture trên đối tượng Camera. rawCallback. } }. private void takePicture() { camera. SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 81 . 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. jpegCallback). } }).takePicture(shutterCallback. 4.

5. 5. Professional Android Application http://developer. … các control : Listview. 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. 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. TỔNG KẾT 5. Google Talk.com/tin-tuc. Một đặc tính tuyệt vời của Android là tính mở của nó. …. MapView. … và sử dụng phần cứng cơ bản của Android đó là Camera để quay phim.Tìm hiểu lập trình trên Android Chương 5. Services. Checkbox.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.3 TÀI LIỆU THAM KHẢO:  Các Ebook: Unlocking Development  Các trang web: http://vietAndroid. 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.com/ SVTH: Phạm Quang Đạo – Nguyễn Hoàng Nam 82 . Geocoder.  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. 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. dùng Eclipse và SDK mà Google cung cấp. ContentProvider.  Xây dựng một ứng dụng mang tính khả thi trên hệ điều hành này. Broadcast Resever. 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. Button.html.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. Intent. Relative Layout.Android. chụp ảnh.