
ANDROID
1.7.13. Activity & Intend
1.7.2.1. Activity
Activity là một thành chớnh của mộtứng dụng Android, được dựng để hiển thịmột
màn hỡnh và nắm bắt cỏc hoạtđộng xảy ra trờn màn hỡnh đú. Khi làm việc với Activity
cần nắm bắtđược một sốkiến thức cơbản nhưsau:
v Chu kỳsống của một Activity
(Xem chu kỳ ứng dụng của Android mục 1.6)
v Tạo menu và dialog
v Khởiđộng một Activity
Để khởiđộng một Activity ta sửdụng Intend sẽtỡm hiểu kỹhơnởphần b. Tuy nhiờn,
trong phần này tụi sẽhướng dẫn cỏch chuyển giữa cỏc Intend theo 2 loại:
Khai bỏo khụng tường minh:
Cung cấp chớnh xỏc thụng tin của activity cần gọi bằng cỏch truyền vào tờn class của
Activity đú
VD: TừActivity A muốn chuyển qua Activity B ta khai bỏo một Intend trong Activity A:
Intend intend = new Intend(this, B.class);
startActivity(intend);
Khai bỏo khụng tường minh
Cung cấp cỏc thao tỏc cần làm gỡvới loại dữliệu nào, hệthụng sẽtỡmđến activity
tương ứng để khởiđộng.
VD: Để xem thụng tin một contact nào đú trong Activity củaứng dụng Contact trong
Android ta chỉ đến dữliệu contact và chỉ đến Activity View contact nhưsau:
Intent i = new Intent();
i.setAction(Intent.ACTION_VIEW);
i.setData(Uri.withAppendedPath(
android.provider.Contacts.People.CONTENT_URI, "1));
startActivity(i);
v Tớnh liờn lạc giữa 2 activity
Khi chuyển sang một Activity khỏc ta cú thểgửi kốm dữliệu trong intend đú nhưsau:
intend.putExtra(“key1”, “value1”);
intend.putExtra(“key2”, 23);
Bờn phớa Activity được khởiđộng hay được chuyểnđế n, cú thểlấy dữliệuđược gửi như
sau:

getIntend().getExtra().getString(“key1”);
getIntend().getExtra().getInt(“key2”);
v Task
Android là một hệ điều hành đa tiến trỡnh. Khi lập trỡnh trờn nền tảng Android thỡ
tiến trỡnh là một vấnđề cần phảiđược chỳý nhiều nhất. Mặc dựAndroid hỗtrợ đa tiến
trỡnh nhưng trờn một thiết bịdi động với cấu hỡnh thấp mà chỳng ta quỏlạm dụng tiến
trỡnh thỡsẽrất tốn bộxửlý điều này cũng đồng nghĩa với việc bạnđang biếnứng dụng
của bạn trởthành một thứphần mềm tiờu thụ điện năng.
1.7.2.2. Intent
v Khỏi niệm Intend:
ỹLà một cấu trỳc dữliệu mụtảcỏch thức, đối tượng thực hiện của một Activity
ỹLà cầu nối giữa cỏc Activity: ứng dụng Android thường bao gồm nhiều Activity, 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. Intent
chớnh là ngườiđưa thư, giỳp cỏc Activity cú thểtriệu gọi cũng nhưtruyền cỏc dữ
liệu cần thiết tới một Activity khỏc. Điều này cũng giống nhưviệc di chuyển qua lại
giữa cỏc Forms trong lập trỡnh Windows Form.
Hỡnh 1-19 Truyền dữliệu giữa 2 Activity
v Dữliệu của Intend:
ỹIntent vềcơbản là một cấu trỳc dữliệu, được mụtảtrong lớp
android.content.Intent
ỹ
Cỏc thuộc tớnh của mộtđối tượng Intend:
Hỡnh 1-20 Cỏc thuộc tớnh của Intend
ỉCỏc Action đượcđịnh nghĩa sẵn:

Dướiđơy là những hằng String đú đượcđịnh nghĩa sẵn trong lớp Intent. Đi
kốm với nú là cỏc Activity hay Application được xơy dựng sẵn sẽ được triệu gọi
mỗi khi Intent tương ứng được gửi (tất nhiờn khi được cung cấpđỳng data). VD:
Gọi tới một số điện thoại:
Intent dialIntent =
new Intent(Intent.ACTION_DIAL, Uri.parse("tel:123456"));
startActivity(dialIntent);
Hỡnh 1-21 Cỏc Action đú đượcđịnh nghĩa sẵn trong Intend
1.7.14. CONTENT PROVIDER VÀ URI
Trong hệthống Android tất cảcỏc tài nguyờn ngưContact, SMS,… đềuđược lưu trữ
vào CSDL SQLite của hệthống. Cũng nhưcỏc CSDL khỏc, CSDL mà hệthống Android
sửdụng để lưu trữthụng tin cũng cho phộp chỳng ta truy vấn dữliệu nhưmột CSDL
MSSQL thụng thường. Tuy nhiờn, trong hệthống đú chỳng ta khụng cần phải thao tỏc
bằng lệnh SQL nhiềuđể truy xuất dữliệu mà thay vào đú Android đú được trang bịmột
API cho phộp người lập trỡnh cỳthểdễdàng truy xuất dữliệu. Đú gọi là ContentProvider.
ContentProvider cung cấp cho chỳng ta mộtđối tượng con trỏgiỳp chỳng ta cú thểdễ
dàng lấyđược bất cứdữliệu lưu trữnào chỉcần cung cấp mộtđường dẫnđỳng đến dữliệu
đú.Đường dẫn này cũnđược gọi là Uri.
Tạo một Uri:
Uri uri = Uri.parse(“content://com.android.contacts/contacts”);
Cấu trỳc gồm cú 4 phần chớnh nhưsau:
Phần A: Đơy là tiền tốchỉra dữliệuđượcđiều khiển bởi Content Provider và nú khụng
bao giờthay đổi.

Phần B: Phần này chỉ đến nơi lưu trữdữliệu. Cũng giống nhưcấu trỳc của một số điện
thoại thỡcỏi này cỳthểhỡnh dung nỳnhưlà mú quốc gia hoặc cũng cỳthểcoi nỳnhưlà
tờn của CSDL.
Phần C: Phần này chỉra loại dữliệu. Chẳng hạn như, dữliệu contact, dữliệu SMS,…
Phần này cú thểcoi nú nhưlà tờn của một table
Phần D: Phần này chỉ đếnđỳng vịtrớcủa dữliệu, cú thểcoi phần này nhưlà ID của row
trong table hoặc một dữliệu nào đú dựng để truy vấn.
VD: Uri chỉ đến contact thứ0 trong CSDL là
content://contacts/people/0
Để cú thểthực hiện truy vấnđến vựng dữliệuđược chỉra bởi một Uri ta cần cú 2 đối
tượng con trỏ được cung cấp bởi Activity đú là: Cursor và ContentResolver.
Để lấyđược 2 đối tượng này thỡtrong Activity sửdụng hàm
getContentResolver() trảvề đối tượng ContentResolver.
getContentResolver().query(Uri uri); trảvề đối tượng Cursor.
1.7.15. Background Service
Service là 1 trong 4 thành phần chớnh trong 1 ứng dụng Android (Activity, Service,
BroadcastReceiver, ContentProvider) thành phần này chạy trong hậu trường và làm những
cụng việc khụng cần tới giao diện nhưchơi nhạc, download, xửlớtớnh toỏn…
Một Service cú thể được sửdụng theo 2 cỏch:
Nú cú thể được bắtđầu và được cho phộp hoạtđộng cho đến khi một người nào đú
dừng nú lại hoặc nú tựngắt. Ởchế độ này, nú được bắtđầu bằng cỏch gọi
Context.startService() và dừng bằng lệnh Context.stopService(). Nú cú thểtựngắt
bằng lệnh Service.stopSelf() hoặc Service.stopSelfResult(). Chỉcần một lệnh
stopService() để ngừng Service lại cho dựlệnh startService() được gọi ra bao nhiờu
lần.
Service cú thể được vận hành theo như đú được lập trỡnh việc sửdụng một Interface
mà nỳ định nghĩa. Cỏc người dựng thiết lập mộtđường truyền tớiđối tượng Service
và sửdụng đường kết núi đú để thơm nhập vào Service. Kết nối này được thiết lập
bằng cỏch gọi lệnh Context.bindService() và đượcđúng lại bằng cỏch gọi lệnh
Context.unbindService(). Nhiều người dựng cú thểkết nối tới cựng một thiết bị.
Nếu Service vẫn chưađược khởi chạy, lệnh bindService() cú thểtựy ý khởi chạy nú.
Hai chế độ này thỡkhụng tỏch biệt toàn bộ. Bạn cỳthểkết nối với một Service mà
nỳ đú được bắtđầu với lệnh startService(). Vớdụ, một Service nghe nhạcởchế độ
nền cú thể được bắtđầu bằng cỏch gọi lệnh startService() cựng với mộtđối tượng
Intent mà định dạng đượcơm nhạcđể chơi. Chỉsau đú, cú thểlà khi người sửdụng
muốn kiểm soỏt trỡnh chơi nhạc hoặc biết thờm thụng tin vềbài hỏt hiện tạiđang
chơi, thỡsẽcỳmột Activity tạo lập mộtđường truyền tới Service bằng cỏch gọi
bindService(). Trong trường hợp nhưthếnày, stopService() sẽkhụng thực sựngừng
Service cho đến khi liờn kết cuối cựng đượcđúng lại.

Giống nhưmột Activity, một Service cũng cú cỏc phương thức chu kỳthời gian mà bạn
cú thểcài đặtđể kiểm soỏt những sựthay đổi trong trạng thỏi của nú. Service chỉcú 3
phương thứcđược gọiđến trong chu trỡnh sống là:
void onCreate()
void onStart(Intent intent)
void onDestroy()
Bằng việc thực hiện những phương thức này, bạn cú thểgiỏm sỏt 2 vũng lặp của chu
kỳthời gian của mỗi Service Entire lifetime của một Service diễn ra giữa thời gian
onCreate() được gọi ra và thời gian mà onDestroy() trảlại. Giống nhưmột Activity, một
Service lại tiết hành cài đặt ban đầuởonCreate(), và giải phúng tất cảcỏc tài nguyờn cũn
lạiởonDestroy() Vớdụ, một Service phỏt lại nhạc cỳthểtạo ra một luồng và bắtđầu chơi
nhạc onCreate(),và sau đú luồng chơi nhạc sẽdừng lạiởonCreate(), Active lifetime của
một Service bắtđầu bằng một lệnh tới onStart(). Đơylà phương thứcđược chuyển giao đối
tượng Intent mà đú được thụng qua để tới startService() Service ơm nhạc sẽmở đối tượng
Intent để quyếtđịnh xem sẽchơi loại nhạc nào và bắtđầu phỏt nhạc. Khụng cú callback
tương đương nào cho thờiđiểm Service ngừng lại – khụng cú phương thức onStop(). Cỏc
phương thức onCreate() và onDestroy() được gọi cho tất cảcỏc Service dựchỳng cú được
bắtđầu bằng Context.startService() hoặc Context.bindService() hay khụng. Tuy nhiờn,
onStart() chỉ được gọi ra đối với cỏc Service bắtđầu bằng startService(). Nếu một Service
cho phộp những Service khỏc kết nối với nú thỡsẽcỳthờm cỏc phương thức callback
dành cho Service đú để thực hiện.
IBinder onBind(Intent intent)
boolean onUnbind(Intent intent)
void onRebind(Intent intent)
Hàm callback onBind() thụng qua đối tượng Intent đú đựoc truyềnđến bindService và
onUnbind() được chuyển giao đối tượng mà đú được chuyểnđến. Nếu Service đang được
chỉ định (binding), onBind() quay trởlại kờnh thụng tin mà người dựng sửdụng để tương
tỏc với Service. Phương thức onUnbind() cú thểyờu cầu onRebind() được gọi nếu một
người dựng kết nối với Service.

