You are on page 1of 82

Tm hiu lp trnh trn Android

Mc lc
Chng 1. 1.1 GII THIU ANDROID .............................................................................................................5 Android khc vi cc h iu hnh chy trn thit b di ng khc ........5 c tnh m ca Android:..........................................................................................................6 Android Platform: ............................................................................................................................7 Tng Linux Kernel: ..........................................................................................................................7 Native Libraries: ...............................................................................................................................7 Tng Runtime: ....................................................................................................................................8 Tng Application Framework: ...............................................................................................8 MI TRNG LP TRNH.................................................................................................10

Khi nim v Android: ...........................................................................................................................5

1.1.1 1.1.2
1.2

Kin trc ca Android:...........................................................................................................................6

1.2.1 1.2.2 1.2.3 1.2.4 1.2.5


Chng 2. 2.1 2.2 2.3 2.4 2.5 2.6 2.7

Gii thiu:......................................................................................................................................................10 Android SDK: ..............................................................................................................................................10 My o Dalvik: ...........................................................................................................................................11 Cc gi Java cn thit: ..........................................................................................................................11 Thnh phn chnh ca Eclipse khi to ng dng trn Android: ........................12 Thnh phn quan trng trong mt Android Project: .................................................13 Chu k sng ca ng dng Android .........................................................................................13 Chu k sng thnh phn...........................................................................................................14 Activity Stack ....................................................................................................................................14 Cc trng thi ca chu k sng............................................................................................15 Chu k sng ca ng dng .....................................................................................................15 Cc s kin trong chu k sng ca ng dng ..........................................................16 Thi gian sng ca ng dng...............................................................................................16 Thi gian hin th ca Activity ............................................................................................17 Cc hm thc thi ............................................................................................................................17 Cc cng c cn thit lp trnh: ...................................................................................17 Cc bc ci 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

Cc cng c cn thit lp trnh trn Android v h ng dn ci t:.......17

2.8.1 2.8.2

2.9 Bt u lp trnh 1 chng trnh hello world u tin: ...........................................20 2.10 Thnh phn giao din Android................................................................................................23

SVTH: Phm Quang o Nguyn Hong Nam

Tm hiu lp trnh trn 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

Cc Control ..............................................................................................................................................26

Ty bin control (custom control):......................................................................................32 V d s dng Listview...................................................................................................................35 LP TRNH TRN ANDROID ...........................................................................................38 Thnh phn Intents:....................................................................................................................38 S dng Intents khi ng cho Activities: ................................................................39 Intent khng tng minh thc thi Activity: .............................................................40 Intent tng minh thc thi Activity ...............................................................................40 S dng Intents gi i thng ip ra ngoi ng dng hoc Activity:...41 Mt s Adapter : .............................................................................................................................43 S dng Adapter hin th d liu: ....................................................................................43 Gii Thiu Intents: .................................................................................................................................38

Chng 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

Gii Thiu Adapters: ............................................................................................................................43

V d s dng Intent lin lc gia cc Activity:........................................................44 K thut lu tr d liu trong Android.................................................................................46 Lu tr d liu ng dng mt cch n gin: .................................................................47 To v lu d liu vi Share Preferences: ................................................................47 Truy xut Shared Preferences.............................................................................................47 Truy xut cc tp tin trong Resources: ........................................................................50 Cc cng c qun l tp tin ....................................................................................................50 Gii thiu SQLite: ..........................................................................................................................51 Cursors v Content Values: ...................................................................................................51 S dng SQLiteOpenHelper:.................................................................................................52 Truy xut v to C s d liu khng dng SQLiteHelper:..........................52

4.5.1 4.5.2
4.6

Lu v c cc tp 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 liu trong Android...........................................................................................................50

SVTH: Phm Quang o Nguyn Hong Nam

Tm hiu lp trnh trn Android


4.7.5 4.7.6 4.7.7 4.7.8 4.7.9 4.8 4.9 Truy vn c s d liu ..............................................................................................................52 Ly kt qu t Cursors ..............................................................................................................53 Thm, cp nht v xa dng:................................................................................................53 Thao tc trn c s d liu Android ..............................................................................54 Gii thiu Content Providers ...............................................................................................56

Mt ng dng Demo s dng ContentProvider qun l sch: .....................59 Maps, Geocoding, Location Based Services.......................................................................59 S dng dch v nh v ............................................................................................................59 Ci t trn mi trng gi lp vi Test Providers ...........................................59 Cp nht v tr vi Emulator Location Providers .................................................59 Chn mt Location Provider ................................................................................................60 Tm mt Providers c sn.......................................................................................................60 Tm kim mt Provider theo tiu ch ............................................................................61 Tm mt a ch (Finding Your Location)...................................................................61 Theo di s di chuyn (Tracking Movement) ........................................................62 S dng Goecoder.........................................................................................................................63 Reverse Geocoding..................................................................................................................63 Forward Geocoding ................................................................................................................64 Dng MapView ...........................................................................................................................65 Dng MapActivity ....................................................................................................................66 S dng Overlay ........................................................................................................................67 Dng MapController ..............................................................................................................68 Ch khi to mt ng dng c s dng MapView ........................................69 Gii Thiu Services .................................................................................................................70 To Service ....................................................................................................................................71 Khi chy, iu khin v tng tc vi Sercice ...............................................71 Kt ni Activities vi Services........................................................................................72 Gii thiu Thng bo trong Android.........................................................................74 Gii thiu Notification Manager ...................................................................................74 To thng bo .............................................................................................................................75 Kch hot thng bo ...............................................................................................................76 Chi nhc ........................................................................................................................................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

Lm vic trn 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 dng cc Media APIs ................................................................................................................76

4.11.1 4.11.2
4.12

S dng my nh ................................................................................................................................79

SVTH: Phm Quang o Nguyn Hong Nam

Tm hiu lp trnh trn Android


4.12.1 4.12.2 4.12.3 Chng 5. 5.1 5.2 5.3 Ci t iu khin camera .................................................................................................80 S dng my nh ......................................................................................................................80 Chp nh ........................................................................................................................................81 TNG KT ......................................................................................................................................82

Kt qu t c:....................................................................................................................................82 Hng pht trin ca ti: ..........................................................................................................82 Ti liu tham kho: ................................................................................................................................82

SVTH: Phm Quang o Nguyn Hong Nam

Tm hiu lp trnh trn Android

Chng 1. GII THIU ANDROID


Nh chng ta bit, hin ti c hn na nhn loi s dng my di ng thoi v giao tip qua cc mng khng dy. Con s 3 t ngi ny s cn tng ln v my di ng cng ngy cng "thng minh" vi nhiu chc nng v dch v rt hp dn, cho nn th trng my di ng thng minh s vt xa my vi tnh trong mt tng lai rt gn... V th vic lp trnh trn thit b di ng ngy cng ph bin v pht trin rt mnh m. T nn tng m ngun m, Google cho ra mt Android chy trn cc thit b di ng. Android c rt nhiu cng c v dng c min ph nghin cu v pht trin phn mm trn nn tng ca n. Ti liu ny s gip chng ta tm hiu v Android v cch vit mt ng dng trn nn tng ny.

1.1 KHI NIM V ANDROID:


Trc ht Android l nn tng phn mm da trn m ngun m Linux OS (Kernel 2.6) cho my di ng v nhng phn mm trung gian (middleware) h tr cc ng dng m ngi s dng cn n. Mt cch nh ngha khng qu chuyn mn th c th coi Android l tn mt nn tng m cho thit b di ng ca Google (gm h iu hnh, middleware v mt s ng dng c bn). Android s ng u vi mt s h iu hnh (vit tt l HDH) dnh cho thit b di dng khc ang hm nng th trng nh Windows Mobile, Symbian v d nhin l c OS X (iPhone). C th ni mt cch nm na rng Android l mt HDH chy trn thit b di ng, cng ging nh Windows, Linux hay Mac chy trn my vi tnh vy.

1.1.1 Android khc vi cc h iu hnh chy trn thit b di ng khc


Android thu ht c s ch ca gii cng ngh khp ton cu khi a con ca Google s dng giy php m ngun m. l mt sn phm kt tinh t tng ca Khi Lin minh thit b cm tay m do Google dn u, gm 34 thnh vin vi cc cng ty hng u v cng ngh v di ng ton cu nh Qualcomm, Intel, Motorola, Texas Instruments v LG Electronics, cc nh mng nh T-Mobile, Sprint Nextel, NTT DoCoMo v China Mobile. Cc nh pht trin c th s dng min ph b Kit Android Software Development xy dng cc ng dng ca mnh.

SVTH: Phm Quang o Nguyn Hong Nam

Tm hiu lp trnh trn Android


1.1.2 c tnh m ca Android:
Android c xy dng cho php cc nh pht trin to ra cc ng dng di ng hp dn, tn dng tt c tnh nng mt chic in thoi cung cp. N c xy dng c thc s m. V d, mt ng dng c th gi bt k chc nng li ca in thoi nh thc hin cuc gi, gi tin nhn vn bn, hoc bng cch s dng my nh, cho php cc nh pht trin to ra nhiu ng dng phong ph hn cho ngi dng (iu ny hin cha c trn Windows Phone7 ca Microsoft). Android c xy dng trn m ngun m Linux Kernel. Hn na, n s dng mt my o tu chnh c thit k ti u ha b nh v ti nguyn phn cng trong mt mi trng di ng. Android khng phn bit gia cc ng dng li ca in thoi v cc ng dng ca bn th ba. Tt c c th c xy dng c th truy cp bng kh nng ca mt thit b di ng cung cp cho ngi s dng vi mt di rng cc ng dng v dch v. Vi cc thit b xy dng trn Android, ngi dng c th hon ton thch ng vi in thoi n li ch ca h. Vi Android, mt nh pht trin c th xy dng mt ng dng cho php ngi dng xem v tr ca bn b ca h v c cnh bo khi h ang c trong vng ph cn cho h mt c hi kt ni. Android cung cp truy cp n mt lot cc th vin cng c hu ch v c th c s dng xy dng cc ng dng phong ph. V d, Android cho php cc thit b giao tip vi nhau to iu kin cho ng ng rich-to-peer trong ng dng x hi. Ngoi ra, Android bao gm mt tp hp y cng c c xy dng cng phu, vi vic cung cp nn tng pht trin, vi nng sut cao v ci nhn su vo cc ng dng .

1.2 KIN TRC CA ANDROID:


"Understanding Android" l cch m ta tip cn lp trnh Android v thu hiu kin trc h thng ca n. Chng ta c th khng cn hiu r cu trc ca mt HDH nhng Chng ta vn c th lp trnh mt ng dng trn HDH , y l iu m nh sn xut mun khi release SDK vi mt framework c sn ca h. Nh chng ta bit iu ny cng c mt tt v xu. Framework l mt tng cao cp dnh cho lp trnh

SVTH: Phm Quang o Nguyn Hong Nam

Tm hiu lp trnh trn Android


vin, n u c gii hn ca n, chng ta c th ch c th lp trnh nhng ng dng ph bin nhng khng nn tin ti nhng ng dng cao cp i su vo h thng ca HDH. Theo cch ca mnh, trc khi bt u hc Android, chng ta nn nghin cu qua bn thn HDH Android, chng ta khng cn phi hiu r n nh th no, mc ch quan trng nht ca chng ta l c ci nhn chung v ton din nht v Android.

1.2.1 Android Platform:


Bao gm HDH Android y tnh nng, cc ng dng v cc tng trung gian developer c th m rng, ty chnh hoc thm vo cc component ca h. C 4 tng c bn trong HDH Android: Application Framework, Android Runtime, Native Libraries, Linux Kernel ... Mi tng lm vic u nh s gip ca tng bn di.

1.2.2 Tng Linux Kernel:


y l nhn ca HDH Android, mi x l ca h thng u phi thng qua tng ny. Linux Kernel cung cp cc trnh iu khin thit b phn cng (driver) nh: camera, USB, Wifi, Bluetooth, Display, Power Management ... Android da trn Linux phin bn 2.6 la chn cc tnh nng ct li nh bo mt, qun l b nh, qun l tin trnh, mng stack v cc trnh iu khin phn cng. Kernel hot ng nh mt lp tru tng gia phn cng v phn mm cn li ca h thng.

1.2.3 Native Libraries:


System C library - c ngun gc t h thng th vin chun C (libc), iu chnh cc thit b nhng trn Linux. Media Libraries - m rng t PacketVideo's OpenCORE; th vin h tr playback v recording ca nhiu nh dng video v image ph bin: MPEG4, H.264, MP3, AAC, AMR, JPG, and PNG Surface Manager - qun l vic hin th v kt hp ha 2D v 3D.

SVTH: Phm Quang o Nguyn Hong Nam

Tm hiu lp trnh trn Android


LibWebCore - Android dng li webkit engine cho vic render trnh duyt mc nh ca HDH Android browser v cho dng web nhng (nh HTML nhng) SGL - 2D engine 3D libraries - Th vin 3D da trn OpenGL ES 1.0 API, c nng cp tng tc "hardware 3D acceleration" FreeType - render bitmap v vector font. SQLite - qun l database ca ng dng.

1.2.4 Tng Runtime:


Mi ng dng Android chy trn mt proccess ring ca Dalvik VM (my o). Dalvik c vit chy nhiu my o cng mt lc mt cch hiu qu trn cng mt thit b. My o Dalvik thc thi cc file mang nh dng .dex (Dalvik Excutable), nh dng ny l nh dng c ti u ha ch chim mt vng nh va xi v nh nht c th. VM chy cc class ( c compile trc bi 1trnh bin dch ngn ng Java), s d VM chy c cc class ny l nh chng trnh DX tool convert cc class sang nh dng .dex.

1.2.5 Tng Application Framework:


y l tng m Google xy dng cho cc developer pht trin cc ng dng ca h trn Android, ch bng cch gi cc API c sn m Google vit s dng cc tnh nng ca phn cng m khng cn hiu cu trc bn di. Bng cch cung cp mt nn tng pht trin m, Android cho cc nh pht trin kh nng xy dng cc ng dng cc k phong ph v sng to. Nh pht trin c t do tn dng cc thit b phn cng, thng tin a im truy cp, cc dch v chy nn, thit lp h thng bo thc, thm cc thng bo cc thanh trng thi, v nhiu, nhiu hn na. Tt c cc ng dng thng gm mt b cc dch v v h thng c bn sau:

SVTH: Phm Quang o Nguyn Hong Nam

Tm hiu lp trnh trn Android


View UI dng xy dng layout ca ng dng bao gm: list view, text field, button, dialog, form ... Content Providers cho php cc ng dng c th truy cp d liu t cc ng dng khc (nh ng dng ca ta c th ly thng tin Contacts ca in thoi Android), hoc chia s d liu ca ring ng dng. Resource Manager cung cp cch thc truy cp n non-code resources nh cc asset, graphic, image, music, video ... Notification Manager cho php tt c cc ng dng hin th thng bo ca mnh trn HDH. Activity Manager qun l vng i ca cc ng dng. gc nhn ca ngi dng ta c thm tng application (l ng dng do chng ta vit), sau y l s tng qut nh hnh 1.1:

1-1 Kin trc Android

SVTH: Phm Quang o Nguyn Hong Nam

Tm hiu lp trnh trn Android

Chng 2. MI TRNG LP TRNH


2.1 GII THIU:
Trong chng ny s gii thiu cc cng c lp trnh cho Android (Android Development Tools). Chng ta s dn lm quen vi Eclipse v Android Development Tool plug-in, thng qua Android SDK v cng c ca n, chy mt ng dng Android trn Emulator(tm dch l trnh gi lp giao din ca Android trn PC). Vi nhng k nng trong tay, chng ta s tm hiu cc gi Java packages c cung cp trong SDK gip nng cao kh nng lp trnh trn Android.
2-1 Mi trng lp trnh 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, vit tt ca Android Software Development Kit, c th gi l cng c pht trin phn mm m c th y l pht trin ng dng cho Android OS. n y th chc cc chng ta cng hiu n gin Google Adroid SDK l b cng c c chnh Google xy dng v pht hnh min ph n gii Developer h d dng xy dng v pht trin cc ng dng chy c trn Android OS. Android SDK c cc c tnh sau: c pht trin v cung cp min ph

SVTH: Phm Quang o Nguyn Hong Nam

10

Tm hiu lp trnh trn Android


Truy cp n phn cng Wi-Fi. GSM, EDGE v tnh nng mng 3G cho php vic chuyn d liu, gi in hay gi tin SMS trong mng di ng. Gi API ton din cho cc dch v nn tng v d nh GPS. Truy cp ton b phn cng iu khin a phng tin nh chi nhc, ghi m hay s dng microphone v camera. Chia s d liu trong kho d liu. Tch hp trnh duyt da trn b WebKit (m ngun m). P2P h tr s dung Google Talk. H tr tt ha 3D nh s dng OpenGL ES. Android SDK cn phi c ci t xy dng cc ng dng Android. Android SDK bao gm ti liu tch hp HTML_base li chnh ca Javadoc th hin cc gi v lp trong Java.

2.3 MY O DALVIK:
Mt trong nhng thnh phn quan trng ca Android l my o Dalvik. Thay v s dng my o Java nh trc kia Android s dng my o ca ring n c thit k bo m rng a ng dng c th chy mt m trn mt thit b di ng. My o Dalvik s dng li Linux x l cc chc nng mc thp bao gm bo mt, cc tin trnh, cc lung v qun l vng nh. N cng c th vit bng ng dng C/C++ chy trc tip ln li Linux bn di. Gia phn cng v cc dch v h thng c qun l bi my o Dalvik, n l mt thnh phn gia. Bng cch s dng my o ny chy ng dng, cc nh pht trin hon ton khng phi bn tm g v cc phn cng bn di. Khi my o ny chy n s to ra tp tin c ui l .dex, tp tin ny c SDK to ra bi s chuyn i t cc lp bin dch ngn ng Java .

2.4 CC GI JAVA CN THIT:


java.lang gi cha cc lp li ca Java java.io xut nhp. java.net kt ni mng.

SVTH: Phm Quang o Nguyn Hong Nam

11

Tm hiu lp trnh trn Android


java.util _ cha cc lp tin ch. Bao gm: Log thng c dng vit LogCat. java.text tin ch s l vn bn. java.math cc lp ton hc. javax.net cc lp mng. javax.security Security-related classes. javax.xml cc lp lin quan n DOM-based XML. org.apache.* cc lp lin quan n HTTP-related. org.xml cc lp lin quan n SAX-based XML . Cc gi dng cho lp trnh Android: Android.appAndroid application model access Android.contenttruy xut d liu trong Android Android.netbao gm Uri class dng cho vic truy xut cc ni dung khc Android.graphics ha Android.openglcc lp OpenGL Android.ostruy cp mc h thng n mi trng Android Android.providercc lp lin quan n ContentProvider Android.telephonykh nng truy cp Telephony Android.textText layout Android.utiltp cc tin thao tc trn vn bn,bao gm XML Android.viewthnh phn UI (giao din ngi dng) Android.webkitBrowser functionality Android.widgetthnh phn UI mc cao hn Trong cc gi gn nh l li ca mi ng dng trn Android l Android.app, Android.view v Android.content.

2.5 THNH PHN CHNH CA ECLIPSE KHI TO NG DNG TRN ANDROID:


Mi trng pht trin Rich Java bao gm trnh bin dch, class autocompletion, v tch hp Javadoc By li code

SVTH: Phm Quang o Nguyn Hong Nam

12

Tm hiu lp trnh trn Android


Qun l v chy Android Emulator profile The Dalvik Debug Monitoring Service (DDMS) Khung nhn cc tin trnh (Thread and heap views) Qun l H thng tp tin giao din (Emulator filesystem management) iu khin d liu v hi thoi (Data and voice network control) iu khin giao din (Emulator control) Ghi li h thng v ng dng (System and application logging)

2.6 THNH PHN QUAN TRNG TRONG MT ANDROID PROJECT:


Activity (Android.app.Activity): y l lp khi to giao din ng dng ni b trn Android tng t nh MIDlet trong J2ME. Service (Android.app.Service): cung cp cc dch v lin quan n client/service. Mt Service s chy ngm bn di, sau cc client (Activity) s kt ni v truy xut cc hm trn dch thng qua Interface class. Broadcast receiver (Android.content.BroadcastReceiver): y l mt ng dng chy ngm dng c v cp nht thng tin trn UI, v d nh cp nht s thay i gi, pin... Content Provider: cung cp chc nng truy vn d liu gia cc ng dng ca Android. Intent: nn tng truyn ti cc thng bo. Intent c s dng gi cc thng bo i nhm khi to 1 Activity hay Service thc hin cng vic m chng ta mong mun.

2.7 CHU K SNG CA NG DNG ANDROID


Mt tin trnh Linux gi gn mt ng dng Android c to ra cho ng dng khi codes cn c xy dng, khi chy v s cn chy cho n khi: N khng ph thuc. H thng cn ly li b nh m n chim gi cho cc ng dng khc.

SVTH: Phm Quang o Nguyn Hong Nam

13

Tm hiu lp trnh trn Android


Mt s khc thng v c tnh c bn ca Android l thi gian sng ca tin trnh ng dng khng c iu khin trc tip bi chnh n. Thay vo , n c xc nh bi h thng qua mt kt hp ca: Nhng phn ca ng dng m h thng bit ang chy. Nhng phn quan trng nh th no i vi ngi dng. Bao nhiu vng nh chim lnh trong h thng.

2.7.1 Chu k sng thnh phn


Cc thnh phn ng dng c mt chu k sng, tc l mi thnh phn t lc bt u khi to v n thi im kt thc, i lc chng c th l active (visible hoc invisible) hoc inactive.

2.7.2 Activity Stack


Bn trong h thng cc activity c qun l nh mt activity stack. Khi mt Activity mi c start, n c t nh ca stack v tr thnh activity ang chy activity trc s bn di activity mi v s khng thy trong sut qu trnh activity mi tn ti. Nu ngi dng nhn nt Back th activity kt tip ca stack s di duyn ln v tr thnh active.

Hinh 2-2 Activity stack

SVTH: Phm Quang o Nguyn Hong Nam

14

Tm hiu lp trnh trn Android


2.7.3 Cc trng thi ca chu k sng

Hinh 2-3 Chu k sng ca Activity

Mt Activity ch yu c 4 chu k chnh sau: Active hoc running: Khi Active l c chy trn mn hnh. Activity ny tp trung vo nhng thao tc ca ngi dng trn ng dng. Paused: Activity l c tm dng (paused) khi mt focus nhng ngi dng vn trng thy. C ngha l mt Activity mi trn n nhng khng bao ph y mn hnh. Mt Activity tm dng l cn sng nhng c th b kt thc bi h thng trong trng hp thiu vng nh. Stopped: Nu n hon ton bao ph bi Activity khc. N vn cn trng thi v thng tin thnh vin trong n. Ngi dng khng thy n v thng b loi b trong trng hp h thng cn vng nh cho tc v khc. Killed: Khi h thng b thiu b nh, n s gii phng cc tin trnh theo nguyn tc u tin. Cc Activity trng thi stop hoc paused cng c th b gii phng v khi n c hin th li th cc Activity ny phi khi ng li hon ton v phc hi li trng thi trc .

2.7.4 Chu k sng ca ng dng


Trong mt ng dng Android c cha nhiu thnh phn v mi thnh phn u c mt chu trnh sng ring. V ng dng ch c gi l kt thc khi

SVTH: Phm Quang o Nguyn Hong Nam

15

Tm hiu lp trnh trn Android


tt c cc thnh phn trong ng dng kt thc. Activity l mt thnh phn cho php ngi dng giao tip vi ng dng. Tuy nhin, khi tt c cc Activity kt thc v ngi dng khng cn giao tip c vi ng dng na nhng khng c ngha l ng dng kt thc. Bi v ngoi Activity l thnh phn c kh nng tng tc ngi dng th cn c cc thnh phn khng c kh nng tng tc vi ngi dng nh l Service, Broadcast receiver. C ngha l nhng thnh phn khng tng tc ngi dng c th chy background di s gim st ca h iu hnh cho n khi ngi dng t tt chng.

2.7.5 Cc s kin trong chu k sng ca ng dng


Nu mt Activity c tm dng hoc dng hn, h thng c th b thng tin khc ca n t vng nh bi vic gi hm finish() ca n, hoc n gin git tin trnh ca n. Khi n c hin th ln na vi ngi dng, n phi c hon ton restart v phc hi li trng thi trc. Khi mt Activity chuyn qua chuyn li gia cc trng thi, n phi bo vic chuyn ca n bng vic gi hm transition.

Hinh 2-4

Tt c cc phng thc l nhng mc ni m chng ta c th override lm tng thich cng vic trong ng dng khi thay i trng thi. Tt c cc Activity bt buc phi c onCreate() khi to ng dng. Nhiu Activity s cng hin thc onPause() xc nhn vic thay i d liu v mt khc chun b dng hot ng vi ngi dng.

2.7.6 Thi gian sng ca ng dng


By phng thc chuyn tip nh ngha trong chu k sng ca mt Activity. Thi gian sng ca mt Activity din ra gia ln u tin gi onCreate() n trng thi cui cng gi onDestroy(). Mt Activity khi to

SVTH: Phm Quang o Nguyn Hong Nam

16

Tm hiu lp trnh trn Android


ton b trng thi ton cc trong onCreate(), v gii phng cc ti nguyn ang tn ti trong onDestroy().

2.7.7 Thi gian hin th ca Activity


Visible lifetime ca mt activity din ra gia ln gi mt onStart() cho n khi gi onStop(). Trong sut khong thi gian ny ngi dng c th thy activity trn mn hnh, c ngha l n khng b foreground hoc ang tng tc vi ngi dng. Gia 2 phng thc ngi dng c th duy tr ti nguyn hin th activity n ngi dng.

2.7.8 Cc hm thc thi


OnCreate(...): hm ny c gi khi lp Activity c khi to, dng thit lp giao din ng dng v thc thi nhng thao tc c bn. onStart(): hm ny c gi khi lp ng dng xut hin trn mn hnh. onResume(): hm c gi ngay sau OnStart hoc khi ngi dng focus ng dng, hm ny s a ng dng ln top mn hnh. onPause(): hm c gi khi h thng ang focus n 1 activity trc . onStop(): hm c gi khi mt activity khc c khi ng v focus. onRestart(): c gi khi ng dng chuyn sang onStop(), nhng mun khi ng li bng onStart().

2.8 CC CNG C CN THIT LP TRNH TRN ANDROID V


CI T:

NG DN

2.8.1 Cc cng c cn thit lp trnh:


H iu hnh: Window XP, Win7 Cng c lp trnh: Eclipse version 3.6 hoc cao hn B cng c Android SDK

2.8.2 Cc bc ci t:
Chng ta c 3 bc chnh: Ci t Eclipse IDE, Plugin Android cho Eclipse v cui cng l ci t Emulator (Android SDK). V c chia thnh cc bc nh sau:

SVTH: Phm Quang o Nguyn Hong Nam

17

Tm hiu lp trnh trn Android


Bc 1: Vo a ch http://www.eclipse.org/downloads/ download phn mn lp trnh eclipse. Chn phn Eclipse IDE cho cc nh pht trin JAVA. Sau khi download eclipse chng ta gii nn ra s dng. Sau khi gii nn xong cho chy chng trnh. Khi chy, chng trnh mun lu th mc lm vic, chng ta chn th mc ty v nhn OK. Bc 2: truy cp

www.oracle.com/technetwork/java/javase/downloads/index.html JAVA SE v tin hnh ci t.

downloads JAVA SE . Chn downloads JAVA SE > vo th mc cha Bc 3: Truy cp developer.Android.com/sdk/index.html . V tin hnh download chn phn Android-sdk_r10-windows.zip . Sau khi downloads vo th mc cha phn download gii nn v chn SDK Manager.exe chy chng trnh t ng update. Vo chng trnh eclipse chn menu Help -> Install New Software Name: Google Android ( ty ) Location : http//:dl-ssl-google.com/Android/eclipse Sau chn OK.

Hnh 2-5 Chn Sellect All , chn vo cc nh hnh 2.7

SVTH: Phm Quang o Nguyn Hong Nam

18

Tm hiu lp trnh trn Android

Hnh 2-6 Sau chng trnh t ng cp nht nhng bn cn ci t. Tip theo bn chn nhng phn cn thit ci t hoc chn tt c -> Next -> chn I accept the terms of the license agreements ->finsh. Lu khi ci: windows mun chng thc, bc ny chn OK. Sau khi ci xong chn Restsart Now. Bc 4: Khi chng trnh ci t phn Android SDK hon tt v khi ng li chng trnh, vo Window ->Prefeneces ch ng dn ca file SDK.

Hnh 2-7 bc ny chn ng dn ti th mc cha Android SDK. Sau chn Apply. Bc 5: cc bc trn cu hnh Android SDK trong eclipse , bc tip theo s i cu hnh to ra 1 my o cha h iu hnh Android. Vo Window -> Android SDK and AVD Manager.

SVTH: Phm Quang o Nguyn Hong Nam

19

Tm hiu lp trnh trn Android


Ca s Android SDK and AVD Manager hin ra , chng trnh ang t ng cp nht. Sau chn Virtual Decvices -> New. Name ( Tn my o) : AndroidMobile2.2 Size (kch thc b nh ): 512 MB Chn Create AVD

Hnh 2-8

to thnh cng my o , tip theo chn Start..-> Launch khi ng my o.

Hnh 2-9

2.9 BT U LP TRNH 1 C

NG TRN

ELLO WORLD U TIN:

Lu y ti dng Emulator bng 2.2. M Eclipse

SVTH: Phm Quang o Nguyn Hong Nam

20

Tm hiu lp trnh trn Android


Chn File > New > Project Chn Android Project v t tn nh hnh bn di nh: Dng Project Name: HelloAndroid Dng Application Name: HelloAndroid Package name: com.HelloAndroid Activity name: HelloAndroid_Activity Min SDK version : 8

2-10

Th l chng ta c 1 ng dng nh ri . Sau khi ng Android Emulator bng cch vo menu Window > Android SDK and ADV manager > chn thit b to phn trn v click Start>Launch.

Hnh 2.13 Vy l ta c 1 chic in thoi Mobile Android chy ngay trn my tnh ri . By gi chng ta quay v mn hnh Eclipse v Click vo Run> chn Android Application > OK

SVTH: Phm Quang o Nguyn Hong Nam

21

Tm hiu lp trnh trn Android


Chng ta c c ng dng cho hnh sau:

2-11

By gi chng ta s tm hiu su hn v ng dng ny. Quay li mn hnh Eclipse ln lt vo cc mc : Src>HelloAndroid_Activity.java Res> layout>main.xml Res>values>string.xml y chnh l 3 file quan trng trong mt ng dng Android By gi chng ta vo file String.xml thay dng
<string name="hello">Hello World, HelloAndroid_Activity!</string>

Bng dng <string name="hello">Xin cho Android!</string> V run chng ta s to ra 1 ng dng c giao din thun Vit ng ngha.

2-12

SVTH: Phm Quang o Nguyn Hong Nam

22

Tm hiu lp trnh trn Android


2.10 THNH PHN GIAO DIN ANDROID
2.10.1 View
View

GroupView

w
Layout
Widget

Control

(compound

control)

Control 2-13

Control

Control

Trong Android giao din ngi dng c xy dng t cc i tng View. Trong Android Platform, cc screen lun c b tr theo mt kiu cu trc phn cp nh hnh trn. Mt screen l mt tp hp cc Layout v cc widget c b tr c th t. th hin mt screen th trong hm onCreate ca mi Activity cn phi c gi mt hm l setContentView (R.layout.main); hm ny s load giao din t file MAIN.XML ln phn tch thnh m bytecode.

2.10.2 VIEWGROUP:
ViewGroup l s m rng ca class View hay ni cch khc ViewGroup chnh l cc WidgetLayout c dng b tr cc i tng khc trong mt screen.C cc loi ViewGroup nh sau:

Linear Layout

LinearLayout c dng b tr cc thnh phn giao din theo chiu ngang hoc chiu dc nhng trn mt line duy nht m khng c xung dng.

Frame layout

FrameLayout c dng b tr cc i tng theo kiu ging nh lcc Layer trong Photoshop. Nhng i tng no thuc Layer bn di th s b che khut bi cc i tng thuc Layer nm trn. FrameLayer thng c s dng khi mun to ra cc i tng c khung hnh bn ngoi chng hn nh contact image button.

SVTH: Phm Quang o Nguyn Hong Nam

23

Tm hiu lp trnh trn Android


Table layout

Layout ny c s dng khi cn thit k mt table cha d liu hoc cn b tr cc widget theo cc row v column. Chng hn nh, giao din ca mt chic my tnh n gin hoc mt danh sch d liu.

AbsoluteLayout

Layout ny c s dng b tr cc widget vo mt v tr bt k trong layout da vo 2 thuc tnh to x, y. Tuy nhin, kiu layout ny rt t khi c dng bi v to ca cc i tng lun c nh v s khng t iu chnh c t l khong cch gia cc i tng. Khi chuyn ng dng sang mt mn hnh c kch thc vi mn hnh thit k ban u th v tr ca cc i tng s khng cn c chnh xc nh ban u. Dng cu lnh <AbsoluteLayout></ AbsoluteLayout> gi Layout ny. Mun nh v mt i tng, phi nh v hai gi tr Android:layout_x="" v Android:layout_y="".
<AbsoluteLayout xmlns:Android="http://schemas.Android.com/apk/res/Android" Android:layout_width="fill_parent" Android:layout_height="fill_parent" Android:id="@+id/mainlayout"> <Button Android:layout_width="wrap_content" Android:layout_height="wrap_content" Android:text="placed at 100,130 pixels (px)" Android:layout_x="100px" Android:layout_y="130px" /> <AbsoluteLayout>

V d: Th to ra nhng button v cho nhng button ny nm nhng v tr khc nhau: Cc button ny nm nhng v tr khc nhau vi cc ch s o lng khc nhau.

SVTH: Phm Quang o Nguyn Hong Nam

24

Tm hiu lp trnh trn Android

Hnh 3.4

RELATIVE LAYOUT
Layout ny cho php b tr cc widget theo mt trc i xng ngang

hoc dc. t c ng v tr th cc widget cn c xc nh mt mi rng buc no vi cc widget khc. Cc rng buc ny l cc rng buc tri, phi, trn, di so vi mt widget hoc so vi layout parent. Da vo nhng mi rng buc m RetaliveLayout cng khng ph thuc vo kch thc ca screen thit b. Ngoi ra, n cn c u im l gip tit kim layout s dng nhm mc ch gim lng ti nguyn s dng khi load ng thi y nhanh qu trnh x l.

2-14 B tr widget trong RetaliveLayout

Cc i tng trong Layout ny phi c id to mi quan h gia cc i tng. Android:layout_alignParentRight="true" cu lnh ny gip i tng sau khng nm ln i tng trc .

SVTH: Phm Quang o Nguyn Hong Nam

25

Tm hiu lp trnh trn Android


Android:layout_marginLeft="" cho bit i tng nm cch l phi v tri bao nhiu. i tng sau mun to mi quan h vi i tng trc, v mun cho hai i tng nm v tr no th s dng cu lnh: <Android:layout_alignTop= "@id/">
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android" Android:layout_width="fill_parent" Android:layout_height="fill_parent"> <Button Android:id="@+id/ok" Android:layout_width="wrap_content" Android:layout_height="wrap_content" Android:layout_alignParentRight="true" Android:layout_marginLeft="10dip" Android:text="Test" /> <Button Android:layout_width="wrap_content" Android:layout_height="wrap_content" Android:layout_alignTop="@id/ok" Android:text="Test" /> </RelativeLayout>

2.11 CC CONTROL
2.11.1 BUTTON
S d widget button c gii thiu u tin trong s cc widget khc l v y l i tng c th ni l c dng nhiu nht trong hu ht cc ng dng Android. thit k giao din vi mt button ta c 2 cch nh sau:
<Button Android:layout_width="wrap_content" Android:layout_height="wrap_content" Android:id="@+id/cmdButton1" Android:text="Touch me!" />

y l cch lm ra mt button n gin. on m trn sau khi chy:

SVTH: Phm Quang o Nguyn Hong Nam

26

Tm hiu lp trnh trn Android

2-15

Thc ra nu khng phi i hi phi custom li mt widget th khng cn phi s dng ti code. Trong mt s trng hp bt buc chng ta phi custom cc widget cho ph hp vi hon cnh. Chng hn nh trong game, cc menu hay cc nt iu khin, khai bo mt Button trong code ta lm nh sau:
void showButton() { setContentView(R.layout.button); Button next = (Button) findViewById(R.id.btnButton); next.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { Toast.makeText(getApplicationContext(), "Bn va click vo Button", Toast.LENGTH_SHORT).show(); } }); }

nh 2-16

2.11.2 LISTVIEW
c s dng th hin mt danh sch cc thng tin theo tng cell. Mi cell thng thng c load ln t mt file XML c c nh trn s lng thng tin v loi thng tin cn c th hin.

SVTH: Phm Quang o Nguyn Hong Nam

27

Tm hiu lp trnh trn Android


th hin c mt list thng tin ln mt screen th cn phi c 3 yu t chnh: Data Source: Data Source c th l mt ArrayList, HashMap hoc bt k mt cu trc d liu kiu danh sch no. Adapter: Adapter l mt class trung gian gip nh x d liu trong Data Source vo ng v tr hin th trong ListView. Chng hn, trong Data Source c mt trng name v trong ListView cng c mt TextView th hin trng name ny. Tuy nhin, ListView s khng th hin th d liu trong Data Source ln c nu nh Adapter khng gn d liu vo cho i tng hin th. ListView: ListView l i tng hin th cc thng tin trong Data Source ra mt cch trc quan v ngi dng c th thao tc trc tip trn .

2-17

gi i tng ListView trong xml. Mi ListView phi c ID gi trong Activity. <ListView Android:id="@+id/ListView01" Android:layout_width="wrap_content" Android:layout_height="wrap_content" /> to cc i tng trong file Activity th phi khai bo:
public class TestActivity extends Activity { private ListView lv1; private String lv_arr[] =

{"Android","iPhone","BlackBerry","AndroidPeople"}; @Override public void onCreate(Bundle icicle)

SVTH: Phm Quang o Nguyn Hong Nam

28

Tm hiu lp trnh trn Android


{ super.onCreate(icicle); setContentView(R.layout.main); lv1=(ListView)findViewById(R.id.ListView01); // By using setAdpater method in listview we an add string array in list. lv1.setAdapter(new ArrayAdapter<String>(this,Android.R.layout.simple_list_item_ 1 , lv_arr)); }

V d: To ra mt ListView gm cc thnh phn Android, iPhone, BlackBerry, AndroidPeople:

2-18

2.11.3 EDITTEXT
Trong Android i tng EditText c s dng nh mt TextField hoc mt TextBox. Gi tr Android:singleLine bng false, edittext s l 1 Texbox, ngc li n l 1 Textfield.
<EditText Android:id="@+id/EditText01" Android:layout_width="wrap_content" Android:layout_height="wrap_content" Android:textStyle="bold" Android:textSize="20dip" Android:textColor="#000000" Android:text="Hello Android!" Android:singleLine="true" Android:inputType="textCapWords" />

SVTH: Phm Quang o Nguyn Hong Nam

29

Tm hiu lp trnh trn Android

2-19

2.11.4 TEXTVIEW
TextView c tc dng l hin th vn bn.
<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 on m trn, Android:text="" dng ghi on text mun th hin, Android:textColor="" nh dng mu ch, Android:textSize="" kch c ch, Android:gravity="" dng canh chnh cho on text. Nu mun tm hiu thm, hy g Android: sau nhn Crtl+ Space tm hiu thm v cc thuc tnh ca n.

2.11.5 CHECKBOX
Nhn hai gi tr true hoc false. i tng CheckBox cho php chn nhiu item cng mt lc.
XML: <CheckBox Android:id="@+id/CheckBox01" Android:layout_width="wrap_content"

SVTH: Phm Quang o Nguyn Hong Nam

30

Tm hiu lp trnh trn Android


Android:layout_height="wrap_content" Android:text="True" Android:checked="true" />

Kt qu nh sau:

2-20

2.11.6 MENUOPTION
C 2 cch to mt MenuOptions: To bng code v tp tin XML, di y chng ta dng XML

h 2-21

Khai bo bng code XML:


<menu xmlns:Android="https://schemas.Android.com/apk/res/Android"> <item Android:id="@+id/checkbox" Android:title="Checkbox" /> <item Android:id="@+id/button" Android:title="Button" /> <item Android:id="@+id/edittext" Android:title="Edittext" /> //tip tc cho cc menu khc

SVTH: Phm Quang o Nguyn Hong Nam

31

Tm hiu lp trnh trn Android


</menu>

2.11.7 CONTEXTMENU
ContextMenu c s dng hin th cc tu chn khi ngi dng nhn di vo mt Button trn mn hnh. to mt ContextMenu ta cng c 2 cch ging nh to MenuOptions trn ch khc tn phng thc. Phng thc:
onCreateContextMenu( ContextMenu menu, View v,

ContextMenuInfo menuInfo)

s c gi v truyn vo 3 tham s l: ContextMenu: i tng add cc context menu item View: i tng ni m xy ra s kin ContextMenuInfo: Cho bit v tr xy ra s kin trong ListView.

2-22

2.12 TY BIN CONTROL (CUSTOM CONTROL):


Chng ta bit Android cung cp cho chng ta rt nhiu Control hu ch.Tuy nhin ng dng ca chng ta i khi cng cn nhng control do chnh chng ta to ra p ng cc nhu cu ca ng dng m vic s dng cc control c sn rt kh khn. y chng ta s to ra mt ListView, vi mu nn v mu ch bt mt. Bc 1: To mt Class c tn CustomListView nh sau:

SVTH: Phm Quang o Nguyn Hong Nam

32

Tm hiu lp trnh trn Android


public class CustomListView extends //cac cong cu ve CustomListView private Paint marginPaint; private Paint linePaint; private int paperColor; private float margin; public CustomListView(Context c, super(c, a, ds); init(); } public CustomListView(Context c) super(c); init(); } public CustomListView(Context c, super(c, a); init(); } private void init() { TextView {

AttributeSet a, int ds) {

AttributeSet a) {

} @Override protected void onDraw(Canvas c) { //s dng lp cha TextView v text super.onDraw(c); }

Bc 2: to file colors.xml trong res/values. To ra mu cho paper, margin, line, text.


<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>

Bc 3: to file dimens.xml trong res/values to gi tr margin cho paper.


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

Bc 4: vi nhng gi tr to ta tip tc vit code cho hm init() khai bo trong file CustomListView.java:

SVTH: Phm Quang o Nguyn Hong Nam

33

Tm hiu lp trnh trn Android


private void init() { Resources myResources = getResources(); // tao choi ve, chung ta se su dung trong onDraw marginPaint = new Paint(Paint.ANTI_ALIAS_FLAG); marginPaint.setColor(myResources.getColor(R.color.notepad_ margin)); linePaint = new Paint(Paint.ANTI_ALIAS_FLAG); // lay background paper va margin width paperColor = myResources.getColor(R.color.notepad_paper); margin = myResources.getDimension(R.dimen.notepad_margin); }

Bc 5: Tip tc vit thm code cho hm onDraw()


@Override protected void onDraw(Canvas c) { // ve mau cho paper c.drawColor(paperColor); //c.drawLine(startX, startY, stopX, stopY, paint) c.drawLine(0, 0, getMeasuredHeight(), 0, linePaint); c.drawLine(0, getMeasuredHeight(), getMeasuredWidth(), getMeasuredHeight(), linePaint); // ve margin c.drawLine(margin, 0, margin, getMeasuredHeight(), marginPaint); // di chuyen text khoang margin vua tao c.save(); c.translate(margin, 0); // su dung text view de render text super.onDraw(c); c.restore(); }

Bc 6: to mt file customlistview.xml trong res/layout:


<com.example.UserInterface.CustomListView xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:padding = "10dp" android:scrollbars = "vertical" android:textColor = "@color/notepad_text" android:fadingEdge = "vertical" />

SVTH: Phm Quang o Nguyn Hong Nam

34

Tm hiu lp trnh trn Android


2.13 V D S DNG LISTVIEW
Bc 1: Khai bo trong file strings.xml v main.xml nh sau:
<resources> <string name="hello">Hello World, Main!</string> <string name="app_name">V d v ListView</string> <string name="str_btnAdd">Thm</string> </resources>

V trong main.xml, chng ta khai bo mt TextView, mt Button, mt Listview c tn ln lt nh sau: txtItem, btnAdd, listItems. Bc 2: Vit trong activity Main.java, s dng custom listview va to trn.
ArrayList<String> arr = new ArrayList<String>(); ArrayAdapter<String> aa; String flower[]={"Hoa Lan","Hoa Hu","Hoa Hng"}; String animal[]={"Voi","S t","H"}; String currentMenu; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); btnAdd = (Button) findViewById(R.id.btnAdd); txtItem = (EditText) findViewById(R.id.txtItem); listItems = (ListView) findViewById(R.id.listItems); txtItem.setOnKeyListener(this); btnAdd.setOnClickListener( this); arr = new ArrayList<String>(); //doan code su dung customlistview aa = new ArrayAdapter<String>(this,R.layout.customlistview,arr); listItems.setAdapter(aa); }

Bc 3: to mt menu bng on code sau, trc khi to mt menu lm theo hnh sau:

2-23

public boolean onCreateOptionsMenu(Menu menu)

SVTH: Phm Quang o Nguyn Hong Nam

35

Tm hiu lp trnh trn Android


{ super.onCreateOptionsMenu(menu); MenuItem item; item = menu.add("Xa"); item.setIcon(R.drawable.delete); item = menu.add("ng vt"); item.setIcon(R.drawable.animal); item = menu.add("Hoa"); item.setIcon(R.drawable.flower); return true; } public boolean onOptionsItemSelected(MenuItem { super.onOptionsItemSelected(item); if (item.hasSubMenu()==false) { if (item.getTitle().toString() == currentMenu = "Animal"; this.displayPopup("Chn con this.animal); } if (item.getTitle().toString() == currentMenu = "Flower"; this.displayPopup("Chn hoa this.flower); } if (item.getTitle().toString() == int index = listItems.getSelectedItemPosition(); this.deleteItem(index); } } return true; } item)

"ng vt") { vt no?", "Hoa") { no?", "Xa") {

Bc 4: vit thm cc hm x l s kin:


public boolean onKey(View v, int keyCode, KeyEvent event) { if (event.getAction() == KeyEvent.ACTION_DOWN && keyCode == KeyEvent.KEYCODE_DPAD_CENTER) { addItem(txtItem.getText().toString()); return true; } return false; } @Override public void onClick(View v) { if (v == btnAdd) { addItem(txtItem.getText().toString()); } } @Override public void onClick(DialogInterface dialog, int i) { if (currentMenu=="Animal") { this.addItem(animal[i]); } if (currentMenu=="Flower") { this.addItem(flower[i]); } }

SVTH: Phm Quang o Nguyn Hong Nam

36

Tm hiu lp trnh trn Android


Bc 5: v cui cng chng ta s thm cc hm
private void deleteItem(int index) { if (index>=0) { String itemName = (String) listItems.getItemAtPosition(index); arr.remove(index); aa.notifyDataSetChanged(); //hin cu thng bo m khi xa 1 item Toast.makeText(getApplicationContext(), itemName + " c xa", Toast.LENGTH_SHORT).show(); } } private void displayPopup(String title, String [] item) { Builder builder = new AlertDialog.Builder(this); builder.setTitle(title); builder.setItems(item, this); builder.show(); } public void addItem(String item) { if (item.length()>0) {

arr.add(item); aa.notifyDataSetChanged(); txtItem.setText(""); //hin cu thng bo m khi thm 1 item vo Toast.makeText(getApplicationContext(), item + " thm", Toast.LENGTH_SHORT).show(); } }

Bc 6: Chy chng trnh v kt qu nh sau:

2-24

SVTH: Phm Quang o Nguyn Hong Nam

37

Tm hiu lp trnh trn Android

Chng 4. LP TRNH TRN ANDROID


4.1 GII THIU INTENTS:
Intent l cu ni gia cc Activity (ng dng Android thng bao gm nhiu Activity, mi Activity hot ng c lp vi nhau v thc hin nhng cng vic khc nhau). Intent chnh l ngi a th, gip chng ta triu gi cng nh truyn cc d liu cn thit thc hin mt Activity t mt Activity khc.

4-1

4.1.1 Thnh phn Intents:


Thc ra Intent l mt cu trc d liu c m t trong Android.content.Intent.

4-2

Cc Action nh ngha sn:

SVTH: Phm Quang o Nguyn Hong Nam

38

Tm hiu lp trnh trn Android

4-3

T nh ngha action: V nguyn tc chng ta c th t tn action ca mt intent l bt c th g theo chun t tn thng thng, hay thm ch dng lun hng action nh ngha sn nh ACTION_VIEW (hay Android.intent.action.VIEW). Ci tn VIEW thc cht ch l mt tn gi t, chng ta c th dng n vi mc ch thc hin mt activity gi mail! Tuy nhin iu r rng l rt ng ngn. Thay vo ta hy dng ACTION_SEND hay ACTION_SENDTO. Vic t tn action cho intent ng tn gi t cn c mt ngha khc l app ca chng ta c th c triu gi t mt app khc. V d chng ta vit mt app c activity p ng intent ACTION_SEND v chia s mt bc nh ln trang web ca chng ta (ging nh ta lm vi Facebook, Flickr etc.) Khi c th app ca chng ta s l mt la chn chia s nh ca ngi dng in thoi.

4.1.2 S dng Intents khi ng cho Activities:


Ph bin nht trong Intents l vic lin kt d liu gia cc thnh phn ng dng, Intents c dng bt u, dng li v chuyn tip gia cc Activities trong ng dng. m mt ng dng khc trong mt ng dng c sn th chng ta gi startActivity nh sau: startActivity(myIntent); theo di thng tin phn hi t phng thc m ta s dng phng thc : startActivityForResult(Intent)

SVTH: Phm Quang o Nguyn Hong Nam

39

Tm hiu lp trnh trn Android

4-4

4.1.3 Intent khng tng minh thc thi Activity:

Trong trng hp ny intent khng ch nh mt lp c th m thay vo dng cc d liu khc (action, data, type, etc.) v h thng t quyt nh xem lp no (app no) s thch hp p ng intent . Thng tin action v category ca activity trong mt app p ng intent phi c khai bo trong Manifest ca app (AndroidManifest.xml) di dng Intent-filter (tt nhin nu chng ta mun gi mt built-in action th ta khng cn quan tm n vn ny). V d: chng ta mun cho php ngi dng thc hin cuc gi t mt ng dng, hn l thc hin quay s mi, chng ta c th s dng mt nh ngm yu cu hnh ng ("quay s") c thc hin trn mt in thoi nh trong on m di y: if (somethingWeird && itDontLookGood) { Intent intent = newIntent(Intent.ACTION_DIAL,Uri.parse(tel:555-2368)); startActivity(intent); }
4.1.4

Intent tng minh thc thi Activity


Nh trnh by phn trn, intent c th dng thuc tnh ph

component ch nh ch danh tn lp s thc thi Activity. thc hin iu ny, lp Intent cung cp cc hm l setComponent(ComponentName) v setClass(Context, Class) v setClassName(Context, String)

setClassName(String, String). Ch c dng gi cc Activities trong cng mt app

SVTH: Phm Quang o Nguyn Hong Nam

40

Tm hiu lp trnh trn Android


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

4.1.5 S dng Intents gi i thng ip ra ngoi ng dng hoc Activity:


L mt c ch truyn tin cp h thng, c kh nng gi tin n mt tin trnh. Chng ta c th s dng Broadcast Receivers nhn, tr li hoc pht i cc d liu m chng ta mun. Broadcast Intent dng thng bo cho cc ng dng khc cc s kin ca h thng hay ng dng, m ra cc m hnh lp trnh hng s kin gia cc ng dng. Broadcast Intent gip cho ng dng ca chng ta ci m hn bi v n pht i mt s kin bng cch s dng Intent.

4.1.5.1 Cch thc hin gi d liu dng Intent trong Activity:


Broadcast Intent thc t kh n gin, trong cc thnh phn ng dng ca chng ta, chng ta xy dng mt Intent m chng ta mun qung b bng cch s dng sentBroadcast gi i.
V d : Intent intent = new Intent(NEW_LIFEFORM_DETECTED); intent.putExtra(lifeformName, lifeformType); intent.putExtra(longitude, currentLongitude); intent.putExtra(latitude, currentLatitude); sendBroadcast(intent);

4.1.5.2 Nhn d liu vi Broadcast Receiver:


BroadcastReceivers c dng nhn d liu t Broadcast Intents, kch hot BroadcastReceivers th n cn phi c ng k hoc khai trong code hoc trong Mainifest v chng ta cn phi s dng Intents Filter xc nh Intent c php gi d liu n. V d: khi to mi mt BroadcastReceivers .
import Android.content.BroadcastReceiver; import Android.content.Context; import Android.content.Intent; public class MyBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { //TODO: React to the Intent received.

SVTH: Phm Quang o Nguyn Hong Nam

41

Tm hiu lp trnh trn Android


} }

Thng thng th BroadcastReceivers s cp nht ni dung, khi ng dch v , cp nht ngi dng cui, hoc thng bo ngi s dng bng cch s dng qun l Notification Manager. V d oan code sau y cho thy cch ng k

BroadcastReceivers trong code hoc trong Mainifest.


public class LifeformDetectedBroadcastReceiver extends BroadcastReceiver { public static final String BURN=com.paad. alien.action.BURN_IT_WITH_FIRE; @Override public void onReceive(Context context, Intent intent) { // Get the lifeform details from the intent. Uri data = intent.getData(); String type = intent.getStringExtra(type); double lat = intent.getDoubleExtra(latitude, 0); double lng = intent.getDoubleExtra(longitude, 0); Location loc = new Location(gps); loc.setLatitude(lat); loc.setLongitude(lng); if (type.equals(alien)) { Intent startIntent = new Intent(BURN, data); startIntent.putExtra(latitude, lat); startIntent.putExtra(longitude, lng); context.startActivity(startIntent); } } }

g k Broadcast Receivers trong file Manifest:


<receiver Android:name = .LifeformDetectedBroadcastReceiver > <intent-filter> <action Android:name = com.paad.action.NEW_LIFEFORM/> </intent-filter> </receiver>

g k Broadcast Receivers s dng code: // to v ng k broadcast receiver. IntentFilter filter = new IntentFilter(NEW_LIFEFORM_DETECTED); LifeformDetectedBroadcastReceiver r = new LifeformDetectedBroadcastReceiver(); registerReceiver(r, filter);

SVTH: Phm Quang o Nguyn Hong Nam

42

Tm hiu lp trnh trn Android


4.2 GII THIU ADAPTERS:
Adapter l cu ni lin kt d liu vi giao din ngi dng..

4.2.1 Mt s Adapter :
s dng c Adapter ta phi k tha lp tru tng AdapterView, v chng ta cng c th to ra mt Adapter ty bng cch ny. ArrayAdapter: l mt lp chung gn cc Adapter Views vo mt mng i tng, theo mc nh th ArrayAdapter lin kt c gi tr toString ca tng i tng ra TextView trong layout, chng ta c th thay th TextView bng cc iu khin khc phc tp hn bng cch s dng k thut Overriding phng thc getView() SimpleCursorAdapter : dng lin kt cc View vi con tr tr v cu truy vn cho Content Provider, n c nh ngha trong file XML layout v lin kt cc gi tr rng buc bn trong mi ct kt qu vi View trong layout.

4.2.2 S dng Adapter hin th d liu:


p dng trong on code sau:
ArrayList<String> myStringArray = new ArrayList<String>(); ArrayAdapter<String> myAdapterInstance; int layoutID = Android.R.layout.simple_list_item_1; myAdapterInstance = new ArrayAdapter<String> (this, layotID,myStringArray); myListView.setAdapter(myAdapterInstance);

mt Adapter n mt class AdapterView ta ch cn gi

phng thc setAdapter ca View a vo trong tp Adapter c minh ha

SimpleCursorAdapter cho php chng ta load d liu t Cursor n List View. SimpleCursorAdapter c to ra bng cch truyn vo cc tham s bi cnh(context) hin hnh, mt layout, mt Cursor v hai gi tr: tn cc ct v mt mng cc gi tr cha d liu ct hin th:
String uriString = content://contacts/people/; Cursor myCursor = managedQuery(Uri.parse(uriString), null, null, null, null); String[] fromColumns = new String[] {People.NUMBER, People.NAME}; int[] toLayoutIDs = new int[] { R.id.nameTextView, R.id.numberTextView}; SimpleCursorAdapter myAdapter; myAdapter = new SimpleCursorAdapter(this,R.layout.simplecursorlayout, myCursor, fromColumns,

SVTH: Phm Quang o Nguyn Hong Nam

43

Tm hiu lp trnh trn Android


toLayoutIDs); myListView.setAdapter(myAdapter);

4.3 V D S DNG INTENT LIN LC GIA CC ACTIVITY:


Chng ta c 2 lp Activity: Activity1 v Activity2. Thit lp 2 layout cho 2 Activities trn ng vi mi lp trn s c layout tun t sau: activity1.xml, activity2.xml.

4-5

Tip theo ng k trong Manifest:


<activity Android:name="com.IntentsDemo.Activity1" Android:label="@string/app_name"> <intent-filter> <action Android:name="Android.intent.action.MAIN" />
<category Android:name="Android.intent.category.LAUNCHER" />

</intent-filter> </activity> <activity Android:name="com.IntentsDemo.Activity2" Android:label="@string/app_name"> <intent-filter> <action Android:name="Calculator"></action>


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

</intent-filter> </activity>

Trong Activity1.java: x l 2 s kin, nhn v gi tr c gi t Activity2, gi v truyn gi tr vo Activity2. Hm x l khi click Button:
//x l button c nhn @Override public void onClick(View v) { // To intent mi v t action = "Calculate" Intent intent = new Intent(); intent.setAction("Calculator"); //t st activity(c ngha l kt thc n ri y) //finish();
} -

Hm nhn gi tr:

SVTH: Phm Quang o Nguyn Hong Nam

44

Tm hiu lp trnh trn Android


//x l kt qu tr v t Activity Result @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { //ng pass khng if(requestCode != INTENT_REQUEST_CODE) { txtNum1.setText(""); txtNum2.setText(""); return; } //nu ng l intent t Activity Result else if(resultCode == RESULT_OK){ //Ly kt qu c tr v String strNum1 = data.getStringExtra("sA"); String strNum2 = data.getStringExtra("sB"); //Thit lp gi tr mi cho 2 Editbox txtNum1.setText(strNum1); txtNum2.setText(strNum2); } else if(resultCode == RESULT_CANCELED){ txtNum1.setText("0"); txtNum2.setText("0"); } }

Trong Activity2: x l 2 s kin, nhn v gi tr c gi t Activity1, gi v truyn gi tr vo Activity1. Hm x l khi click Button:

@Override public void onClick(View v) { Intent returnResult = new Intent("Calculator"); // Ly d liu sau khi tnh ton String strMul = txtMul.getText().toString(); String strSum = txtSum.getText().toString(); // ?a d liu vo Extras ca intent returnResult.putExtra("sA", strSum); returnResult.putExtra("sB", strMul); // Kim tra d liu, nu rng th gi m CANCEL // ,nu khng gi m OK v intent cha kt qu if(strSum.equals("") || strMul.equals("")) setResult(RESULT_CANCELED,returnResult); else setResult(RESULT_OK,returnResult); // Thng bo kt thc Activity finish(); } - Hm nhn gi tr: trong onCreate() // Ly d liu gi t Activity 1 qua intent String strA = getIntent().getStringExtra("A"); String strB = getIntent().getStringExtra("B"); // Tnh ton vi d liu int A = Integer.parseInt(strA);

SVTH: Phm Quang o Nguyn Hong Nam

45

Tm hiu lp trnh trn Android


int B = Integer.parseInt(strB); int sum = A+B; strA = Integer.toString(sum); int mul = A*B; strB = Integer.toString(mul); // lu kt qu ra mn hnh txtSum.setText(strA); txtMul.setText(strB); //x l nt Reset btnReset.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent returnCancel = new Intent("Calculator"); setResult(RESULT_CANCELED,returnCancel); finish(); } });

Chy chng trnh ta c:

4-6 Kt qu Demo Intents

4.4 K THUT LU TR D LIU TRONG ANDROID


Cc k thut duy tr d liu trong Android nhanh chng, gn nh, hiu qu v mnh m: Shared Preferences: Khi mun lu tr UI state ,user preferences hay application setting, chng ta mun c mt c ch gn nh lu tr mt tp hp cc gi tr c bit n, Shared Preferences cho php chng ta lu tr nhm ca key/value ca d liu gc. Files: Android cho php to v ti cc tp tin trn thit b di ng. SQLite Databases: qun l cu trc d liu l cch tt nht . Android cung cp th vin quan h c s d liu SQLite, mi ng dng c th to ra mt c s d liu ca mnh n kim sot hon ton trn . Content Providers: Thay v theo c ch lu tr ring ,Content Providers cung cp ni dung cho php a ra mt giao din s dng v chia s

SVTH: Phm Quang o Nguyn Hong Nam

46

Tm hiu lp trnh trn Android


d liu c nhn. Chng ta c th truy cp Content Providers s dng h thng c php.

4.5 LU TR D LIU NG DNG MT CC


key/value.

N GIN:

C hai c ch lu d liu trong Android l lu theo kiu name/value hoc

4.5.1 To v lu d liu vi Share Preferences:


to hoc sa i d liu dng Shared Preferences chng ta gi hm getSharedPreferences trong ng dng Context,a vo tn Shared Preferences mun thay i, Shared Preferences s chia s gia cc thnh phn d liu trong ng dng hin s dng n nhng khng c sn trong ng dng khc. sa i Shared Preferences Chng ta gi lp Shared Preferences.Editor, nhn i tng Editor bng cch gi edit trong i tng ShardePreferences mun thay i. sa, lu gi commit trn Editor,nh don code sau:
public static final String MYPREFS = mySharedPreferences; protected void savePreferences(){
// to i tng lu tr v truy xut d liu shared preference

int mode = Activity.MODE_PRIVATE; SharedPreferences mySharedPreferences = getSharedPreferences(MYPREFS, mode);


// nhn v mt editor sa i shared preferences.

SharedPreferences.Editor editor = mySharedPreferences.edit();


// lu tr vo . shared preference

editor.putBoolean(isTrue, true); editor.putFloat(lastFloat, 1f); editor.putInt(wholeNumber, 2); editor.putLong(aNumber, 3l); editor.putString(textEntryValue, Not Empty); // Commit the changes. editor.commit();
}

4.5.2 Truy xut Shared Preferences


lu truy cp Shared Preferences th cng dng phng thc getSharedPreferences ,a vo tn ca Shared Preferences m Chng ta mun truy cp, dng phng thc type-safe get<type> trch xut cc gi tr lu.

SVTH: Phm Quang o Nguyn Hong Nam

47

Tm hiu lp trnh trn Android


V D:
public void loadPreferences() { // ly v i tng Shared Preferences int mode = Activity.MODE_PRIVATE; SharedPreferences mySharedPreferences = getSharedPreferences(MYPREFS, mode); // nhn gi tr boolean isTrue = mySharedPreferences.getBoolean(isTrue, false); float lastFloat = mySharedPreferences.getFloat(lastFloat, 0f); int wholeNumber = mySharedPreferences.getInt(wholeNumber, 1); long aNumber = mySharedPreferences.getLong(aNumber, 0); String stringPreference; stringPreference = mySharedPreferences.getString(textEntryValue,); }

4.5.2.1 Lu tr trng thi Activity


Nu mun lu thng tin Activity m khng cn phi chia s vi cc thnh phn khc , Chng ta c th gi Activity.getPreferences(); m khng cn phi ch nh preferences name. Vic truy xut ti SharedPreferences b gii hn trong phm vi mt Activity, mi Actitvity ch h tr mt SharedPreferences khng c t tn. V d dng Activity Shared Preferences:
protected void saveActivityPreferences(){ // to i tng lu tr v truy xut d liu shared preference SharedPreferences activityPreferences = getPreferences(Activity.MODE_PRIVATE); // Retrieve an editor to modify the shared preferences. SharedPreferences.Editor editor = activityPreferences.edit(); //ly ID text view TextView myTextView = (TextView)findViewById(R.id.myTextView); // // nhp gi tr mi vo i tng Shared Preferences .editor.putString(currentTextValue, myTextView.getText().toString()); // p dng thay i editor.commit(); }

4.5.2.2 Lu tr v phc hi trng thi th hin:


Bng cch overriding s kin onSaveInstanceState ca Activity, Chng ta c th dng tham s Bundle lu tr cc gi tr. Lu tr cc gi tr ny ta dng phng

SVTH: Phm Quang o Nguyn Hong Nam

48

Tm hiu lp trnh trn Android


thc get() and put() nh gii thiu trn trc khi a vo x l Bundle trong lp cha. V d th hin on code sau:
private static final String TEXTVIEW_STATE_KEY = TEXTVIEW_STATE_KEY; @Override public void onSaveInstanceState(Bundle outState) { TextView myTextView = (TextView)findViewById(R.id.myTextView); // lu trng thi th hin ca textview outState.putString(TEXTVIEW_STATE_KEY, myTextView.getText().toString()); super.onSaveInstanceState(outState); }

Cc Bundle lu truyn trong cc phng thc onRestoreInstanceState v onCreate nu ng dng bt buc phi khi ng li trong cc session,on code sau y s cho thy lm th no trch xut gi tr t Bundle v s dng chng cp nht trng thi Activity.
@Override public void onCreate(Bundle icicle) { super.onCreate(icicle); setContentView(R.layout.main); TextView myTextView = (TextView)findViewById(R.id.myTextView); String text = ; if (icicle != null && icicle.containsKey(TEXTVIEW_STATE_KEY)) text = icicle.getString(TEXTVIEW_STATE_KEY); myTextView.setText(text);

} 4.6 LU V C CC TP TIN TRONG ANDROID:


Cng nh cc tiu chun java I/O cc lp v phng thc trong Android cng cung cp openFileInput v openFileOutput n gin ha vic c v vit t nhng dng v t local file, nh on code di y:
String FILE_NAME = tempfile.tmp; //m mt file mi FileOutputStream // c file. FileInputStream fis = openFileInput(FILE_NAME); fos = openFileOutput(FILE_NAME,

Context.MODE_PRIVATE);

SVTH: Phm Quang o Nguyn Hong Nam

49

Tm hiu lp trnh trn Android


Nhng phng php ny ch h tr cc tp tin trong cc th mc ng dng hin hnh. Nu tp tin chng ta ch nh khi to mt FileOutputStream khng tn ti, th Android s to n cho chng ta, thm mt tp tin hin c th xc nh c ch Context.MODE_APPEND. Theo mc nh, cc tp tin c to ra bng cch gi phng thc openFileOutput gi ti mt ng dng khc, ngoi ra chng ta c th ch nh mt Context.MODE_WORD_READABLE hoc Context.MODE_WORD _WRITEABLE khi to ra m tp tin c sn trong cc ng dng nh trong on code sau:
String OUTPUT_FILE = publicCopy.txt; FileOutputStream fos = openFileOutput(OUTPUT_FILE, Context.MODE_WORLD_WRITEABLE);

4.6.1 Truy xut cc tp tin trong Resources:


Nu ng dng ca chng ta i hi ngun ti nguyn t tp tin bn ngoi chng ta c th gp chng trong gi res/raw trong project ca chng ta. ch c cc tp tin gc chng ta gi phng thc openRawResource t ngun ng dng, nhn c mt InputStream da trn cc quy nh ngun, a vo mt filename l tn bin t lp R.raw nh sau:
Resources myResources = getResources(); InputStream myFile = myResources.openRawResource(R.raw.<tn file>);

4.6.2 Cc cng c qun l tp tin


Android cung cp mt s cng c qun l tp tin c bn gip qun l h thng tp tin.Trong s nhng tin ch ny nm trong gi java.io.File . deleteFile: xa tp tin c to bi ng dng hin hnh. fileList: tr v mng cc tp tin c to bi ng dng hin hnh.

4.7 C S D LIU TRONG ANDROID


Android cung cp y cc quan h c s d liu thng qua th vin SQLite m khng p t bt k hn ch no. S dng SQLite c th to c s d liu quan h c lp cho mi ng dng.

SVTH: Phm Quang o Nguyn Hong Nam

50

Tm hiu lp trnh trn Android


Tt c cc c s d liu trong Android c lu trong th mc /data/data/<package_name>/databases chia s c s d liu qua cc ng dng ta dng Context Provider( nh phn sau): Nhng phn sau y s tp chung vo tnh thit thc ca vic to v qun l c s d liu SQLite trong Android.

4.7.1 Gii thiu SQLite:


SQLite l h thng qun l cc quan h c s d liu (RDBMS), n cng c coi l: M ngun m Tiu chun Gn nh n lp

4.7.2 Cursors v Content Values:


Content Values l mt i tng s dng chn cc dng mi vo bng c s d liu, mi i tng Content Values i din gi tr cho mt dng. Truy vn trong Android c tr v l i tng Cursor. Thay v gii nn v tr li mt bn sao ca cc gi tr kt qu, Cursors hnh ng nh con tr n mt tp hp cc d liu nm bn di. Cursor qun l vic kim sot v tr (row) trong tp kt qu truy vn c s d liu. Cc lp con tr bao gm mt s chc nng iu hng kt qu truy vn bao gm, nhng khng gii hn, nhng iu sau y: moveToFirst :chuyn con tr ti dng u tin moveToNext : chuyn con tr ti dng tip theo. moveToPrevious: chuyn con tr ti dng duyt trc . getCount :tr v s dng ca kt qu truy vn. getColumnIndexOrThrow: tr v ch s ca ct xc nh getColumnName: tr v tn ca ct c ch s truyn vo getColumnNames: tr v mng tn cc ct moveToPosition: a con tr n dng xc nh. getPosition: tr v v tr con tr

SVTH: Phm Quang o Nguyn Hong Nam

51

Tm hiu lp trnh trn Android


Khi mun bt u vng i hot ng ca Cursor th gi phng thc :startManagingCursor :stopManagingCursor. vo kt thc vng i con tr th gi

4.7.3 S dng SQLiteOpenHelper:


SQLiteOpentHelper l mt lp tru tng v l mi trng tt to, truy xut v cp nht c s d liu.Gi getReadableDatabases hoc getWriteableDatabases m hoc tr v d liu trong trng hp c/ghi trong c s d liu nh sau:
dbHelper = new myDbHelper(context, DATABASE_NAME, null, DATABASE_VERSION); SQLiteDatabase db; try { db = dbHelper.getWritableDatabase(); } catch (SQLiteException ex){ db = dbHelper.getReadableDatabase(); }

4.7.4 Truy xut v to C s d liu khng dng SQLiteHelper:


Chng ta c th truy xut n c s d liu m khng cn s dng lp SQLiteHelper vi phng thc openorCreateDatabases trong ng dng Context nh sau:
private static final String DATABASE_NAME = myDatabase.db; private static final String DATABASE_TABLE = mainTable; private static final String DATABASE_CREATE = create table + DATABASE_TABLE + ( _id integer primary key autoincrement, + column_one text not null);; SQLiteDatabase myDatabase; private void createDatabase() { myDatabase = openOrCreateDatabase(DATABASE_NAME, Context.MODE_PRIVATE, null); myDatabase.execSQL(DATABASE_CREATE); }

4.7.5 Truy vn c s d liu


V D: // tr v tt c cc ct 1,3 v ID

SVTH: Phm Quang o Nguyn Hong Nam

52

Tm hiu lp trnh trn Android


String[] result_columns = new String[] {KEY_ID, KEY_COL1, KEY_COL3}; Cursor allRows = myDatabase.query(true, DATABASE_TABLE, result_columns, null, null, null, null, null, null); //tr v tt cc ct vi ct 3 c gi tr nh sn // sp xp theo ct 5 String where = KEY_COL3 + = + requiredValue; String order = KEY_COL5; Cursor myResult = myDatabase.query(DATABASE_TABLE, null, where, null, null, null, order);

4.7.6 Ly kt qu t Cursors
V d: int GOLD_HOARDED_COLUMN = 2; Cursor myGold = myDatabase.query(GoldHoards, null, null, null, null, null, null); float totalHoard = 0f; if (myGold.moveToFirst()) { do { float hoard = myGold.getFloat(GOLD_HOARDED_COLUMN); totalHoard += hoard; } while(myGold.moveToNext()); } float averageHoard = totalHoard / myGold.getCount();

4.7.7 Thm, cp nht v xa dng:


Thm: ContentValues newValues = new ContentValues(); //a gi liu vo content newValues.put(COLUMN_NAME, newValue); [ ... cc ct khc tng t ... ] // thm vo CSDL myDatabase.insert(DATABASE_TABLE, null, newValues); Cp nht: ContentValues updatedValues = new ContentValues(); // a gi liu vo content updatedValues.put(COLUMN_NAME, newValue);

SVTH: Phm Quang o Nguyn Hong Nam

53

Tm hiu lp trnh trn Android


[ ... cc ct khc tng t... ] String where = KEY_ID + = + rowId; // cp nht. myDatabase.update(DATABASE_TABLE, updatedValues, where, null); Xa dng: myDatabase.delete(DATABASE_TABLE, KEY_ID + = + rowId, null);

4.7.8 Thao tc trn c s d liu Android


import Android.content.Context; import Android.database.*; import Android.database.sqlite.*; import Android.database.sqlite.SQLiteDatabase.CursorFactory; import Android.util.Log; public class MyDBAdapter { private static final String DATABASE_NAME = myDatabase.db; private static final String DATABASE_TABLE = mainTable; private static final int DATABASE_VERSION = 1; // kha chnh. public static final String KEY_ID=_id; // tn v ch s ct. public static final String KEY_NAME=name; public static final int NAME_COLUMN = 1; // TODO: Create public field for each column in your table. // cu SQL to bng private static final String DATABASE_CREATE = create table + DATABASE_TABLE + ( + KEY_ID + integer primary key autoincrement, + KEY_NAME + text not null);; // bin Database private SQLiteDatabase db; // p dng cho ng dng no private final Context context; //database helper private myDbHelper dbHelper; public MyDBAdapter(Context _context) { context = _context; dbHelper = new myDbHelper(context, DATABASE_NAME, null, DATABASE_VERSION); }

SVTH: Phm Quang o Nguyn Hong Nam

54

Tm hiu lp trnh trn Android


public MyDBAdapter open() throws SQLException { db = dbHelper.getWritableDatabase(); return this; } public void close() { db.close(); } public long insertEntry(MyObject _myObject) { ContentValues contentValues = new ContentValues(); return db.insert(DATABASE_TABLE, null, contentValues); } public boolean removeEntry(long _rowIndex) { return db.delete(DATABASE_TABLE, KEY_ID + = + _rowIndex, null) > 0; } public Cursor getAllEntries () { return db.query(DATABASE_TABLE, new String[] {KEY_ID, KEY_NAME}, null, null, null, null, null); } public MyObject getEntry(long _rowIndex) { MyObject objectInstance = new MyObject(); return objectInstance; } public int updateEntry(long _rowIndex, MyObject _myObject) { String where = KEY_ID + = + _rowIndex; ContentValues contentValues = new ContentValues(); return db.update(DATABASE_TABLE, contentValues, where, null); } private static class myDbHelper extends SQLiteOpenHelper { public myDbHelper(Context context, String name, CursorFactory factory, int version) { super(context, name, factory, version); } // Called when no database exists in @Override public void onCreate(SQLiteDatabase _db) { _db.execSQL(DATABASE_CREATE); } //gi khi database c phin bn mi @Override public void onUpgrade(SQLiteDatabase _db, int _oldVersion,

SVTH: Phm Quang o Nguyn Hong Nam

55

Tm hiu lp trnh trn Android


int _newVersion) { // Log the version upgrade. Log.w(TaskDBAdapter, Upgrading from version + _oldVersion + to + _newVersion + , which will destroy all old data); _db.execSQL(DROP TABLE IF EXISTS + DATABASE_TABLE); //to csdl mi onCreate(_db); } } }

4.7.9 Gii thiu Content Providers


S dng Content Provider bng lp ContenResolver. ContentResolver cr = getContentResolver();

4.7.9.1 Truy vn trong Content:


Nh trong c s d liu, kt qu tm kim s c tr v Cursors trong mt tp kt qu. Chng ta c th trch xut cc gi tr t Cursor bng cch s dng cc k thut c m t trc trong phn c s d liu trn Ly kt qu t Cursors: Content Provider c cch truy vn hnh thc rt ging vi cc truy vn c s d liu. S dng phng php query trn i tng ContentResolver.
// ly tt c dng Cursor allRows = getContentResolver().query(MyProvider.CONTENT_URI, null, null, null, null); //tr v tt cc ct vi ct 3 c gi tr nh sn // sp xp theo ct 5 String where = KEY_COL3 + = + requiredValue; String order = KEY_COL5; Cursor someRows = getContentResolver().query(MyProvider.CONTENT_URI,null, where, null, order);

4.7.9.2 Thm, cp nht v xa dng:


c th hin qua cc on code sau:

SVTH: Phm Quang o Nguyn Hong Nam

56

Tm hiu lp trnh trn Android


Thm : // to contentvalues ContentValues newValues = new ContentValues(); // cho vo csdl newValues.put(COLUMN_NAME, newValue); [ ... lp li tng t nh nhng ct khc ... ] Uri myRowUri = getContentResolver().insert(MyProvider.CONTENT_URI, newValues); // to dng cho vic thm ContentValues[] valueArray = new ContentValues[5]; int count = getContentResolver().bulkInsert(MyProvider.CONTENT_URI, valueArray); Xa: // xa dng xc nh getContentResolver().delete(myRowUri, null, null); // xa 5 dng String where = _id < 5; getContentResolver().delete(MyProvider.CONTENT_URI, where, null); Cp nht: ContentValues newValues = new ContentValues(); newValues.put(COLUMN_NAME, newValue); // cp nht cho 5 dng String where = _id < 5; getContentResolver().update(MyProvider.CONTENT_URI, newValues, where, null);

4.7.9.3 S dng Media Store Provider


Cc Android Media Store qun l tp tin hnh nh, kho video, m thanh. Bt c khi no chng ta thm mt tp tin a phng tin mi cho h thng tp tin Android l c th b sung vo Media Store dng cho cc ng dng khc.

SVTH: Phm Quang o Nguyn Hong Nam

57

Tm hiu lp trnh trn Android


Lp MediaStore bao gm mt s phng php tin li n gin ha cc tp tin chn vo Media Store. V d, on m sau y cho thy lm th no chn mt hnh nh trc tip vo Media Store: Android.provider.MediaStore.Images.Media.insertImage( getContentResolver(), sourceBitmap, my_cat_pic, Photo of my cat!);

4.7.9.4 S dng Contacts Provider


Truy cp vo Content Provider c bit mnh m trn mt thit b truyn thng. Android phi by tt c cc thng tin c sn t cc databases a ch lin h n bt k ng dng qua READ_CONTACTS. Trong v d sau, Activitys mt con tr n tt c mi ngi trong c s d liu lin lc, to ra mt mng cc chui cha tn ca mi lin lc v s in thoi.
// ly d liu vo cursor Cursor cursor = getContentResolver().query(People.CONTENT_URI, null, null, null, null); // qun l cursor startManagingCursor(cursor); // ly ch s ct int nameIdx = cursor.getColumnIndexOrThrow(People.NAME); int phoneIdx = cursor. getColumnIndexOrThrow(People.NUMBER); String[] result = new String[cursor.getCount()]; if (cursor.moveToFirst()) do { //ly tn String name = cursor.getString(nameIdx); // s in thoi. String phone = cursor.getString(phoneIdx); result[cursor.getPosition()] = name + ( + phone + ); } while(cursor.moveToNext());

4.7.9.5 ng k d dng Provider


S dng th authorities xc nh trong file XML nh sau:
<provider Android:name=MyProvider Android:authorities=<lp Provider c khai bo trong ng dng>/>

SVTH: Phm Quang o Nguyn Hong Nam

58

Tm hiu lp trnh trn Android


4.8 MT NG DNG DEMO S DNG CONTENTPROVIDER QUN L SCH:
Chng trnh c th cp nht sch, xa v thm sch mi. Hin th ln ListView ngi dng nhn thy. Ta c thm mt lp BookProvider.java k tha ContentProvider thao tc vi d liu. C th Code c th tham kho CD km theo. ng dng c tn l Android_ContentProviderUserDemo.

4.9 MAPS, GEOCODING, LOCATION BASED SERVICES 4.9.1 S dng dch v nh v


Location Based Services (LBS) l mt thut ng chung dng m t s khc nhau v k thut, v dng tm v tr thit b hin hnh. Hai yu t chnh ca LBS l: LocationMangager: qun l kt ni vi dch v nh v trong Android.. LocationProvider: l mt lp tru tng c bn ca cc cng ngh tm kim v tr khc nhau xc nh v tr thit b. S dng Location Manager ta c th : Xc nh v tr. Theo di s chuyn ng. t trng thi bo ng cho vic pht hin mt s chuyn ng vo v ra khi mt khu vc xc nh.

4.9.2 Ci t trn mi trng gi lp vi Test Providers


Dch v nh v (LBS) ph thuc vo cc thit b phn cng cho vic tm kim cc v tr hin ti. Khi pht trin v kim th vi cc mi trng gi lp, th phn cng l o v chng ta c th trong nhng v tr kh ging nhau. B li Android bao gm cc mc ni cho php chng ta mc ni vi location Provider th nghim vi ng dng location based.

4.9.3 Cp nht v tr vi Emulator Location Providers


Dng Location Controls c sn t DDMS trong Eclipse nh hnh di y thay i trc tip v tr trong th nghim GPS_PROVIDER.

SVTH: Phm Quang o Nguyn Hong Nam

59

Tm hiu lp trnh trn Android

Hinh 4-7

Trong hnh trn c cc tab Manual, KML v GPX S dung tab Manual chng ta c th xc nh v / kinh . S dng tab KML v GPX cho php chng ta ti cc tp tin KML (Keyhole Markup Language) v GPX (GPS Exchange Format) tng ng. Lu v tr GPS s tr v t getLastKnownLocation s khng thay i tr khi c t nht mt ng dng yu cu cp nht v tr.

4.9.4 Chn mt Location Provider


Ty thuc vo thit b m c nhng k thut ring, Android c th dng xc nh v tr hin ti, mi k thut, mi Location Provider s cung cp nhng kh nng khc nhau nh xc nh cao, tc , s chnh xc hoc cc thng tin lin quan. c c i tng LocationProvider ta gi getProvider v truyn vo tn Provider. V d di y th Provider l GPS_PROVIDER String providerName = LocationManager.GPS_PROVIDER; LocationProvider gpsProvider; gpsProvider = locationManager.getProvider(providerName);

4.9.5 Tm mt Providers c sn
Lp LocationManager bao gm cc chui hng s v tr v tn ca nh cung cp cho hai Location Provider ph bin nht. LocationManager.GPS_PROVIDER LocationManager.NETWORK_PROVIDER

SVTH: Phm Quang o Nguyn Hong Nam

60

Tm hiu lp trnh trn Android


c danh sch tt c tn ca nh cung cp trn thit b ta gi getProvider, s dng Boolean bit nu chng ta mun tt c, hoc ch ly mt Provider u tin. boolean enabledOnly = true; List<String> providers = locationManager.getProviders(enabledOnly);

4.9.6 Tm kim mt Provider theo tiu ch


S dng lp Criteria yu cu nh cung cp x l chnh xc nhng s liu c sn nh: v v kinh , tc , cao, chi ph v yu v cu nng lng in. Criteria criteria = new Criteria(); criteria.setAccuracy(Criteria.ACCURACY_COARSE); criteria.setPowerRequirement(Criteria.POWER_LOW); criteria.setAltitudeRequired(false); criteria.setBearingRequired(false); criteria.setSpeedRequired(false); criteria.setCostAllowed(true); Chng ta c th dng getBestProvider l s kt hp tt nht tr v cho Location Provider hoc dng getProvider, s dng getBestProvider nh cung cp s tr li cc tiu ch tt nht, s dng Boolean cho php hn ch nhng kt qu t nh cung cp ang c hot ng. String bestProvider = locationManager.getBestProvider(criteria, true); List<String> matchingProviders = locationManager.getProviders(criteria,false);

4.9.7 Tm mt a ch (Finding Your Location)


Mc ch ca dch v nh v l tm ra v tr vt l ca thit b. truy cp vo Location Manager thc hin cc yu cu LOCATION_SERVICES ta s dng phng thc getSystemService nh sau: String serviceString = Context.LOCATION_SERVICE; LocationManager locationManager; locationManager = (LocationManager)getSystemService(serviceString);

SVTH: Phm Quang o Nguyn Hong Nam

61

Tm hiu lp trnh trn Android


Trc khi s dng Location Manager th cn thm mt hoc nhiu th uses-permission trong file mainfest truy cp vo cc phn cng ca LBS trong bao gm c fine v coarse nh sau: <uses-permission Android:name=Android.permission.ACCESS_FINE_LOCATION/> <uses-permission Android:name=Android.permission.ACCESS_COARSE_LOCATION/> Chng ta c th tm thy v tr bng cch xc nh mt Location Provider s dng phng thc getKnowLocation v a vo tn ca Location Provider. V d: String provider = LocationManager.GPS_PROVIDER; Location location = locationManager.getLastKnownLocation(provider);

4.9.8 Theo di s di chuyn (Tracking Movement)


S dng phng thc requestLocationUpdate cp nht bt k mt v tr, khi v tr hin ti thay i chng ta s dng mt LocationListener. thc hin v ng k nhn thng tin.

LocationListener

LocationListener rt linh hot v nhiu tnh nng cho php chn nhiu loi s kin v v tr da trn c tnh khc nhau. Phng thc requestLocationUpdate chp nhn mt Location Provider hoc Criteria xc nh nh cung cp c s dng. on code sau s th hin mt yu cu cp nht thng xuyn da trn mc ti thiu v thi gian v khong cch.
String provider = LocationManager.GPS_PROVIDER; int t = 5000; // milliseconds int distance = 5; // meters LocationListener myLocationListener = new LocationListener() { public void onLocationChanged(Location location) { // Update application based on new location. } public void onProviderDisabled(String provider){ // Update application if provider disabled. } public void onProviderEnabled(String provider){ // Update application if provider enabled. }

SVTH: Phm Quang o Nguyn Hong Nam

62

Tm hiu lp trnh trn Android


public void onStatusChanged(String provider, int status,Bundle extras){ // Update application if provider hardware status changed. } }; locationManager.requestLocationUpdates(provider, t, distance, myLocationListener);

4.9.9 S dng Goecoder


Geocoding cho php chuyn gia cc a ch v cc m t khc vo kinh / v ca bn ta . iu ny cung cp cho chng ta mt khung cnh gip d nhn bit cc v tr v ta c s dng trong cc dch v da trn v tr v hot ng da trn bn . thc hin vic ny lp Geocoder thc hin mt cuc gi mng (t ng) cho mt dch v web. Lp Geocoder cung cp hai chc nng truy cp m a l: Forward Geocoding: tm v v kinh ca ia ch. Reverse Geocoding: chuyn a ch ra v , kinh . Cch to mt Geocoder: Geocoder geocoder = new Geocoder(getApplicationContext(), mt danh sch cc i

Locale.getDefault()); C hai chc nng m ho a l tr v tng Address. Mi danh sch c th cha nhiu kt qu.

4.9.10 Reverse Geocoding


Tr v a ch khi c cung cp kinh , v . thc hin vic tra cu chuyn i chng ta a vo mt v v kinh n Geocoder v phng thc getFromLocation s. Reverse Geocoding s tr v mt danh sch a ch ph hp, nu Geocoder khng gii quyt c a ch ny vi cc quy nh th n s tr v null.
Location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER ); double latitude = location.getLatitude(); double longitude = location.getLongitude(); Geocoder gc = new Geocoder(this, Locale.getDefault()); List<Address> addresses = null;

SVTH: Phm Quang o Nguyn Hong Nam

63

Tm hiu lp trnh trn Android


try { addresses = gc.getFromLocation(latitude, longitude, 10); } catch (IOException e) {}

4.9.11 Forward Geocoding


tra cu Forward Geocoding, gi getFromLocationName trn trng Geocoder. a v tr to m chng ta mun v s lng ti a ca cc kt qu tr li, chng ta s nhn c cc a ch thch hp, nh th hin trong on code di y:
List <Address>result = geocoder.getFromLocationName(aStreetAddress, maxResults);

Locale cung cp bi cnh a l gii thch cc yu cu tm kim ca chng ta nh tn ca mt v tr c th tn ti trong nhiu khu vc. Nu c th th ta xem xt la chn mt Locale khu vc trnh s nhp nhng tn, nh th hin trong on code sau:
Geocoder fwdGeocoder = new Geocoder(this, Locale.US); String streetAddress = 160 Riverside Drive, New York, New York; List<Address> locations = null; try { locations = fwdGeocoder.getFromLocationName(streetAddress, 10); } catch (IOException e){} // c nhiu a ch, s dng getFromLocationName List<Address> locations = null; try { locations = fwdGeocoder.getFromLocationName(streetAddress, 10,n, e, s, w); } catch (IOException e) {}

Hnh sau cho thy vic dng Geocoder chuyn mt a ch kiu String vo mt i tng cung cp v v kinh .

SVTH: Phm Quang o Nguyn Hong Nam

64

Tm hiu lp trnh trn Android

Hinh 4-8

4.9.12 Dng MapView


MapView l mt control thu nh ca nhiu Google Maps API trong hnh thc View cho cc ng dng Android. MapView hin th giao din ca bn , n c c s dng qua mng nh bn l s di chuyn v thu nh, ging nh phin bn web ca Google Maps. Nhiu khi nim tiu chun Google Map API cng c mt trong Android thng qua cc MapView, v d MapView h tr ch v tinh, ch xem ng ph, v ch giao thng ta khai bo nh sau: mapView.setSatellite(true); mapView.setStreetView(true); mapView.setTraffic(true); Chng ta cng c th truy cp vo cc Map View tm ra kinh hin hnh v phng i, cng nh cc im trung tm v hin ang nhn thy v khong v ( dng thp phn). GeoPoint center = mapView.getMapCenter(); int latSpan = mapView.getLatitudeSpan(); int longSpan = mapView.getLongitudeSpan(); Chng ta cng c th hin th bn iu khin zoom mt cch ty . View zoomControls = mapView.getZoomControls(); mapView.addView(zoomControls, lp); mapView.displayZoomControls(true);

SVTH: Phm Quang o Nguyn Hong Nam

65

Tm hiu lp trnh trn Android


MapView l mt ViewGroup hy khai bo n trong XML. <com.google.Android.maps.MapView Android:id="@+id/map_view" Android:layout_width="fill_parent" Android:layout_height="fill_parent" Android:enabled="true" Android:clickable="true" Android:apiKey="05lSygx-ttd-J5GXfsIB-dlpNtggca4I4DMyVqQ" /> Ch : Android:apiKey y chng ta phi ng k qua Google, n hon ton min ph.

4.9.13 Dng MapActivity


MapActivity l mt lp c bn.Lp MapActivity x l vng i ng dng v qun l nn tng cn thit cho vic hin th bn , chng ta ch c th s dng mt MapView trong MapActivity. s dng bn trong ng dng chng ta cn phi to mt Activity mi k tha t MapActivity v cn thm vo trong file XML, trong th <Aplication>: <uses-library Android:name=com.google.Android.maps/> MapView iu khin ch c th c s dng trong mt Activity m

rng MapActivity. Overriding phng thc onCreate t ra cc mn hnh bao gm mt MapView, v ghi ln isRouteDisplayed tr v true nu Activity s c hin th thng tin nh tuyn. on code sau s trnh by cch khi to mi lp bn c s MyMapActivity :
import com.google.Android.maps.MapActivity; import com.google.Android.maps.MapController; import com.google.Android.maps.MapView; import Android.os.Bundle; public class MyMapActivity extends MapActivity { private MapView mapView; private MapController mapController; @Override public void onCreate(Bundle icicle) { super.onCreate(icicle);

SVTH: Phm Quang o Nguyn Hong Nam

66

Tm hiu lp trnh trn Android


setContentView(R.layout.map_layout); mapView = (MapView)findViewById(R.id.map_view); } @Override protected boolean isRouteDisplayed() { // IMPORTANT: This method must return true if your Activity // is displaying driving directions. Otherwise return false. return false; } }

Hinh 4-9

4.9.14 S dng Overlay


Overlay l mt cch thm cc ch thch v x l nhn vo MapView. thm mt lp mi Overlay chng ta to mt lp mi k tha t lp Overlay, ghi cc phng thc v v cc ch thch m chng ta mun thm v ghi ln onTap phn li cho ngi dng khi click chut nh on code sau:
import Android.graphics.Canvas; import com.google.Android.maps.MapView; import com.google.Android.maps.Overlay; public class MyOverlay extends Overlay { @Override public void draw(Canvas canvas, MapView mapView, boolean shadow) { if (shadow == false) {

SVTH: Phm Quang o Nguyn Hong Nam

67

Tm hiu lp trnh trn Android


[ ... v trn lp trn cng ca layout ... ] } else { [ ... v tn lp di, bng m ... ] } } @Override public boolean onTap(GeoPoint point, MapView mapView) { //tr v true nu tch vo mt im mn hnh do Overlay qun l return false; } }

4.9.15 Dng MapController


Dng MapContrller quay v phng to mt MapView, dng getController nh on code sau: MapController mapController = myMapView.getController(); Bn cc a im trong cc lp bn Android c i din bi i tng GeoPoint, trong v v kinh o bng microdegrees. Trc khi chng ta c th s dng cc gi tr v v kinh lu tr trong cc i tng Location c s dng bi cc location-based services, chng ta cn phi chuyn i chng sang microdegrees v lu tr chng nh GeoPoints, nh trong on m sau y: Double lat = 37.422006*1E6; Double lng = -122.084095*1E6; GeoPoint point = new GeoPoint(lat.intValue(), lng.intValue()); Khi mun bit im v phng to hnh trong MapView ta s dng phng thc setCenter v setZoom c sn trong MapCotroller ca MapView nh on code di y: mapController.setCenter(point); mapController.setZoom(1); Phng thc setCenter s nhy ti mt v tr mi ta s dng nh sau: mapController.animateTo(point)

SVTH: Phm Quang o Nguyn Hong Nam

68

Tm hiu lp trnh trn Android


4.9.16 Ch khi to mt ng dng c s dng MapView
Khng ging nh cch to v chy ng dng nh cc chng trc, c mt s khc bit nho nh khi chy ng dng MapView l vic chn Emulator hay chn cc Emulator c h tr Google APIs.

Hinh 4-10 To emulator h tr Geocoder v MapView

Mt ch na l phi c <Android:apiKey> khi dng MapView, sau y l cch ly key (chng ta phi kt ni Internet) : Ly debug.keystore Vo Windows > Prefs > Android > Build ly ng dn nh bn di

SVTH: Phm Quang o Nguyn Hong Nam

69

Tm hiu lp trnh trn Android


Ly key: Vo cmd g:
keytool -list -alias Androiddebugkey -keystore <ng dn file keystore> -storepass Android -keypass Android

Vo

link

http://code.google.com/Android/maps-api-signup.html

dn

MD5 fingerprint code vo v click Generate API key , site s t sinh cho chng ta 1 key.

4.10 LM VIC

TRN BACKGROUND

4.10.1 Gii Thiu Services


Khng ging nh cc hot ng khc, Services trnh by mt giao din ha phong ph cho ngi dng. Services chy trn nn cp nht Content Providers, ng Intent v kch hot thng bo, Services l nhng cch thc hin x l hon ho hoc x l s kin thng xuyn ngay c khi ng dng ca chng ta khng nhn thy hot ng ca services, khng hot ng hoc b tt. Tuy khng c giao din trc quan nhng Serviecs vn c th c bt u, dng li v kim sot t cc thnh phn ng dng khc bao gm Services, Activities v Broadcast Receivers. Nu ng dng ca chng ta thng xuyn hoc lin tc thc hin cc hot ng m khng ph thuc trc tip vo d liu ngi dng a vo (input), Sevices c th l cu tr li. My nghe nhc MP3, gim st ta l nhng v d ca ng dng c th chy v cp nht m khng c mt thnh phn tng tc trc quan c th nhn thy. Cc Services c thit k chy nn, v vy cn phi c bt u, dng li, v kim sot bi cc thnh phn ng dng khc. Trong cc phn sau y, chng ta s hc cch to ra mt Service mi v lm th no bt u v kt thc n bng cch s dng phng thc

SVTH: Phm Quang o Nguyn Hong Nam

70

Tm hiu lp trnh trn Android


startServices. Sau s hc cch rng buc mt Services cho mt Activity, cung cp mt giao din phong ph hn cho tng tc.

4.10.2 To Service
xc nh mt Services ta to ra mt lp mi k tha t lp Service c s. Chng ta cn ghi ln onBind v onCreate nh trnh by sau y:
import Android.app.Service; import Android.content.Intent; import Android.os.IBinder;
public class MyService extends Service { @Override public void onCreate() { // TODO: Actions to perform when service is created. } @Override public IBinder onBind(Intent intent) { // TODO: Replace with service binding implementation. return null; } }

Trong hu ht cc trng hp chng ta nn ghi ln onStart. iu ny s c gi bt k khi no Services c bt u khi gi n startService, di y l th hin phng thc ghi ln onStart nh sau:
@Override public void onStart(Intent intent, int startId) { // TODO: Actions to perform when service is started. }

Mt khi chng ta xy dng mt Service mi chng ta phi ng k trong tp tin mainifest trong tab <service> nh sau: <service Android:enabled=true Android:name=.MyService></service>

4.10.3 Khi chy, iu khin v tng tc vi Sercice


khi chy mt Service chng ta gi startService. Nu Service yu cu quyn truy cp m ng dng ca chng ta khng c th li gi ny s b chuyn vo SecurityException nh sau: // khi to khng tng minh startService(new Intent(MyService.MY_ACTION));

SVTH: Phm Quang o Nguyn Hong Nam

71

Tm hiu lp trnh trn Android


// khi to tngm inh startService(new Intent(this, MyService.class)); dng mt Service ta gi stopService, a vo mt Intent xc nh cc Service ngn chn. ComponentName service = startService(new Intent(this, BaseballWatch.class)); // s dng tn service dng Service. stopService(new Intent(this, service.getClass())); // dng service tng minh try { Class serviceClass = Class.forName(service.getClassName()); stopService(new Intent(this, serviceClass)); } catch (ClassNotFoundException e) {} Nu startService c gi th Service ang c chy, phng thc onStart ca Service c thc hin mt ln na. Cc cuc gi n startService s khng lng ln nhau do c mt cuc gi duy nht, chm dt th s dng stopService khng k l bao nhiu ln startService c gi.

4.10.4 Kt ni Activities vi Services


Khi mt hot ng lin kt vi mt Service th bn thn n duy tr mt tham chiu n Service , n cho php gi mt phng thc trn Service ang chy. Lin kt ny c sn cho cc hot ng, s c tha hng tt c t giao din vi mt Service. h tr cc rng buc cho mt Service th thc hin phng thc onBind nh trong v d n gin sau y: private final IBinder binder = new MyBinder(); @Override public IBinder onBind(Intent intent) { return binder; } public class MyBinder extends Binder { MyService getService() { return MyService.this; }

SVTH: Phm Quang o Nguyn Hong Nam

72

Tm hiu lp trnh trn Android


} S kt ni gia cc Service v cc hot ng c th hin nh mt Serviceconnection. Ta cn phi thc hin mt ServiceConnection mi, ghi ln phng thc onServiceConnection v onServiceDisconnected c th tham chiu n mt Service kt ni c thnh lp. // lin kt vi service private MyService serviceBinder; // iu khin kt ni gia Acitivity v Service private ServiceConnection mConnection = new ServiceCo nnection() { public void onServiceConnected(ComponentName className, IBinder service) { // c gi khi kt ni c to. serviceBinder = ((MyService.MyBinder)service).getService(); } public void onServiceDisconnected(ComponentName className) { // khi ngt kt ni. serviceBinder = null; } }; gi Services cn truyn vo mt Intent trong phng thc bindService: @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); // Bind to the service Intent bindIntent = new Intent(MyActivity.this, MyService.class); bindService(bindIntent, mConnection, Context.BIND_AUTO_CREATE); } Lin lc vi mt Service trong mt ng dng khc bng cch s dng Broadcast Intent hay bin Bundle trong Intent c s dng khi khi ng Service.

SVTH: Phm Quang o Nguyn Hong Nam

73

Tm hiu lp trnh trn Android


4.10.5 Gii thiu Thng bo trong Android
Thng bo l mt cch cho cc ng dng ca chng ta cnh bo i vi ngi s dng, m khng cn s dng mt hnh ng. Thng bo c x l bi cc Manager Notification, n bao gm cc kh nng: To mt biu tng mi trn thanh trng thi. Hin th thm thng tin trong ca s m rng ca thanh trng thi. n Flash/LEDs. in thoi rung. n thanh bo ng(nhc chung,m thanh thng tin lu tr). Thng bo c th tn ti qua s lp li lin tip hoc bng cc s dng mt biu tng trn thanh trng thi.Tnh trng cc biu tng c th c cp nht thng xuyn hoc m rng hin th thm thng tin s dng tnh trng ca s nh trong hnh di.

Hinh 4-11

4.10.6 Gii thiu Notification Manager


Notification Manager l mt h thng dch v c s dng x l cc thng bo, tham chiu n n bng cch s dng phng thc: getSystemService nh th hin trong on code sau: String svcName = Context.NOTIFICATION_SERVICE; NotificationManager notificationManager; notificationManager (NotificationManager)getSystemService(svcName);

SVTH: Phm Quang o Nguyn Hong Nam

74

Tm hiu lp trnh trn Android


S dng Manager thng bo, chng ta c th kch hot thng bo mi, sa i nhng ci hin c, hoc loi b nhng ci khng cn cn thit hoc khng mong mun.

4.10.7 To thng bo
To v cu hnh mt thng bo mi c thc hin trong ba phn: Trc tin, to mt i tng thng bo mi a vo biu tng hin th trn thanh trng thi cng vi cc thanh trng thi tickertext v thi gian thng bo nh trong on code sau: // chn hnh nh lm icon trn thanh tc v int icon = R.drawable.icon; // chui xut hin khi chy thng bo String tickerText = Notification; // The extended status bar orders notification in time order long when = System.currentTimeMillis(); Notification notification = new Notification(icon, tickerText, when); Cc ticker-text s di chuyn dc theo cc thanh trng thi khi cc thng bo c pht ra. Th hai, cu hnh s xut hin ca cc thng bo trong ca s trng thim rng s dng phng php setLatestEventInfo. iu ny m rng ca s trng thi hin th biu tng v thi gian quy nh trong xy dng v cng cho thy tiu v mt chui cc chi tit. Thng bo thng xut hin cho mt yu cu mt hnh ng hoc s ch , v vy chng ta c th ch nh mt PendingIntent s thot nu ngi dng nhp vo mc thng bo. Context context = getApplicationContext(); // chui hin khi m rngca s thng bo String expandedText = Extended status text; // tiu ca String expandedTitle = Notification Title; // Intent khi chy activity khi ca s thng bo m rng c click Intent intent = new Intent(this, MyActivity.class); PendingInten tlaunchIntent= PendingIntent.getActivity(context, 0,intent, 0);

SVTH: Phm Quang o Nguyn Hong Nam

75

Tm hiu lp trnh trn Android


notification.setLatestEventInfo(context,expandedTitle,expandedTe xt, launchIntent); Chng ta cng c th s dng thuc tnh number hin th s s kin cho mt biu tng trn thanh trng thi c th hin. Thit lp gi tr ny ln hn 1, tt c s thay i ca mt thng bo chng ta khng cn phi kch hot n p dng s thay i, loi b cc lp ph(cc thng bo ph ln nhau), ta thit lp gi tr l 0 hoc -1 notification.number++; Cui cng, chng ta c th ci thin mt Thng bo bng cch s dng cc thuc tnh khc nhau trn cc i tng thng bo chng hn thit b n LED, rung in thoi, v m thanh (nhac, chung).

4.10.8 Kch hot thng bo


bt mt thng bo v a vo trong phng thc notify trong i tng NotificationManager mt s nguyn ID, nh trong on code sau: int notificationRef = 1; notificationManager.notify(notificationRef, notification); Chng ta c th s dng cc ID hy b Thng bo bng cch gi phng thc Cancel trn NotificationManager, nh th hin sau: notificationManager.cancel(notificationRef);

4.11 S DNG CC MEDIA APIS


Cc cng ngh hin i ngy nay c th cnh tranh vi in thoi di ng c mt khp mi ni l my nghe nhc v cc phng tin xch tay k thut s. Kt qu thm d th trng cho thy thit b in thoi di ng l mt s quan tm ng k i vi nhiu ngi tiu dng. Android a ra nhiu th vin cho ng dng v cung cp cc chc nng a phng tin gm c ghi m v video, m thanh v hnh nh c lu tr ti cc b trong mt ng dng. Android h tr cc nh dang a phng tin sau y:

SVTH: Phm Quang o Nguyn Hong Nam

76

Tm hiu lp trnh trn Android


JPEG, PNG, OGG, Mpeg 4, 3GPP, MP3, Bitmap

4.11.1 Chi nhc


a phng tin trong Android c x l bi lp MediaPlayer. Chng ta c th xem li cc thng tin c lu tr trong ng dng, ia ch ca tp tin, hoc t mng URI. chi nhc, ta to mi mt Media Player, v gn cho n ng dn n tp tin nhc chi bng cc s dng phng thc sedDataSource . Trc khi chng ta c th bt u chi nhc, chng ta cn phi chun b nh trong on m sau: String MEDIA_FILE_PATH = Settings.System.DEFAULT_RINGTONE_URI.toString(); MediaPlayer mpFile = new MediaPlayer(); try { mpFile.setDataSource(MEDIA_FILE_PATH); mpFile.prepare(); mpFile.start(); } catch (IllegalArgumentException e) {} catch (IllegalStateException e) {} catch (IOException e) {} Ngoi ra, to mt phng thc tnh (static) lm vic nh shortcuts, chp nhn cc ng dn n file nhc nh mt tham s nh trong on m sau: MediaPlayer mpRes = MediaPlayer.create(context, R.raw.my_sound); Mt Media Player c gi bt u chi nh th hin sau y: mpRes.start(); mpFile.start(); Media Player bao gm cc chc nng dng li, tm dng v phng thc tm kim cng nh phng thc tm v tr, thi gian v kch thc hnh nh ca cc thng tin lin quan. lp vng hoc pht lp li ta s dng phng thc setLooping. Mt khi chng ta khng s dng Media Player, ta gi release gii phng ti nguyn lin quan nh trnh by sau:

SVTH: Phm Quang o Nguyn Hong Nam

77

Tm hiu lp trnh trn Android


mpRes.release(); mpFile.release();

4.11.2 Ghi m
Ghi m c x l bi lp MediaRecorder ghi m thanh hoc video, to mt i tng MediaRecorder nh trong on code sau: MediaRecorder mediaRecorder = new MediaRecorder() Trc khi chng ta c th ghi m bt k media trong Android, ng dng ca chng ta cn c cp php RECORD_AUDIO hoc RECORD_VIDEO. Thm mt th uses-permission trong ng dng manifest nh sau: <uses-permission Android:name=Android.permission.RECORD_AUDIO/> <uses-permission Android:name=Android.permission.RECORD_VIDEO/> My ghi m(Media Recorder) c th s dng cu hnh cc video v quay phim (bao gm c camera v microphone), nh dng u ra, kch thc video, t l khung hnh, video v thu m video s dng. Cc on code sau y cho thy lm th no cu hnh mt my ghi m ghi li m thanh t micro bng cch s dng nh dng mc nh v m ha. // ly ngun video mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); // thit lp nh dng u ra mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFA ULT); // thit lp b m ha m thanh s dng mediaRecorder.setAudioEncoder (MediaRecorder.AudioEncoder.DEFAULT); Khi chng ta xc nh u vo v nh dng u ra, ch nh mt tp tin lu tr cc media s dng phng thc setOutputFile nh hnh di y: mediaRecorder.setOutputFile(myoutputfile.mp4); bt u ghi m, ta gi prepare bng phng thc start nh sau: mediaRecorder.prepare(); mediaRecorder.start();

SVTH: Phm Quang o Nguyn Hong Nam

78

Tm hiu lp trnh trn Android


Khi hon thnh ta gi stop kt thc, tip theo l release gii phng ngun ti nguyn my ghi m. mediaRecorder.stop(); mediaRecorder.release(); Sau khi ghi m mt media mi ta to ra mt i tng ContentValues mi thm mt ghi m mi vo Media Store.Cc d liu m chng ta ch nh y c th bao gm cc chi tit nh tn, thi gian, m a l cho tp tin mi nh th hin trong on code sau y: ContentValues content = new ContentValues(3); content.put(Audio.AudioColumns.TITLE, TheSoundandtheFury); content.put(Audio.AudioColumns.DATE_ADDED, System.currentTimeMillis() / 1000); content.put(Audio.Media.MIME_TYPE, audio/amr); Chng ta cng cn phi ch ra ng dn cho tp tin c to: content.put(MediaStore.Audio.Media.DATA,myoutputfile.mp4); C th truy cp vo ContentResolver ca ng dng, s dng thm mt dng mi vo MediaStore nh trong on code sau: ContentResolver resolver = getContentResolver(); Uri uri = resolver.insert(Audio.Media.EXTERNAL_CONTENT_URI, content); Khi thng tin ca mt tp tin c lu tr, chng ta c th thng bo n sn sng dng mt Intent pht nh sau: sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,uri));

4.12 S DNG MY NH
S ph bin ca my nh k thut s (c bit l trong in thoi di ng) gy ra mt s gim gi ng k. By gi tht l kh, thm ch tm mt in thoi i ng m khng c my nh v cc thit b Android khng phi l trng hp ngoi l. truy cp vo phn cng my nh chng ta cn phi thm mt CAMERA cho php trong ng dng manifest nh trnh by sau y: <uses-permission Android:name=Android.permission.CAMERA/>

SVTH: Phm Quang o Nguyn Hong Nam

79

Tm hiu lp trnh trn Android


truy cp vo dch v Camera, s dng phng thc tnh open trn lp Camera. Khi hon thnh vi Camera, kt thc dch v ny ta gi release s dng cc m hnh n gin th hin trong on code sau: Camera camera = Camera.open(); [ Do things with the camera ] camera.release();

4.12.1 Ci t iu khin camera


c sn mt i tng Camera.Parameters thit lp cho Camera hin hnh. Gi phng thc getParameters trn Camera truy cp vo cc thng s hin hnh. Chng ta c th s dng phng thc set* trn thng s quay tr li thit lp cc sa i. p dng s thay i ta gi setParameters a vo cc gi tr thay i nh sau: Camera.Parameters parameters = camera.getParameters(); parameters.setPictureFormat(PixelFormat.JPEG); camera.setParameters(parameters);

4.12.2 S dng my nh
Truy cp vo cc video ca my nh c ngha l chng ta c th kt hp trc tip cc video vo cc ng dng ca chng ta. Mt th v nht m ng dng Android s dng chc nng ny nh l lp c s. My nh c hin th trong thi gian thc hin trn mt giao din nh th hin trong on code sau y: camera.setPreviewDisplay(mySurface); camera.startPreview(); [] camera.stopPreview(); Chng ta cng c th ch nh mt PreviewCallback chn cho mi khung hnh xem, cho php thao tc hoc hin th khung hnh xem. Gi phng thc setPreviewCallback trn i tng Camera, a vo mt PreviewCallback mi thc hin ghi ln phng thc onPreviewFrame nh trnh by sau: camera.setPreviewCallback(new PreviewCallback() {

SVTH: Phm Quang o Nguyn Hong Nam

80

Tm hiu lp trnh trn Android


public void onPreviewFrame(byte[] _data, Camera _camera) { // TODO Do something with the preview image. } });

4.12.3 Chp nh
Chp nh bng cch gi takePicture trn i tng Camera, a vo mt ShutterCallback v PictureCallback thc hin cho hnh nh RAW v JPEG. Mi ln gi hnh nh s nhn c mt mng (byte) i din cho hnh nh trong cc nh dng thch hp, trong khi gi li cnh ca chp c kch hot ngay sau cnh ca chp c ng li. private void takePicture() { camera.takePicture(shutterCallback, rawCallback, jpegCallback); } ShutterCallback shutterCallback = new ShutterCallback() { public void onShutter() { // TODO Do something when the shutter closes. }}; PictureCallback rawCallback = new PictureCallback() { public void onPictureTaken(byte[] _data, Camera _camera) { // TODO Do something with the image RAW data. }}; PictureCallback jpegCallback = new PictureCallback() { public void onPictureTaken(byte[] _data, Camera _camera) { // TODO Do something with the image JPEG data. } };

SVTH: Phm Quang o Nguyn Hong Nam

81

Tm hiu lp trnh trn Android

Chng 5. TNG KT
5.1 KT QU T C:
Tm hiu c nn tng c bn ca h iu hnh trn thit b di ng Android. Mt h iu hnh m ngun m trn di ng ang ni ln v pht trin chng mt trn th gii trong thi gian gn y. Mt c tnh tuyt vi ca Android l tnh m ca n, da trn c tnh ny cc nh sn xut c th ty bin to ra cc giao din c trng cho tng ngi s dng. Ngoi ra Android th hin u th vt tri hn cc h iu hnh trn thit b di ng khc khi c tch hp sn cc dch v h tr t Google y nht: Gmail, Google Talk, Google Calendar Nm bt c cch to giao din t nhng cng c Android cung cp v cch ty chnh cc cng c ny: Linear Layout, Relative Layout, cc control : Listview, Button, Checkbox, . Tm hiu v thc hnh lp trnh c nhng chng trnh nh u tin trn thit b gi lp trn PC, dng Eclipse v SDK m Google cung cp. Qua tng chng chng ta i qua tm hiu cc thnh phn quan trng c bn ca Android nh: Activity, Intent, Broadcast Resever, ContentProvider, MapView, Geocoder, Services, v s dng phn cng c bn ca Android l Camera quay phim, chp nh.

5.2 HNG PHT TRIN CA TI:


Tip tc tm hiu cc thnh phn khc ca Android nhm nm vng hn v nhiu hn v cc thnh phn ca Android. Xy dng mt ng dng mang tnh kh thi trn h iu hnh ny.

5.3 TI LIU THAM KHO:


Cc Ebook: Unlocking Development Cc trang web: http://vietAndroid.com/tin-tuc.html, Android, Professional Android Application

http://developer.Android.com/

SVTH: Phm Quang o Nguyn Hong Nam

82

You might also like