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

Tìm hiểu về ứng dụng công nghệ Java, lập trình Android, xây dựng ứng dụng “Bé học toán”

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

TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP HÀ NỘI
KHOA CÔNG NGHỆ THÔNG TIN
----------

BÁO CÁO THỰC TẬP TỐT NGHIỆP
Đề Tài: Tìm hiểu về ứng dụng công nghệ
Java, lập trình Android, xây dựng ứng dụng
“Bé học toán”

Giảng viên hướng dẫn: Ths An Văn Minh
Sinh viên thực hiện: Lăng Thị Trinh
Mã sv: 0741360052
Lớp: ĐH KTPM 1_K7

Hà nội, tháng 02 năm 2016


LỜI NÓI ĐẦU
Trong những năm gần đây, Java đã có một tầm quan trọng đặc biệt và được
coi là ngôn ngữ của tương lai trước sự phát triển vượt bậc của mạng toàn cầu
Internet. Với xu thế hiện nay, người ta quan tâm và nói nhiều đến Java, Song song
với đó sự bùng nổ của các thiết bị thông minh đã kéo theo sự ra đời của thị trường
ứng dụng di động. Việc xây dựng các ứng dụng di động đang là một ngành công
nghiệp mới đầy tiềm năng và hứa hẹn nhiều sự phát triển vượt bậc của ngành khoa
học kỹ thuật. Bên cạnh đó là sự phát triển mạnh mẽ của các hệ điều hành như
J2ME, Android, IOS, Windows phone….trên thị trường truyền thông di động hiện
nay.
Vài năm trở lại đây, hệ điều hành Android ra đời với sự kế thừa những ưu việt
của các hệ điều hành ra đời trước đó và sự kết hợp của nhiều công nghệ tiên tiến
nhất hiện nay, Android đa nhanh chóng là đối thủ cạch tranh mạnh mẽ với các hệ
điều hành trước đó và đang là hệ điều hành di động của tương lai và được nhiều


người ưa chuộng nhất.
Ngày nay, công nghệ thông tin chính là “trợ thủ đắc lực” của ngành giáo dục,
việc ứng dụng công nghệ thông tin vào giáo dục trẻ thơ ngay chính trên thiết bị di
động thông minh là một việc hết sức cần thiết. Dựa trên những yếu tố đó em chọn
và thực hiện đề tài “Tìm hiểu về ứng dụng công nghệ Java, lập trình Android, xây
dựng ứng dụng Bé học toán”, với mục đích tìm hiểu về hệ điều hành Android và
từ đó xây dựng ứng dụng “Bé học toán” để có thể đáp ứng nhu cầu học tập cho bé
mọi lúc mọi nơi một cách tiện lợi.
Trong thời gian thực hiện Đề tài “Tìm hiểu về ứng dụng công nghệ Java,
lập trình Android, xây dựng ứng dụng Bé học toán” em đã nhận được nhiều sự
đóng góp của các bạn trong lớp và đặc biệt là sự chỉ bảo tận tình của thầy giáo An
Văn Minh. Cùng với những kiến thức nền tảng từ những môn trước đó mà em có
được dưới sự hướng dẫn của các thầy cô trong khoa, em đã áp dụng vào thực hiện
đề tài này để tài được hoàn thiện hơn. Qua đây em xin gửi lời cảm ơn trân trọng tới
thầy giáo An Văn Minh, các thầy cô giáo trong khoa và các bạn.

2


Em chân thành cảm ơn Thầy giáo!

MỤC LỤC

3


CHƯƠNG I – TỔNG QUAN VỀ ĐỀ TÀI
2.1. Tên đề tài
Tìm hiểu về ứng dụng công nghệ Java, lập trình Android, xây dựng ứng
dụng“Bé học toán”.

2.2. Mục đích đề tài
Tìm hiểu về ứng dụng công nghệ Java: Java là gì? các loại ứng dụng công
nghệ Java. Tìm hiểu lập trình Android : Android là gì? lịch sử phát triển của
Android, công cụ và môi trường lập trình Android, kiến trúc của Android, vòng đời
của một ứng dụng Android, các thành phần cơ bản, cách lưu trữ dữ liệu, lập trình
mạng với Android, cách thức đưa ứng dụng lên Google play Store. Áp dụng lập
trình android để xây dựng ứng dụng “Bé học toán”.
2.3. Nội dung công việc
 Tìm hiểu về ứng dụng công nghệ Java.
− Khái niệm về Java.
− Các loại ứng dụng công nghệ Java phổ biến hiện nay.
 Tìm hiểu về lập trình Android.
− Khái niệm về Android.
− Lịch sử phát triển của android.
− Công cụ và môi trường lập trình Android.
− Kiến trúc của Android
− Vòng đời của một ứng dụng Android.
− Các thành phần cơ bản của một ứng dụng Android.
− Lưu trữ dữ liệu trong Android.
 Xây dựng ứng dụng dạy bé học toán:
− Khảo sát.
− Phân tích.
− Thiết kế cơ sở dữ liệu.
− Thiết kế giao diện.
− Lập trình và tích hợp hệ thống.

CHƯƠNG II–TÌM HIỂU VỀ ỨNG DỤNG CÔNG
NGHỆ JAVA, LẬP TRÌNH ANDROID
1.1.


Ứng dụng công nghệ Java

2.3.1. Java là gì?

4


Java là một ngôn ngữ lập trình được Sun Microsystems giới thiệu vào tháng
6 năm 1995. Từ đó, nó đã trở thành một công cụ lập trình của các lập trình viên
chuyên nghiệp. Java được xây dựng trên nền tảng của C và C++. Do vậy nó sử dụng
các cú pháp của C và các đặc trưng hướng đối tượng của C++.
Trình biên dịch thường phải tốn nhiều thời gian để xây dựng nên rất đắt. Vì
vậy để mỗi loại CPU có một trình biên dịch riêng là rất tốn kém. Do đó nhu cầu
thực tế đòi hỏi một ngôn ngữ chạy nhanh, gọn, hiệu quả và độc lập thiết bị tức là có
thể chạy trên nhiều loại CPU khác nhau, dưới các môi trường khác nhau. “Oak” đã
ra đời và vào năm 1995 được đổi tên thành Java. Mặc dù mục tiêu ban đầu không
phải cho Internet nhưng do đặc trưng không phụ thuộc thiết bị nên Java đã trở thành
ngôn ngữ lập trình cho Internet.
2.3.2. Một số loại ứng dụng công nghệ Java

a) Ứng dụng desktop

Để lập trình ứng dụng Desktop có 2 lựa chọn:


Sử dụng Swing - Là một thư viện tích hợp sẵn trên JDK và có khả năng

chạy trên mọi hệ điều hành khác nhau (Window, Unix, Mac OS,..)
− Sử dụng SWT - Là một thư viện để lập trình ứng dụng Desktop được phát
triển bởi IBM. Nó có khả năng chạy trên mọi hệ điều hành khác nhau

(Window, Unix, Mac OS,..)

5


Đây là một ứng dụng Desktop viết bằng Java (Java Swing):

b) Ứng dụng Web

Ta có thể tạo một trang web bằng Java

6


7


c) Ứng dụng Mobile

Ngôn ngữ lập trình chính thức của Android là Java. Dựa trên máy ảo Java
của Sun, Google đã tinh chỉnh và phát triển nên máy ảo Dalvik để biên dịch mã
Java với tốc độ biên dịch nhanh hơn và nhẹ hơn. Đến phiên bản Froyo
2.2, Android đã hỗ trợ Just-in-time Compiler (JIT) làm tăng tốc độ biên dịch Java
lên gấp 2-5 lần so với các phiên bản trước.
Bằng cách sử dụng các frameworks của hãng thứ ba (VD: PhoneGap,
Titanium,...), các nhà lập trình web cũng có thể phát triển ứng dụng Android một
cách dễ dàng bằng các ngôn ngữ web phổ dụng như HTML, CSS, Javascript. Tuy
nhiên số lượng các ứng dụng đi theo chiều hướng này chưa nhiều.
d) Game đa nền tảng
 libGDX: nhằm phát triển 1 thư viện làm nền tảng để phát triển game. libGDX được


viết bằng ngôn ngữ Java. các ứng dụng và game có thể được phát triển trên desktop
và chuyển thành 1 ứng dụng android, ios, html5.
Phát triển mạnh mẽ hơn bằng cách sử dụng các công cụ trên máy tính nhằm
giúp hiệu quả hơn khi phát triển ứng dụng thay vì chúng ta phải chờ đợi khi ứng
dụng chạy trên máy ảo hay thiết bị android mỗi khi build.

1.2.

Lập trình Android

2.1.1.

Android là gì?
Android là một hệ điều hành dựa trên nền tảng Linux được thiết kế dành cho

các thiết bị di động có màn hình cảm ứng như điện thoại thông minh, máy tính
bả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. Các nhà phát triển viết ứng dụng cho Android dựa trên
ngôn ngữ Java.
2.1.2.

Lịch sử phát triển của Android

8


a)

Các chặng đường phát triển

Tháng 10/2003, Android (Inc) được thành lập tại Palo Alto, California, Hoa

Kỳ do Andy Rubin (đồng sáng lập của Danger Inc), Rich Miner (đồng sáng lập
của Wildfire Communications Inc và cựu phó chủ tịch công nghệ và tương lai ở
Orange) và một số thành viên khác chủ trì, với mục đích để phát triển hay tạo ra
các thiết bị di động thông minh hơn phục vụ các mục đích cho lợi ích con người.
Năm 2005, Google mua lại Android, các nhân viên chính của Android Inc,
trong đó có Andy Rubin, Rich Miner vẫn tiếp tục làm việc tại công ty. Tại Google,
nhóm kĩ sư do Rubin đứng đầu đã phát triển một nền tảng di động dựa trên hạt
nhân Linux. Sau đó, họ đã giới thiệu cho các nhà sản xuất thiết bị cầm tay và các
nhà mạng trên những tiền đề về việc cung cấp một hệ thống mềm dẻo, có khả năng
nâng cấp mở rộng cao.
Google cũng lên danh sách các thành phần phần cứng đáp ứng nền tảng và
các đối tác phần mềm, đồng thời cam kết với các nhà mạng rằng họ sẵn sàng hợp
tác ở nhiều cấp độ khác nhau. Thời gian này, một loạt nguồn tin khẳng định
Google sẽ sớm tham gia phát triển hệ điều hành riêng cho điện thoại di động.
Tháng 9/2007, InformationWeek đăng tải một nghiên cứu của Evalueserve
cho biết Google đã nộp một số đơn xin cấp bằng sáng chế trong lĩnh vực điện
thoại di động.
Tháng 11/2007, Liên minh thiết bị cầm tay mở rộng (Open Handset Alliance)
với sự đồng thuận của Texas Instruments, Tập đoàn Broadcom, Google, HTC,
Intel, LG, Tập đoàn Marvell Technology, Motorola, Nvidia, Qualcomm, Samsung
Electronics, Sprint Nextel và T-Mobile đã thành lập với mục đích phát triển các
tiêu chuẩn mở cho thiết bị di động. Và như vậy, Android chính thức gia nhập Liên
minh thiết bị cầm tay mã nguồn mở đồng thời Google đã công vố việc họ bắt tay
phát triển hệ điều hành mã nguồn mở cho thiết bị di động nhằm cạnh tranh với
Symbian, Windows Mobile và các đối thủ khác. Hãng cũng giới thiệu sản phẩm
Android đầu tiên là T-Mobile G1.Đây là một thiết bị di động có hệ điều hành dựa
trên nhân Linux phiên bản 2.6.


9


Từ tháng 10/2008, hệ điều hành Android đã chính thức trở thành phần mềm
mã nguồn mở.Theo đó, các công ty thứ ba được phép thêm những ứng dụng của
riêng của họ vào Android và bán chúng mà không cần phải hỏi ý kiến Google.
Tháng 11/2008, Liên minh OHA ra mắt gói phát triển phần mềm Android
SDK cho nhà lập trình.
b)

Lịch sử các phiên bản của Android
 Android 1.0, phiên bản thương mại đầu tiên của phần mềm, đã được phát

hành vào ngày 23 tháng 9 2008.Thiết bị thương mại đầu tiên có sẵn
Androidlà HTC Dream.
 Android 1.1 đã được phát hành vào ngày 9 tháng 2 2009, Android 1.1 được

biết đến như "Petit Four" nội bộ, mặc dù tên này không được sử dụng
chínhthức.Bản cập nhật giải quyết lỗi, thay đổi Android API và thêm vào
một sốtính năng.
 Android 1.5 đã được phát hành vào ngày 27/04/2009, dựa trên Hạt nhân

Linux 2.6.27. Đây là lần phát hành đầu tiên sử dụng tên mã dựa trên
móntráng miệng ("Cupcake"), nó sẽ là chủ đề sẽ được sử dụng từ nay trở về
sau. Bản cập nhật bao gồm một số tính năng mới và sử đổi giao diện người
dùngUI.
 Android 1.6 SDK – gọi là Donut – đã được phát hành vào ngày 15/09/2009,
dựa trên Linux kernel 2.6.29.Bao gồm trong bản cập nhật là nhiều tính
năngmới.
 Android 2.0 SDK – tên mã là Eclair – đã được phát hành vào ngày


26/10/2009, dựa trên Linux kernel 2.6.29.
 Android 2.1 Eclair thay đổi nhỏ API và sửa lỗi phiên bản cũ- được pháthành
ngày 12/01/2010.
 Android 2.2 (Froyo, viết tắt của frozen yogurt) được phát hành vào ngày
20/05/2010, dựa trên Linux kernel 2.6.32.
 Android 2.3 (Gingerbread) SDK được phát hành vào ngày 06/12/ 2010, dựa

trên Linux kernel 2.6.35
 Android 3.0 (Honeycomb) SDK – máy tính bảng đầu tiên-chỉ cập
nhậtAndroid – được phát hành, dựa trên Linux kernel 2.6.36.Thiết bị đầu tiên

10


nhận được phiên bản này là máy tính bảng Motorola Xoom, được phát hành vào
24 tháng 2, 2011.
 Android 3.1 Honeycomb phát hành ngày 10/05/ 2011.
 Android 3.2 Honeycomb phát hành ngày 15/07/2011.Hầu hết Google TV thế
hệ thứnhất và thứ hai-hỗ trợ thiết bị sử dụng Honeycomb 3.2.
 Android 4.0.x Ice Cream Sandwich được phát hành ngày 16/12/2011.
 Android 4.1.x Jelly Bean, phát hành ngày 09/07/2012.
 Android 4.2.x Jelly Bean, phát hành ngày 13/11/2012.
 Android 4.3 Jelly Bean, phát hành ngày 25/07/2013.
 Android 4.4KitKat, phát hành vào tháng 10/2013.
 Android 5.0 Lollipop, phát hành vào tháng 07/2014.
 Android 6.0 Marshmallow, phát hành tháng 10/2015.

11



2.1.3.

Các môi trường phát triển ứng dụng Android
Để lập trình android, có thể dùng công cụ soạn thảo là eclipse hoặc Android

Studio tuy nhiên eclipse phải tích hợp thêm plugin ADT mới có thể sử dụng được.
Và Google đã chính thức tuyên bố dừng hỗ trợ ADT trong Eclipse kể từ cuối năm
2016. Hiện nay ADT đang được khá nhiều nhà phát triển sử dụng. Google quyết
định từ bỏ hỗ trợ Eclipse.Google đã đầu tư nhiều thời gian để phát triển các bộ công
cụ lập trình cho Android, trong đó có việc tung ra Android Studio, một IDE được
hãng phát triển và nâng cấp dần qua thời gian. Điều đó cũng đồng nghĩa với đến
một lúc nào đó, hãng sẽ chỉ còn hỗ trợ mỗi Android Studio và bỏ rơi các IDE khác.
Hơn nữa Android Studio có giao diện bắt mắt, thân thiện với người dùng hơn, nhiều
tính năng mới, nổi bật hơn so với Eclipse. Chính vì những lý do trên, em lựa chọn
Android Studio để phát triển ứng dụng Android trong đề tài này.
2.1.4.

Cấu trúc của một project Android

 Lớp MainActivity.java và activity_main.xml .

12




Khi một Ứng dụng được tạo ra thì thông thường sẽ có một Activity để khởi chạy
ứng dụng. MainActivity.javachính là class chứa toàn bộ source code,
còn activity_main.xml chính là phần giao diện. Đối với Android khi một Activity

tạo ra thì thường nó đi kèm với một Layout giao diện nào đó (Tức là nó luôn



được tách thành 2 phần: phần source code riêng và phần giao diện riêng).
Bất kỳ một Activity nào muốn được triệu gọi thành công trong Android Project
thì bắt buộc nó phải được khai báo trong tập tin AndroidManifest.xml. Nếu như
ta gọi một Activity mà Activity này không được khai báo trong Manifest thì
chương trình sẽ bị lỗi và tắt luôn.
− Cấu trúc bên trong của AndroidManifest.xml

− MainActivity muốn được triệu gọi thì nó phải được khai báo trong này. Và đặc biệt

nếu như muốn nó là màn hình đầu tiên được thực thi khi chạy ứng dụng thì ta phải
khai báo giống như tag<intent-filter> ở trên. Như vậy nếu muốn một Activity bất
kỳ nào đó được gọi đầu tiên khi chạy ứng dụng thì chỉ khai báo giống như vậy,
còn các Activity khác không cần khai báo <intent-filter> như trên.
 activity_main.xml :

13




Graphical Layout và activity_main.xml.

+ Vùng số 1 : chính là nơi chứa các control, layout, component… muốn sử
dụng cái nào thì kéo thả nó vào Vùng số 2. Như trên hình là khi kéo một Button
vào và đặt Id nó là “btnXinChao”,
+ Vùng số 2: là giao diện, nơi cần thiết kế

+ Vùng số 3: cho phép thiết kế theo chiều đứng hay chiều ngang
+ Vùng số 4: chức năng Zoom in – zoom out để dễ thiết kế
+ Vùng số 5: chính là nơi thiết lập các thuộc tính cho các control được kéo
thả vào giao diện.
 MainActivity.java:



Trong màn hình trên, ta thấy bên trong hàm onCreate có lệnh:

14


+ setContentView(R.Layout.activity_main) ==> thiết lập giao diện cho
Activity. Với activity_main lấy từ R.java
+ findViewById(R.id.txtChao) ==> truy suất control là Textview trên giao
diện. với txtChao lấy từ R.java
 Tiếp tục quan sát các thư mục: Drawable-hdpi, Drawable-ldpi,Drawablemdpi, Drawable-xdpi:
Ta có thể tự tạo thêm một thư mục cùng cấp tên là Drawable, các tập tin kéo thả
trực tiếp vào trong này (tạo Resource). Khi chương trình load các ReSource sẽ tự
động vào đây lấy. Còn -hdpi, -ldbpi, -xdpi là tùy thuộc vào độ phân giải màn hình
mà chương trình tự động vào lấy đúng dữ liệu ở bên trong.
 Thực thi chương trình:

Bấm vào nút mũi tên xanh trên cùng màn hình.



5 bước thực hiện của một ứng dụng Android như sau:


bước 1: Android Project sẽ được tự động biên dịch và chuyển qua Android
Executables (.dex)
bước 2: Đóng gói thành tập tin .apk
bước 3: Upload .apk vào thiết bị android
bước 4: Tiến hành cài đặt .apk đó
bước 5: Khi cài đặt thành công, chương trình sẽ được thực hiện Activity được thiết
lập : android.intent.action.MAIN

15


Mỗi một ứng dụng Android sẽ được thực thi trên một máy ảo Dalvik
(không phải máy ảo Java).Theo như giải thích của developer Android thì mục
đích là chạy đa tiến trình, giúp tối ưu bộ nhớ.
Các thành phần cơ bản của một ứng dụng Android
a) Activity

2.1.5.



Định nghĩa Activity
Là thành phần quan trọng của một ứng dụng Android.Thuật ngữ Activity chỉ

một việc mà người dùng có thể thực hiện trong một ứng dụng Android. Do gần như
mọi activity đều tương tác với người dùng, lớp Activity đảm nhận việc tạo ra một
cửa sổ (window) để người lập trình đặt lên đó một giao diện UI với
setContentView(View). Một activity có thể mang nhiều dạng khác nhau: Một cửa
sổ toàn màn hình (full screen window), một cửa


sổ floating (với

windowsIsFloating) hay nằm lồng bên trong 1 activity khác (với ActivityGroup).
Có 2 phương thức mà gần như mọi lớp con của Activity đều phải hiện thực:


onCreate(Bundle) - Nơi khởi tạo activity. Quan trọng hơn, đây chính người
lập trình gọi setContentView(int) kèm theo layout để thể hiện UI của riêng mình.
Đồng thời còn có findViewById(int) giúp gọi các widget (buttons, text boxes,
labels,..) để dùng trong UI.



onPause() - Nơi giải quyết sự kiện người dùng rời khỏi activity. Mọi dữ liệu
được người dùng tạo ra tới thời điểm này cần phải được lưu vào ContentProvider.
Để có thể sử dụng Context.startActivity(), mọi lớp activity đều phải được khai
báo với tag <activity> trong file AndroidManifest.xml.

16


b) Intent



Định nghĩa Intent
Intent là một mô tả trừu tượng của một hành động được thực thi.Nó đại diện

cho một hành động đi kèm với một ngữ cảnh xác định. Với Intent thì có nhiều hành
động và nhiều component (Một thể hiện của một class java dùng để thực thi các

hành động được đặc tả trong Intent) dành cho Intent của Android. Intent được sử
dụng với phương thức startActivity() để mở một Activity, và dùng với
broadcastIntent để gởi nó đến bất kì BroadcastReceiver liên quan nào, và dùng
với startService(Intent), bindService(Intent, ServiceConnection, int) để giao tiếp với
các Service chạy dưới nền.
Intent cung cấp một chức năng cho phép kết nối hai chương trình khác nhau
trong quá trình thực thi (runtime) (Cung cấp khả năng cho phép hai chương trình
khác nhau giao tiếp với nhau). Chức năng quan trọng và được sử dụng nhiều nhất
của một Intent là mở một Activity, nơi mà nó có thểđược dùng như một vật kết nối
các Activity lại với nhau (Truyền thông tin giữa hai Activity khác nhau).

17




Thành phần chính của Intent bao gồm:

Action: Xác định hành động sẽ được thực thi, các hành động này có thể là:
ACTION_VIEW, ACTION_EDIT, ACTION_MAIN…
Data: Các dữ liệu được sử dụng để hành động (Action) thao tác trên nó, như bản ghi
về một người nào đó trong cơ sở dữ liệu chứa các contact của thiết bị.


Ngoài ra, Intent còn có các thuộc tính phụ sau:

Category: thông tin chi tiết về hành động được thực thi.
Type: Chỉ định 1 kiểudữ liệu chính xác (kiểu MIME) được mang bởi intent.
Thường thì type được suy ra từ chính dữ liệu.Bằng cách thiết lập thuộc tính type,
bạn có thể vô hiệu hóa sự phỏng đoán kiểu dữ liệu và chỉ định rỏ một kiểu chính

xác.
Component: Chỉ định rõ tên của lớp thành phần (Một thể hiện của một class java
dùng để thực thi các hành động được đặc tả trong Intent) sử dụng cho Intent .Thông
thường thì nó được xác định bằng cách tìm kiếm thông tin trong Intent (Các thông
tin như Action, data/type, và category) và nối chúngvới các component (Một thể
hiện của một Class java dùng để thực thi các hành động được đặc tả trong Intent) có
thể đáp ứng được các yêu cầu sử lý của Intent.
Extracts: là một đối tượng Bundle dùng để chứa các thông tin kèm theo được dùng
để cung cấp thông tin cần thiết cho component.
Intent Resolution

18




Intent có 2 dạng chính sau:

Explicit Intents: Xác định rỏ một component .
Implicit Intents: Không chỉ định một component nào cả, thay vào đó, chúng sẽ chứa
đủ thông tin để hệ thống có thể xác định component có sẵn nào là tốt nhất để thực
thi hiệu quả cho Intent đó.
Khi sử dụng Implicit intents, do tính chất chuyên quyền của loại Intent này,ta
cần phải biết phải làm gì với nó. Công việc này được đảm nhiệm bởi tiến trình
của Intent resolution, nó giúp chỉ định Intent đến một Actvity,
BroadcastReceiver, hoặc Service (hoặc thỉnh thoảng có thểlà 2 hay nhiều hơn một
activity/receiver) để có thể xử lý các hành động được đặc tả trong Intent.
Bất cứ thành phần nào (Activity, BroadcastReceiver, Service) khi muốn sử dụng
trong ứng dụng đều phải được đăng kí trong file AndroidManifest.xml. Trong đó
cầnđịnh nghĩa một thẻ <intent-fillter> cung cấp các thông tin để hệ thống có thể xác

định được cái mà các component này (Activity, BroadcastReceiver, Service) có thể
xử lý được (những action mà component này có thể thực hiện được).
Intent Fillter là bản đặc tả có cấu trúc của các giá trị của Intent dùng để xác định
component phù hợp để thực hiệncác hành động được đặc tả trong Intent.Một Intent
Fillter nối các hành động, categories và dữ liệu (hoặc thông qua type hoặc sheme)
trong Intent. Intent Fillter được khai báo trong AndroidManifest.xml và sử dụng
thẻ intent-fillter.
Một Intent Fillter có các thành phần chính sau:
Action: Tên hành động mà component có thể thực thi.
Type:Kiểu hành động mà component có thể thực thi.
Category: Phân nhóm các hành động.

19


Luật xác định component phù hợp Intent
Để xác định một thành phần là phù hợp với một Intent hệ thống sẽ tiến hành
xem xét từ trên xuống.
Trước tiên khi một Intent được gọi, Android sẽ tìm kiếm những component
(Activity, BroadcastReceiver, Service) có action-name phù hợp với Intent.
Nếu có component phù hợp Android sẽ mở component đó lên để thực thi các
hành động theo yêu cầu.
Nếu có nhiều hơn 1 component có action-name phù hợp thì Android sẽ yêu
cầu người dùng chọn component phù hợp.
Ngược lại nếu không có component nào phù hợp Android sẽ tiến hành xem
xét kiểu dự liệu của Intent cung cấp xem có component nào có đủ năng lực để sử lý
kiểu dữ liệu đó không.Nếu khôngđược Android sẽ tiến hành xem xét scheme của dữ
liệu đó để tìm kiếm component phù hợp. Nếu vẫn không tìm được component phù
hợp Android sẽ tiến hành xem xét các component có chung Category với Intent để
xác định component.

c) Service



Định nghĩa Service
Một service là một thành phần của ứng dụng, thể hiện mong muốn ứng dụng

thực hiện các hành động trong khi không tương tác với người dùng hoặc cung cấp
chức năng cho các ứng dụng khác sử dụng. Nói một cách đơn giản, service là các
tác vụ (task) chạy ngầm dưới hệ thống nhằm thực hiện một nhiệm vụ nào đó. Mỗi
class

Service

phải

chứa

thẻ

<service>

được

khai

báo

trong


file

AndroidManifext.xml. Services có thể được bắt đầu bởi Context.startService() và
Context.bindservice().

20


Cũng như các đối tượng của ứng dụng khác, services chạy trên luồng (Thread)
của tiến trình chính. Có nghĩa là nếu service của bạn dự định chạy các hành vi có
cường độ lớn hoặc các hành vi có thể gây nghẽn mạch, nó sẽ tự sinh ra luồng
(Thread) của chính nó để làm thực hiện các tác vụ được đặc tả trong Service.
Chú ý: Service không phải là một tiến trình độc lập.Đối tượng Service không
chạy trên tiến trình của riêng nó (trừ khi có một yêu cầu đặt biệt), Service chạy trên
tiến trình của chương trình. Service không phải là một luồng (thread).
Service có chứa 2 đặc trưng cơ bản sau:
Là một chức năng để ứng dụng thông báo với hệ thống về việc mà nó muốn
thực hiện ở phía dưới nền (ngay cả khi người dùng không tương tác trực tiếp tới
ứng dụng). Điều này tương ứng với việc gọi phương thức Context.startservice(), nó
sẽ yêu cầu hệ thống lên lịch cho service để chạy cho đến khi bị chính service hay
người nào đó dừng nó lại.
Là một chức năng cho phép ứng dụng để cung cấp các chức năng của nó cho
các ứng dụng khác. Điều đó tương ứng với việc gọi Context.bindService(), cho
phép một long-standing connection được tạo ra để service có thể tương tác với nó.
Khi một Service được tạo ra, việc hệ thống cần làm là tạo ra thành phần và gọi hàm
onCreate() và bất kỳ lệnh callback thích hợp nào trên luồng chình. Nó phụ thuộc
vào Service thi hành hành vi thích hợp nào, chẳng hạn tạo luồng thứ hai để thực
hiện tiến trình.
d) Content Provider


Là nơi lưu trữ và cung cấp cách truy cập dữ liệu do các ứng dụng tạo nên. Đây
là cách duy nhất mà các ứng dụng có thể chia sẻ dữ liệu của nhau.
Android cung cấp sẵn content providers cho 1 số kiểu dữ liệu thông dụng như
âm thanh, video, thông tin sổ điện thoại. Người lập trình cũng có thể tự tạo ra các
class con (subclass) của Content Provider để lưu trữ kiểu dữ liệu của riêng mình.

21




Cách thức hoạt động của Content Provider:
Mọi content provider, tuy có thể khác nhau về cách thức lưu trữ dữ liệu, đều

sử dụng chung 1 interface để tìm và trả về dữ liệu, bao gồm việc thêm, bớt và sửa
dữ liệu. Việc này được thực hiện thông qua các đối tượng ContentResolver khi gọi
getContentResolver()
ContentResolver cr = getContentResolver();


Mô hình dữ liệu

Content providers sử dụng dữ liệu dưới dạng 1 table đơn giản, trong đó mỗi hàng là
1 record và mỗi cột là dữ liệu của 1 kiểu nhất định.

Mỗi record có 1 trường “_ID” độc nhất để liên kết với các bảng khác.
URI (Uniform Resource Identifier)
URI là dãy các ký tự string được dùng để: Mở 1 trang web trong trình duyệt,
bắt đầu với “http://”
Chỉ tới các file tài nguyên có sẵn trong máy (VD: 1 file video, danh sách

contacts,...), bắt đầu với "content://"
Dựa vào hình sau:

22


A – Tiền tố mặc định của 1 URI, không thay đổi được.
B – Xác định content provider. Đối với các ứng dụng hãng thứ 3, đây chính là tên
đầy đủ của 1 lớp.
C – Xác định loại dữ liệu nào cần lấy về. Nếu nguồn cung cấp chỉ cho lấy 1 loại
duy nhất thì có thể để trống, hoặc nếu có nhiều loại thì có thể phân ra từng phần 1
(land/bus, land/train, sea/ship,…)
D – ID của 1 record, khi cần lấy về chỉ duy nhất 1 record.
Khi tạo 1 content provider, Android tự động tạo 1 constant cho URI của provider đó
để đảm bảo code hiệu quả và dễ cập nhật sau này.Constant này - CONTENT_URI sẽ xác định cho ContentProvider phải liên kết với bảng nào của nguồn cung cấp.


Tìm kiếm 1 Content Provider

Để tìm kiếm (query) 1 content provider, trước nhất người lập trình cần có trong tay
các yếu tố sau:
URI xác định provider.
Tên các trường (field) dữ liệu sẽ lấy về.
Các kiểu dữ liệu của những trường trên.
ID, chỉ khi cần tìm 1 record xác định nào đó.
Có thể dùng 1 trong 2 phương thức: ContentResolver.query() hoặc
Activity.managedQuery(). Cả 2 phương thức trên đều có chung arguments và đều
trả về 1 đối tượng con trỏ (Cursor)

23



public final Cursor query (Uri uri, String[] projection, String selection, String[]
selectionArgs, String sortOrder)
public final Cursor managedQuery (Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder)
Dù với query() hay managedQuery() thì ta đều cần cung cấp URI của bên cung cấp,
tức CONTENT_URI. Nếu muốn giới hạn chỉ tìm kiếm 1 URI duy nhất, ta thêm ID
vào cuốiURI như sau: “content://.../23”, với 23 là ID cần tím kiếm, hoặc có thể
dùng các hàm hỗ trợ như ContentUris.withAppended() và Uri.withAppendedPath().
Để tạo mới 1 content provider cần:
Thiết lập hệ thống lưu trữ dữ liệu như thế nào: bằng các file hay sử dụng cơ sở dữ
liệu SQLite.
Extend lớp ContentProvider.
Khai báo 1 content provider trong file AndroidManifest.xml
Để định nghĩa 1 lớp con ContentProvider, ta cần hiện thực 6 phương thức trừu
tượng (abstract) được khai báo trong lớp ContentProvider:
query()
insert()
update()
delete()
getType()
onCreate()

24


Phương thức query() phải trả về 1 đối tượng Cursor. Mặc dù Cursor về cơ
bản là 1 interface, Android cung cấp sẵn 1 số đối tượng Cursor tạo sẵn. Ví dụ;
SQLiteCursor dành cho cơ sở dữ liệu SQLite, MatrixCursor cho dữ liệu không lưu

trong SQLite.
Android cũng khuyên nên gọi ContentResover.notifyChange() để báo cho
các listeners biếtdữ liệu sẽ được hiệu chỉnh. Ngoài ra người lập trình cũng nên thêm
vài thao tác sau để giúp việc truy xuất các lớp hiệu quả hơn:
Định nghĩa một Uri dạng public static final, với tên là CONTENT_URI (như đã
trình bày ở trên).
Định nghĩa tên các cột mà content provider sẽ trả về. Thôg thường thì đây
cũng chính là tên các cột trong cơ sở dữ liệu SQLite mà chúng đại diện. Tiếp theo,
ta nên định nghĩa các public static String constants để cac1 ứng dụng khác có thể
ghi rõ tên các cột và các hướng dẫn khác 1 cột interger tên "_id" (với constant _ID)
cũng cần được định nghia để sử dụng khi cần lấy về các record độc nhất. Trong
SQLite, trường _ID nên có kiểu như sau:INTEGER PRIMARY KEY
AUTOINCREMENT, trong đó thành phần AUTOINCREMENT không nhất thiết
phải có, nhưng nên được đưa vào để đảm bảo các ID luôn độc nhất, tránh trường
hợp khi xóa 1 row thì ID của row tiếp theo sẽ được cấp ID giống hệ của row vừa bị
xóa.


Các ghi chú giúp người khác ghi đọc biết đọc dữ liệu như thế nào.

Nếu content provider này xử lý 1 kiểu dữ liệu hoàn toàn mới, cần định nghĩ 1 kiểu
MIME mới để trả về trong sự thể hiện của ContentProvider.getType().
Để khai báo 1 Content Provider mới, trước nhất cần phải khai báo trong thẻ
của file AndroidManifest.xml.

25


×