You are on page 1of 121

Bi ny s hng dn cn k mi ngi cch s dng Android trong Eclipse, hi vng gip nhng ngi mi chp chng bc vo lp trnh Android

c thm thng tin v bit cch khai thc IDE ca mnh hiu qu hn. I.Hng dn ci t Android vi Eclipse: Thc cht anh Gip vit mt bi c ni dung tng t, nhng do Goolge thay i phng thc ti Android SDK nn mnh quyt nh vit li, gp lun vo topic hng dn s dng Eclipse. 1.Download Android SDK: Android SDK thc cht l tp hp cc cng c v th vin pht trin cc ng dng trn nn tng h iu hnh Android. B1: Vo trang http://developer.android.com/sdk/index.html ti Android SDK Starter. Ty thuc vo h iu hnh m bn chn bn Mac, Linux hay Window. y mnh chn ti bn cho Window.

B2: Gii nn file zip bn va ti v. Chy SDK Setup.exe. Bn c th gp thng bo li Fetching https://dl-sl... Failed to fetch... Close thng bo ny li. Tip theo ca s Choose Packages to Install xut hin. Nu ca s ny trng rng -> Cancel. -> Quay v ca s Android SDK and AVD manager -> Chn Setting, nh du vo Force https://... -> Chn Available Packages

B3: nh du cc Packages bn mun ti: Documents chnh l phn Javadoc m t hot ng ca cc phng thc v cc lp (phn ny chc chn khng th thiu ri), Sample l cc on code mu, SDK Platform ng vi cc phin bn h iu hnh (2.2 - API level 8, 2.1 - API level 7,...), v Google API pht trin cc phn mm lin quan n dch v ca Google (nh Google Map nu bn mun lp trnh lin quan n GPS). Cc bn c th ti ht nu thch, cn mun ti u th c th nh du nh mnh (lu USB drivers ch dnh cho ngi s dng Windows v mun pht trin ng dng test bng in thoi tht). -> Install Selected -> Install -> Ca s Install hin ra -> Ngi ch (>_<)

2.Tch hp Android SDK vo Eclipse: B1: Ti Eclipse nu bn cha c. Mi ngi c th phn vn khng bit ti bn no cho ph hp, nhng theo kin ca mnh th c th dng 1 trong 2 bn sau: Eclipse for Java Developers, hoc Eclipse for Java and Report Developers (mnh dng bn sau). B2: Khi chy Eclipse, vo Help -> Install new softwares. Chn Add, g vo Name tn bn mun v Location g vo a ch ti v ADT: HTML Code: https://dl-ssl.google.com/android/eclipse/ hoc HTML Code: http://dl-ssl.google.com/android/eclipse/

nu https khng hot ng. Ngoi ra bn cng c th ti thng ADT v my theo link http://dl.google.com/android/ADT-0.9.7.zip (bn mi nht 0.9.7 ng vi Android 2.2), chn Archive v browse ti file ny (lu khng gii nn) -> OK -> Check vo phn di Name (s hin ra dng Developer Tools).

B3: Next, next, Accept, next,...Finish (nh Install mi chng trnh bnh thng).

B4: Eclipse -> Windows -> Preferences -> Android Nhn nt Browse v chnh ng dn ti th mc ca Android SDK bn ti lc trc. -> Apply -> OK

3.Android Virtual Device (Emulator): AVD l my o cho developer pht trin ng dng. to 1 AVD bn vo Windows -> Android SDK and AVD Manager -> Virtual Devices chn New. -> Ca s Create new AVD hin ra, bn in thng tin cho AVD bn mun: Name: Ty (nhng ch c s dng cc k t "a-z", "A-Z", ".-_", ngha l c khong trng cng ko c). Target: Chn phin bn h iu hnh bn mun (thng mnh to mt Android 1.6 v mt Android 2.2 test). SD Card: g vo Size SD card o cho AVD, hoc chnh ti file c sn. Nhiu AVD c th dng chung 1 Sdcard (ch cn to ln u, cc ln sau chnh ng dn ti file ). Skin: c th Default (HVGA) hoc chn kch c mn hnh bn mun. Ch cn quan tm ti 3 option: HVGA (phn gii 320-480 nh G1, G2, i5700...), QVGA (240-320 nh HTC Wildfire...), WVGA854 (480-854 nh Milestone, NexusOne...) -> Create AVD.

II.Mt s chc nng cn bit khi lp trnh Android vi Eclipse: Nhng iu mnh nu ra di y u l c bn, c th cc pro bit ht ri, nhng nh mnh ni, bi ny l dnh cho newbie vi hi vng gia tng kin thc c bn cng gim thi gian tm kim cho cc bn. 1.Debug cho ng dng Android: Nhiu ngi chuyn t J2SE hoc J2ME sang Android s ngc nhin v cu lnh debug kinh in System.out.println() khng cn in ra trn ca s Console na.

Google thay th n bng Logcat, mt ca s ghi li ton b hot ng ca h iu hnh. m Logcat, trc tin cc bn chn Window -> Open Perspective -> Debug. Nu ko thy option Debug th chn Other v tm Debug trong ca s mi hin ra. Sau chn tab Debug mi xut hin gc trn bn phi ca Eclipse (xem hnh). Theo kinh nghim ca mnh th tt nht l Maximize Logcat ra lun cho d quan st. Cm nhn ngy xa khi mi s dng Logcat l ri v kh dng. Nhng cng v sau mnh cng quen v thy n tin hn Console nhiu, v Console ch a ra thng bo do chng ta gi, cn Logcat th a c lun nhng thng bo ca h iu hnh, gip chng ta nm c h iu hnh ang lm g, gi n ci g, khi chy nhng g...

2.File Explorer ca Android: File Explorer l mt chc nng hu ch Google a vo gip chng ta qun l file trong sd card v c file system data (ch qun l c ca emulator, khng th truy nhp system data ca thit b tht). FE gip bn d dng a file vo / ly file ra trong sdcard o ca emulator, xa c s d liu ca chng trnh khi to li (only emulator)... M FE bng cch vo Window -> Show View -> Others -> Android -> File Explorer. Mnh FE trong ca s Debug cho tin qun l.

Device ca Android:
Device cng l mt chc nng hu ch na trong Android gip bn qun l thit b o cng nh tht ca mnh. M Device bng cch vo Window -> Show View -> Device hoc vo Window -> Show View -> Others -> Android -> Device. Chc nng mnh thng s dng nht ca device l Screen Capture, cc k tin ly nh minh ha lm thuyt trnh hoc gii thiu trn Google Market.

III.Mt s th thut trong Android v Eclipse: 1.Hin th ting Vit: Window -> Preferences -> General -> Workspace. Trong Workspace phn Text File Encoding chn Other -> UTF-8. 2.T ng s code: T hp phm kinh in Ctrl + Space (iu k l l kh nhiu ngi khng bit). 3.Comment: Ctrl + "/": t ng thm cm "//" vo u dng (ko tin lm). Ctrl + Shift + "/": t ng thm "/* */" vo cm c bi en. Ctrl + Shift + "\": t ng b "/* */" vo cm c bi en. 4.Override: i lc bn mun Override phng thc ca mt lp c sn, ko l chng ta s i tm tn phng thc trn mng v g ng li nh th? Nhiu bn gp li khi nh vit li phng thc ny v debug mi ko ra (v n ko phi l li): M: @Override public boolean onCreateOptionsMenu(Menu menu) { } n gin v g thiu ch s. Eclipse cung cp phng tin gip ta ghi phng thc ca lp cha vi Source > Override/Implement Method, nhng cc k nhiu ngi khng bit.

Hng dn lp trnh c bn vi Android - Bi 1 Yu cu kin thc cho lp trnh Android: lp trnh android, mnh ngh mi ngi ch cn kin thc java cn bn l hon ton ok. Cn bn y c ngha l hiu c th no l class, package, bit ngha ca cc t kha nh public, private, protected,... thnh tho cc lnh c bn nh if, for(), switch(), while(), ... bit sd cc lnh nh Integer.parseInt() hay String.valueOf()... Nn c thm kin thc v gi java.util v y l gi h tr nhiu lp rt mnh c s dng trn mi nn, ngoi ra cc gi nh java.io, java.net... cng c recommended Cc kin thc v cc gi lp trnh cho desktop nh java.awt, java.swing hon ton khng cn thit (bn thn mnh cng cha sd ci ny bao gi, nhy vo hc java l hc J2ME lun), hay cc gi ca J2ME cng vy Lp trnh Android tuy cng l lp trnh di ng, nhng cc in thoi s dng hh Android c cu hnh rt mnh (Nexus One c VXL ln ti 1Ghz), v vy 2 nn tng Android v J2ME cng rt khc nhau. Android c nhng gi ring h tr lp trnh cho n v khng yu cu kht khe v vic ti u code nh J2ME. Tht ng tic v J2ME mnh hc ko ng dng c my vo lp trnh Android (tuy nhin 1 s k thut c bn cho lp trnh game 2D nh Sprite, double buffering, Tile... th vn ko h ph phm cht no ) Ci t Android lp trnh: lp trnh Android th mi b SDK ca Google l khng , bn cn cn tch hp n vo mt IDE nh Eclipse. Anh Gip c 2 bi hng dn rt chi tit v ci t Android trong Eclipse cng nh Netbeans, nhng theo mnh mi ngi nn s dng Eclipse hn v n c nhiu tnh nng h tr lp trnh Google, cn Netbeans th plugin cho Android vn cha hon thin Eclipse Netbeans Tin th mnh ni lun, mnh hc Android theo 2 cun Professional Android Application Development v Unlocking Android. C 2 cun u dnh cho beginner nhng cun u code nhiu, gii thch t, cun th 2 gii thch r rng hn. Nu

c ai c nh tham kho th nn c cun UA trc hiu r hn Android, s dng cun PAAD trong vic tham kho cc on code cho lp trnh. Understanding Android Application: Vic hiu c cc thnh phn (component) to nn mt ng dng Android l rt cn thit cho vic lp trnh. Cc thnh phn ny c chia lm 6 loi bao gm: 1.Activity: hiu mt cch n gin th Activity l nn ca 1 ng dng. Khi khi ng 1 ng dng Android no th bao gi cng c 1 main Activity c gi, hin th mn hnh giao din ca ng dng cho php ngi dng tng tc. 2.Service: thnh phn chy n trong Android. Service s dng update d liu, a ra cc cnh bo (Notification) v khng bao gi hin th cho ngi dng thy. 3.Content Provider: kho d liu chia s. Content Provider c s dng qun l v chia s d liu gia cc ng dng. 4.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 bn mong mun. VD: khi m 1 trang web, bn gi 1 intent i to 1 activity mi hin th trang web . 5.Broadcast Receiver: thnh phn thu nhn cc Intent bn ngoi gi ti. VD: bn vit 1 chng trnh thay th cho phn gi in mc nh ca Android, khi bn cn 1 BR nhn bit cc Intent l cc cuc gi ti. 6.Notification: a ra cc cnh bo m khng lm cho cc Activity phi ngng hot ng. Activity, Service, Broadcast Receiver v Content Provider mi l nhng thnh phn chnh cu thnh nn ng dng Android, bt buc phi khai bo trong AndroidManifest (tham kho bi 2 c gii thiu y v file ny). Understanding Android Application Life Cycle: Android c c ch qun l cc process theo ch u tin. Cc process c priority thp s b Android gii phng m khng h cnh bo nhm m bo ti nguyn. 1.Foreground process: l process ca ng dng hin thi ang c ngi dng tng tc. 2.Visible process: l process ca ng dng m activity ang hin th i vi ngi

dng (onPaused() ca activity c gi). 3.Service process: l Service ang running. 4.Background process: l process ca ng dng m cc activity ca n ko hin th vi ngi dng (onStoped() ca activity c gi). 5.Empty process: process khng c bt c 1 thnh phn no active. Theo ch u tin th khi cn ti nguyn, Android s t ng kill process, trc tin l cc empty process.

Android Activity Life Cycle: Nh mnh gii thiu trn , Actitvity l thnh phn quan trng nht v ng vai tr chnh trong xy dng ng dng Android. H iu hnh Android qun l Activity theo dng stack: khi mt Activity mi c khi to, n s c xp ln u ca stack v tr thnh running activity, cc Activity trc s b tm dng v ch hot ng tr li khi Activity mi c gii phng. Activity bao gm 4 state: - active (running): Activity ang hin th trn mn hnh (foreground). - paused: Activity vn hin th (visible) nhng khng th tng tc (lost focus). VD: mt activity mi xut hin hin th giao din ln trn activity c, nhng giao din ny nh hn giao din ca activity c, do ta vn thy c 1 phn giao din ca activity c nhng li khng th tng tc vi n. - stop: Activity b thay th hon ton bi Activity mi s tin n trng thi stop - 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 . Biu miu t Activity state

Vng i ca Activity: - Entire lifetime: T phng thc onCreate( ) cho ti onDestroy( ) - Visible liftetime: T phng thc onStart( ) cho ti onStop( ) - Foreground lifetime: T phng thc onResume( ) cho ti onPause( ) Khi xy dng Actitvity cho ng dng cn phi vit li phng thc onCreate( )

thc hin qu trnh khi to. Cc phng thc khc c cn vit li hay khng ty vo yu cu lp trnh. XML trong Android: Khng ging nh lp trnh java thng thng, lp trnh android ngoi cc lp c vit trong *.java cn s dng XML thit k giao din cho ng dng. Tt nhin bn hon ton c th thit k 1 giao din nh mun m khng cn ti bt c 1 dng XML no, nhng sd XML s n gin cng vic i rt nhiu. ng thi sd XML s gip vic chnh sa ng dng sau ny tr nn d dng. V nguyn tc, khi lp trnh ng dng ta thit k giao din bng XML v ci t cc x l khi tng tc vi giao din trong code. 1 s thnh phn c bn trong Android: 1.Cc layout: Layout c dng qun l cc thnh phn giao din khc theo 1 trt t nht nh. - FrameLayout: Layout n gin nht, thm cc thnh phn con vo gc trn bn tri ca mn hnh. - LinearLayout: thm cc thnh phn con theo 1 chiu nht nh (ngang hoc dc). y l layout c s dng nhiu nht. - RelativeLayout: thm cc thnh phn con da trn mi quan h vi cc thnh phn khc hoc vi bin ca layout. - TableLayout: thm cc thnh phn con da trn 1 li cc ngang v dc. - AbsoluteLayout: thm cc thnh phn con da theo ta x, y. Layout c s dng nhm mc ch thit k giao din cho nhiu phn gii. Thng khi lp trnh nn kt hp nhiu layout vi nhau to ra giao din bn mong mun. 2.XML unit: hiu c cc thnh phn c bn ca XML cng nh vic s dng XML kt hp vi code, ta s i xy dng th mt chng trnh n gin. Yu cu: Xy dng 1 ng dng cho php g 1 ni dung vo ri hin th ra ni dung bn di. B1: Khi to 1 project ( y s dng Eclipse minh ha). Vo th File -> New -> Android Project. Nu bn mi lp trnh Android ln u th

c l dng Android Project s khng hin ra, khi xung pha cui chn Other ri vo Android -> Android Project. B2: in thng tin cho project

Project name: Example 1 Build Target: Chn Android 1.5 (mi nht l 2.1 nhng hin ti bn cha cn quan tm ) Application name: Example 1 Package name: at.exam Create Activity: Example => Kch nt Finish.

B3: Bn khung Package Explore bn tri i ti th mc res, bn s thy c 3 th mc con:

- drawable: th mc cha cc hnh nh lm icon hoc ti nguyn cho giao din... - layout: cha cc file xml thit k giao din.

- values: cha cc gi tr s dng trong ng dng c bn nh ngha, nh cc dng k t (string), cc mu (color), cc themes... B4:Vo th mc layout, chn file main.xml v g on code sau vo thay cho ton b ni dung c sn (Eclipse h tr ko th cho xml nhng theo mnh khng nn s dng): M: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/andro id" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <EditText android:id="@+id/edit_text" android:layout_width="fill_parent" android:layout_height="wrap_content" android:hint="@string/edit_hint" /> <TextView android:id="@+id/text_view" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textColor="@color/text_color" android:textSize="28px" android:typeface="monospace" /> </LinearLayout> Trong on XML ny chng ta khai bo mt Linear Layout vi 2 thnh phn con ca n l 1 Edit Text (dng g xu k t) vi 1 Text View (hin th xu k t). Linear Layout c khai bo vi t kha orientation nhm ch ra chiu sp xp ca 2 thnh phn con l chiu dc. Cn vi layout_width, layout_height cc bn c th cho gi tr bng "fill_parent" hoc "wrap_content" thng bo thnh phn ny s c chiu rng (di) ph y thnh phn cha hoc ch va bao ni dung. Trong Edit Text v Text View cc bn c th thy c t kha id, t kha ny cho php khai bo id ca cc thnh phn ly v trong code (s cp sau). Ngoi ra t kha hint trong Edit Text cho php hin ra phn ni dung m khi Edit

Text vn cha c k t no. "@string/edit_hint" thng bo ly trong file strings.xml xu c tn l edit_hint. Cn textColor ca Text View th thng bo on k t s c hin th vi mu ly trong file colors.xml, textSize ch ra c ch bng 28 pixel v typeface ch ra kiu ch l monospace B5:Vn trong th mc res, vo values v chn file strings.xml. B sung thm dng nh ngha cho edit_hint nh sau: M: <?xml version="1.0" encoding="utf-8"?> <resources> <string name="hello">Hello World, Example!</string> <string name="app_name">Example 1</string> <string name="edit_hint">Enter the work here</string> </resources> B6:Trong th mc values, to file colors.xml (chut phi vo th mc, chn New > Android XML File, v lu ch s, khng phi l color.xml). G ni dung cho file nh sau: M: <?xml version="1.0" encoding="utf-8"?> <resources> <color name="text_color">#ff3300</color> </resources> OK, vy l bn to mt mu mi cho dng ch s c hin th trong Text View (ff3300 l m hexa ca mu ). Thc cht bn hon ton c th g thng M: android:textColor="#ff3300" trong file main.xml m khng cn to mi file colors.xml, nhng mc ch ca XML trong Android chnh l h tr nng cp chnh sa d dng. Nu sau ny bn mun sa mu ca dng text th ch cn vo colors.xml thay i thay v m mm trong main.xml (c th rt di nu giao din phc tp). Cc thnh phn trn mi ch l cc phn c bn ca XML. Ngoi ra cc bn c th

khai bo thm v Animation, Style v Theme (phc tp hn nhiu nn mnh khng gii thiu trong phn c bn ny).

B7: Vy l chng ta hon thin phn giao din vi XML, gi n vit code x l cc s kin cho cc thnh phn: => vo th mc src (source code ca project) => at.exam => Example.java, g ni dung code sau vo: M: package at.exam; import import import import import import import android.app.Activity; android.os.Bundle; android.view.KeyEvent; android.view.View; android.view.View.OnKeyListener; android.widget.EditText; android.widget.TextView;

public class Example extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //Thit lp giao din ly t file main.xml setContentView(R.layout.main); //Ly v cc thnh phn trong main.xml thng qua id final EditText edit = (EditText) findViewById(R.id.edit_text); final TextView text = (TextView) findViewById(R.id.text_view); //Thit lp x l cho s kin nhn nt gia ca in thoi edit.setOnKeyListener(new OnKeyListener() { @Override

public boolean onKey(View v, int keyCode, KeyEvent event) { if (event.getAction() == KeyEvent.ACTION_DOWN && keyCode == KeyEvent.KEYCODE_DPAD_CENTER) { text.setText(edit.getText().toString()); edit.setText(""); return true; } else { return false; } } }); } }

Do qua mt cht kin thc c bn: Trong Android, cc lp s dng to giao din (Edit Text, Text View...) u l lp con ca lp View. Mt s lp thng xuyn c s dng to giao din: - TextView - EditText - ListView - Spinner - CheckBox - Button - RadioButton Ngoi ra bn cn c th to 1 View ring ca mnh bng cch k tha View c sn. Cc Listener c s dng bt 1 s kin no . y mnh s dng OnKeyListener dng bt s kin khi nhn 1 phm ca in thoi. Ngoi ra thng s dng OnClickListener bt s kin chm vo 1 View ang hin th trn mn hnh. Mi View u phi set Listener ring x l cho s kin tng tc vi n, v mi loi View cng li c nhng Listener dnh ring cho n (VD: CheckBox c OnCheckChangedListener) y mnh s dng hm dng inner nh ngha x l cho OnKeyListener nn c th mi ngi khng quen lm, nhng n cng nm trong phn c bn ca Java y nh. ngh lu thm phn R.id.edit_text. ly hoc truy nhp cc thnh phn ta nh ngha trong XML ta phi s dng R.* nh R.layout.main, R.id.edit_text. Lnh findViewById s tr v 1 View c Id thit lp trong phn XML. Do View l lp cha ca EditText vi TextView nn y ta phi p kiu. Ngoi ra cc string hay color cng c th ly v bng lnh getResource() . Vd: getResource().getColor(R.color.text_color) B8: Chy chng trnh. Chn Run => Android Application v ch cho emulator khi ng nh. Ai c 1 Android tht c th kt ni qua USB v th nghim lun. T chnh sa trong code v trong XML hiu thm v lp trnh Android. VD: M:

edit.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub } }); hoc trong XML thm vo phn Text View M: android:textSize="50px" xem chng trnh thay i nh th no nh ^_^

Understanding Android Application: Vic hiu c cc thnh phn (component) to nn mt ng dng Android l rt cn thit cho vic lp trnh. Cc thnh phn ny c chia lm 6 loi bao gm: 1.Activity: hiu mt cch n gin th Activity l nn ca 1 ng dng. Khi khi ng 1 ng dng Android no th bao gi cng c 1 main Activity c gi, hin th mn hnh giao din ca ng dng cho php ngi dng tng tc. 2.Service: thnh phn chy n trong Android. Service s dng update d liu, a ra cc cnh bo (Notification) v khng bao gi hin th cho ngi dng thy.

3.Content Provider: kho d liu chia s. Content Provider c s dng qun l v chia s d liu gia cc ng dng. 4.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 bn mong mun. VD: khi m 1 trang web, bn gi 1 intent i to 1 activity mi hin th trang web . 5.Broadcast Receiver: thnh phn thu nhn cc Intent bn ngoi gi ti. VD: bn vit 1 chng trnh thay th cho phn gi in mc nh ca Android, khi bn cn 1 BR nhn bit cc Intent l cc cuc gi ti. 6.Notification: a ra cc cnh bo m khng lm cho cc Activity phi ngng hot ng. Activity, Service, Broadcast Receiver v Content Provider mi l nhng thnh phn chnh cu thnh nn ng dng Android, bt buc phi khai bo trong AndroidManifest (tham kho bi 2 c gii thiu y v file ny). Understanding Android Application Life Cycle: Android c c ch qun l cc process theo ch u tin. Cc process c priority thp s b Android gii phng m khng h cnh bo nhm m bo ti nguyn. 1.Foreground process: l process ca ng dng hin thi ang c ngi dng tng tc. 2.Visible process: l process ca ng dng m activity ang hin th i vi ngi dng (onPaused() ca activity c gi). 3.Service process: l Service ang running. 4.Background process: l process ca ng dng m cc activity ca n ko hin th vi ngi dng (onStoped() ca activity c gi). 5.Empty process: process khng c bt c 1 thnh phn no active. Theo ch u tin th khi cn ti nguyn, Android s t ng kill process, trc tin l cc empty process.

Trong bi 1 mnh gii thiu s lc v cc thnh phn c bn ca Android cng nh vic s dng XML lp trnh ng dng Android. Trong bi ny mnh s gii thiu thm v Android Manifest v i su hn v vn lm vic vi View. Android Manifest Trong khung Package Explorer, pha di th mc res, bn s thy 1 file c tn l AndroidManifest.xml. Mi ng dng u cn c AndroidManifest.xml m t nhng thng tin quan trng ca n cho h thng Android bit. Let's look closer: M: <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/andro id" package="at.exam" android:versionCode="1" android:versionName="1.0"> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".Example" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> <uses-sdk android:minSdkVersion="3" /> </manifest>

C th nhng cng vic m AndroidManifest.xml thc hin: - t tn cho Java package ca ng dng. - M t cc thnh phn (component) ca ng dng: activity, service, broadcast receiver hoc content provider. - Thng bo nhng permission m ng dng cn c truy nhp cc protected API v tng tc vi cc ng dng khc. - Thng bo nhng permission m cc ng dng khc cn c tng tc vi ng dng hin thi. - Thng bo level thp nht ca Android API m ng dng cn chy. (Android 1.0 l level 1, 1.1 l level 2, 1.5 level 3, 1.6 level 4 v 2.0 l level 5). ... Hy xem th file AndroidManifest.xml ca chng trnh TooDo mnh ang xy dng: M: <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/andro id" package="android.at" android:versionCode="1" android:versionName="1.0"> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".TooDo" android:screenOrientation="landscape" android:theme="@android:style/Theme.NoTitleBar.Fullscre en" 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=".WorkEnter"> </activity> <receiver android:name=".AlarmReceiver"> </receiver> </application> <uses-sdk android:minSdkVersion="3" /> <uses-permission android:name="android.permission.VIBRATE"/> </manifest> Main Activity ca chng trnh Too Do ny l activity TooDo. Ngoi ra mnh cn c 1 Activity khc c tn l WorkEnter cho php nhp vo thi gian v ni dung cng vic. 1 Broadcast Receiver c tn l AlarmReceiver nhn alarm gi ti trong intent. Khi alarm c nhn s c m thanh v rung (vibration). Tt c cng vic s c vit trong code, nhng bt buc bn phi khai bo cc thnh phn c trong ng dng vo AndroidManifest nu mun chng trnh hot ng. Tng t, set permission truy nhp camera, internet, c contact... cng u phi khai bo trong AM. T kha screenOrientation cho php thit lp giao din khi vo ng dng theo chiu dc (portrait - mc nh) hay ngang (landscape), theme cho php s dng style c sn ca android l full-screen (ko c thanh status bar na). Intent filter l b lc dng gii hn cc intent c s dng trong activity hay receiver... M: <intent-filter> <action android:name="android.intent.action.VIEW"/> <category android:name="android.intent.category.DEFAULT"/> <category android:name="android.intent.category.BROWSABLE"/>

<data android:scheme="http" android:host="www.google.com" android:path="/m/products/scan"/> </intent-filter> B lc trn ch cho php intent m internet vi ng dn nh ngha sn (http://www.google.com/m/products/scan) Ok, hi vng mi ngi nm c chc nng c bn cng nh cch s dng Android Manifest

Working with View Trong bi 1 mnh gii thiu qua cch s dng Edit Text v Text View. Thc cht cc View cn li cng c cch s dng tng t, bn s kt hp nhiu View khc nhau cho ra giao din mnh mong mun. y mnh s cp nhiu ti List View (theo kin mnh l View kh s dng nht). Yu cu: Xy dng mt chng trnh cho php nhp ni dung cng vic v thi gian ri list ra B1: Vn bt u bng cch khi to mt Project mi: File -> New -> Android Project. Project name: Example 2 Build Target: Chn Android 1.5 Application name: Example 2 Package name: at.exam Create Activity: Example => Kch nt Finish. Giao din ta thit k y c 1 Linear Layout lm thnh phn chnh, cc thnh phn con ca n gm 1 Edit Text (dng nhp ni dung cng vic), 1 Linear Layout (li gm cc thnh phn con nhp gi v pht thc hin cng vic), 1 Button ( thm ni dung cng vic vo List View) v 1 List View dng list cc cng vic bn nhp. T kha lines c dng c nh s dng v nn s dng vi Edit Text thay v dng mi wrap_content v nu sd wrap_content th Edit Text s t gin ra nu dng nhp vo vt gii hn ng bao (lm hng giao din bn thit k). T kha gravity thng bo cc thnh phn con s c sp xp ntn thnh phn

cha. y mnh dng "center" ngha l thnh phn con nm trung tm. Hy th thm vo 1 Edit Text: M: android:gravity="center"

B2: i ti res/main.xml xy dng giao din cho chng trnh: M: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/andro id" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <EditText android:id="@+id/work_enter" android:layout_width="fill_parent" android:layout_height="wrap_content" android:hint="@string/work_hint" android:lines="1" android:textSize="24px" /> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" > <TextView android:layout_width="50px" android:layout_height="wrap_content" android:text="@string/hour_edit" android:typeface="normal" android:textSize="15px" android:textStyle="bold"

android:padding="5px" /> <EditText android:id="@+id/hour_edit" android:layout_width="45px" android:layout_height="wrap_content" android:hint="12" android:textColorHint="@color/hint_color" android:textSize="20px" android:gravity="center" android:padding="5px" android:numeric="integer" android:maxLength="2" /> <TextView android:layout_width="65px" android:layout_height="wrap_content" android:text="@string/minute_edit" android:typeface="normal" android:textSize="15px" android:textStyle="bold" android:padding="5px" /> <EditText android:id="@+id/minute_edit" android:layout_width="45px" android:layout_height="wrap_content" android:hint="00" android:textColorHint="@color/hint_color" android:textSize="20px" android:gravity="center" android:padding="5px" android:numeric="integer" android:maxLength="2" /> </LinearLayout> <Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content"

android:gravity="center" android:text="@string/button_content" /> <ListView android:id="@+id/list" android:layout_width="fill_parent" android:layout_height="wrap_content" /> </LinearLayout>

Giao din ta thit k y c 1 Linear Layout lm thnh phn chnh, cc thnh phn con ca n gm 1 Edit Text (dng nhp ni dung cng vic), 1 Linear Layout (li gm cc thnh phn con nhp gi v pht thc hin cng vic), 1 Button ( thm ni dung cng vic vo List View) v 1 List View dng list cc cng vic bn nhp. T kha lines c dng c nh s dng v nn s dng vi Edit Text thay v dng mi wrap_content v nu sd wrap_content th Edit Text s t gin ra nu dng nhp vo vt gii hn ng bao (lm hng giao din bn thit k). T kha gravity thng bo cc thnh phn con s c sp xp ntn thnh phn cha. y mnh dng "center" ngha l thnh phn con nm trung tm. Hy th thm vo 1 Edit Text: M: android:gravity="center" Bn s thy dng ch nhp vo s bt u t gia ca Edit Text ch khng bt u t bn tri nh trc na. T kha padding dng cch 1 khong cch cho thnh phn. Nu khng c padding th 2 thnh phn con thuc cng 1 LinearLayout s c xp st nhau, nhng nu 1 thnh phn con s dng padding th s to c khong cch vi

thnh phn cn li theo mong mun. Ngoi ra cn c paddingLeft, paddingRight, paddingTop, paddingBottom. T kha numeric dng gii hn dng k t nhp vo. y mnh mun ch nhp vo ch s nn dng "integer" T kha maxLength dng gii hn s k t nhp vo. Do Edit Text ny dng nhp gi nn maxLength="2". Ok, gi n 1 cht kin thc v cc n v ca dimenson: - px (pixel): im chm trn mn hnh. - in (inch) - mm (milimet) - pt (point) = 1/72 m - dp (density - independent pixel): ci ny hi kh gii thch. Ni chung dp c s dng cho nhiu phn gii, v vi phn gii 160 px/inch th 1 dp = 1 px. - sp: gn ging dp, nn s dng cho text size. Ni chung nn s dng dp v sp nh ngha size cho cc thnh phn, v n c t l c nh vi phn gii ca mn hnh. Cn nu bn ch tm xy dng cho 1 phn gii nht nh th dng px cho chnh xc v chc chn. B3: Ti values/strings.xml chnh sa nh sau: M: <?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">Example 2</string> <string name="work_hint">Enter the work here</string> <string name="hour_edit">Hour</string> <string name="minute_edit">Minute</string> <string name="button_content">Add work</string> </resources> B4: To mi colors.xml trong values vi ni dung: M: <?xml version="1.0" encoding="utf-8"?>

<resources> <color name="hint_color">#cccccc</color> </resources>

OK, vy l hon thin phn giao din. Cc bn c th cho chy th ngay kim tra xem giao din nh mun cha ch khng cn i hon thnh c code (Run as -> Android Application).

B5: Time to coding. Ti th mc src/Example.java v thay i ni dung file nh sau: M: package at.exam; import java.util.ArrayList; import import import import import import import import import import android.app.Activity; android.app.AlertDialog; android.content.DialogInterface; android.os.Bundle; android.view.View; android.view.View.OnClickListener; android.widget.ArrayAdapter; android.widget.Button; android.widget.EditText; android.widget.ListView;

public class Example extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); //To mng cha String ni dung cng vic v gi final ArrayList<String> arrayWork = new ArrayList<String>(); //Adapter dng kt ni mng vi List View final ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, arrayWork);

//Cc EditText vo ni dung cng vic c ly v t XML final EditText workEnter = (EditText) findViewById(R.id.work_enter); final EditText hourEdit = (EditText) findViewById(R.id.hour_edit); final EditText minuteEdit = (EditText) findViewById(R.id.minute_edit); //Button khi nhn s thm cng vic vo ListView final Button button = (Button) findViewById(R.id.button); //ListView cha danh sch cng vic final ListView list = (ListView) findViewById(R.id.list); //Cn set Adapter cho list bit s ly ni dung t mng arrayWork list.setAdapter(arrayAdapter); //nh ngha Listener x l s kin nhn vo button OnClickListener add = new OnClickListener() { @Override public void onClick(View v) { //Nu 1 trong 3 Edit Text khng c ni dung th hin ln thng bo if (workEnter.getText().toString().equals("") || hourEdit.getText().toString().equals("") || minuteEdit.getText().toString().equals("")) { AlertDialog.Builder builder = new AlertDialog.Builder(Example.this); builder.setTitle("Info missing"); builder.setMessage("Please enter all information of the work");

builder.setPositiveButton("Continue", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub } }); builder.show(); } //Ly ni dung cng vic v thi gian ra t Edit Text v a vo list else { String str = workEnter.getText().toString() + " - " + hourEdit.getText().toString() + ":" + minuteEdit.getText().toString(); arrayWork.add(0,str); arrayAdapter.notifyDataSetChanged(); workEnter.setText(""); hourEdit.setText(""); minuteEdit.setText(""); } } }; //set Listener cho button button.setOnClickListener(add); } } Mnh ch thch y v on code cng kh d hiu. Tuy nhin cn lu 2 vn y. - Khi to i tng ArrayAdapter: Cc bn thy i s truyn vo l (this, android.R.layout.simple_list_item_1, arrayWork). This l i s ca lp Context

( y chnh l activity Example). Bn s gp Context trong rt nhiu khi to cc lp v nn hiu Context c ngha g. Mnh xin a ra gii thch ca anh Gip (thank mr giaplv): Quote: Context thuc android.content (android.content.Context). L mt Interface (lp giao tip) cha hu ht thng tin v mi trng ng dng ca android, c ngha l mi thao tc, tng tc vi h iu hnh iu phi qua lp ny. N l mt lp abstract (tru tng) cung cp cho nhng lp khc cc phng thc tng tc vi h thng Android. N cho php truy cp ti cc ngun ti nguyn (resources) c nh ngha v cc lp khc. V d nh n c th khi to v chy cc activities, cc broadcast v cc intents,... Chng ta coi nh Contex l mt lp mc ng dng (Application level- lin quan ti h thng). Tm li context gip chng ta d dng truy cp v tng tc ti cc ti nguyn ca h thng, cc thng tin, cc dch v (services), cc thng s cu hnh, database, wallpaper, danh b, cuc gi, kt ni, ch rung (vibrator),... ***s d hu ht cc lp c lin quan ti UI (layout, button, textview, imageview, listview,...) u pi super ti Context v bn thn n m nhim vic truy cp resource (R.id, R.layout,....). Nu chng ta khng tham chiu ti Context class th ng nhin khng th dng ti cc resources m chng ta to ra. Tip theo l android.R.layout.simple_list_item_1, i ny nh ngha cch th hin item ( y l String) trong List View. Cc bn hy ghi nh android.R.* l cc ti nguyn (resource) c sn ca Android cho php bn truy cp v s dng. Sau ny khi hng dn to custom View cho List View mnh s cp li vn ny. Cui cng arrayWork chnh l mng cn c bind ca adapter. - AlertDialog l lp cho php a ra 1 hp thoi, thng dng a ra thng tin hoc cnh bo n gin. Trong code mnh to 1 builder, to tiu (title) cho n, a ra thng bo (message) v cui cng l to 1 positive button (nhng khng nh ngha x l khi nhn nt ny, v vy nu bn nhn nt th dialog s ch n gin thc hin vic ng li). B6: Tin hnh chy th chng trnh. Run as -> Android Application. Enjoy

yourself

Trong bi ny mnh s hng dn cch to 1 custom ViewGroup, s dng ViewGroup ny vo ListView, v cui cng l to 1 Option Menu. y cng s l bi cui cng mnh vit v lm vic vi View, cc bi sau s chuyn qua Intent v BroadCast Receiver. Custom ViewGroup ViewGroup thng thng chng ta hay gp l LinearLayout, Relative Layout. Xy dng custom ViewGroup cho php chng ta to 1 tp cc widget c sp xp theo mun ri a vo s dng. Yu cu: Xy dng ng dng dng To Do List: Cho php nhp vo ni dung cng vic v thi gian thc hin cng vic ri a vo list cng vic. Cho php xa cc cng vic khi list. B1: Khi to project: File -> New -> Android Project Project name: Example 3 Build Target: Chn Android 1.5 Application name: Example 3 Package name: at.exam Create Activity: Example => Kch nt Finish. B2: Xy dng custom view group trong XML. i ti res\layout to 1 file XML mi l list.xml. G ni dung sau vo: M: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/andro id" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal"> <CheckBox android:id="@+id/check_work" android:layout_width="wrap_content"

android:layout_height="wrap_content" android:text="" android:paddingTop="45px" android:paddingRight="10px" /> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" > <TextView android:id="@+id/work_content" android:textSize="24px" android:layout_width="wrap_content" android:layout_height="wrap_content" android:lines="1" android:textColor="@color/work_color" /> <TextView android:id="@+id/time_content" android:textSize="16px" android:layout_width="wrap_content" android:layout_height="wrap_content" android:lines="1" android:textColor="@color/time_color" /> </LinearLayout> </LinearLayout> Custom ViewGroup ca chng ta y kh n gin, l 1 LinearLayout cha 2 thnh phn: 1 CheckBox v 1 LinearLayout khc gm 2 TextView hin th ni dung cng vic v thi gian. B3: xong giao din cho custom ViewGroup, chng ta s thit k giao din cho chng trnh trong main.xml. y mnh dng li giao din ca Example 2 trong bi 2. M: <?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/andro id" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <EditText android:id="@+id/work_enter" android:layout_width="fill_parent" android:layout_height="wrap_content" android:hint="@string/work_hint" android:lines="1" android:textSize="24px" /> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" > <TextView android:layout_width="50px" android:layout_height="wrap_content" android:text="@string/hour_edit" android:typeface="normal" android:textSize="15px" android:textStyle="bold" android:padding="5px" /> <EditText android:id="@+id/hour_edit" android:layout_width="45px" android:layout_height="wrap_content" android:hint="12" android:textColorHint="@color/hint_color" android:textSize="20px" android:gravity="center" android:padding="5px" android:numeric="integer" android:maxLength="2"

/> <TextView android:layout_width="65px" android:layout_height="wrap_content" android:text="@string/minute_edit" android:typeface="normal" android:textSize="15px" android:textStyle="bold" android:padding="5px" /> <EditText android:id="@+id/minute_edit" android:layout_width="45px" android:layout_height="wrap_content" android:hint="00" android:textColorHint="@color/hint_color" android:textSize="20px" android:gravity="center" android:padding="5px" android:numeric="integer" android:maxLength="2" /> </LinearLayout> <Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" android:text="@string/button_content" /> <ListView android:id="@+id/list" android:layout_width="fill_parent" android:layout_height="wrap_content" /> </LinearLayout> B4: To file colors.xml trong res\value: M: <?xml version="1.0" encoding="utf-8"?>

<resources> <color name="work_color">#ffffff</color> <color name="time_color">#cccccc</color> <color name="hint_color">#cccccc</color> </resources> work_color l mu ca ni dung cng vic trong list. time_color mu ca thi gian cng vic. hint_color mu ca text hint (dng hng dn) cc EditText.

B5: Chnh sa file strings.xml trong res\value: M: <?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">Example 3</string> <string name="work_hint">Enter the work here</string> <string name="hour_edit">Hour</string> <string name="minute_edit">Minute</string> <string name="button_content">Add work</string> </resources>

B6: Time to coding. i ti src\at.exam to mt class mi l CustomViewGroup vi ni dung sau: M: package at.exam; import import import import import android.content.Context; android.view.LayoutInflater; android.widget.CheckBox; android.widget.LinearLayout; android.widget.TextView;

public class CustomViewGroup extends LinearLayout { public CheckBox cb; public TextView workContent; public TextView timeContent; public CustomViewGroup(Context context) { super(context);

//S dng LayoutInflater gn giao din trong list.xml cho class ny LayoutInflater li = (LayoutInflater) this.getContext() .getSystemService(Context.LAYOUT_INFLATER_SERVICE); li.inflate(R.layout.list, this, true); //Ly v cc View qua Id cb = (CheckBox) findViewById(R.id.check_work); workContent = (TextView) findViewById(R.id.work_content); timeContent = (TextView) findViewById(R.id.time_content); } } on code trn gip ta nh ngha giao din ca custom ViewGroup mi da trn file list.xml. Mi ngi cng c th to giao din bng code, ko cn s dng XML nhng s phc tp hn v mnh cng ko gii thiu y. B7: To 1 class Work cng trong at.exam th hin cng vic: M: package at.exam; public class Work { private String workContent; private String timeContent; private boolean isChecked; public Work(String workContent, String timeContent) { this.workContent = workContent; this.timeContent = timeContent; isChecked = false; } public String getContent() { return workContent; }

public String getTime() { return timeContent; } public void setChecked(boolean isChecked) { this.isChecked = isChecked; } public boolean isChecked() { return isChecked; } } Code rt n gin nn mnh s khng ch thch na. B8: Chng ta to xong custem ViewGroup, by gi chnh l lc s dng. To 1 class mi tn l ListWorkApdapter trong at.exam: M: package at.exam; import java.util.ArrayList; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.TextView; import android.widget.CompoundButton.OnCheckedChangeListener; public class ListWorkAdapter extends ArrayAdapter<Work>{ ArrayList<Work> array; int resource; Context context;

public ListWorkAdapter(Context context, int textViewResourceId, ArrayList<Work> objects) { super(context, textViewResourceId, objects); this.context = context; resource = textViewResourceId; array = objects; } //Phng thc xc nh View m Adapter hin th, y chnh l CustomViewGroup //Bt buc phi Override khi k tha t ArrayAdapter @Override public View getView(int position, View convertView, ViewGroup parent) { View workView = convertView; if (workView == null) { workView = new CustomViewGroup(getContext()); } //Ly v i tng Work hin ti final Work work = array.get(position); if (work != null) { TextView workContent = ((CustomViewGroup) workView).workContent; TextView timeContent = ((CustomViewGroup) workView).timeContent; CheckBox checkWork = ((CustomViewGroup) workView).cb; //Set s kin khi nh du vo checkbox trn list checkWork.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override

public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { work.setChecked(isChecked); } }); //Ly v ni dung cho TextView v CheckBox da vo i tng Work hin ti workContent.setText(work.getContent()); timeContent.setText(work.getTime()); checkWork.setChecked(work.isChecked()); } return workView; } } ListWorkAdapter s c s dng thay th cho ArrayAdapter c bind vi ListView. Thng thng ArrayAdapter ch cho hin th String bng TextView, nhng vi vic k tha v override phng thc getView, ta c th nh ngha li hin th cho cc thnh phn ca ListView.

B9: Vic cui cng cn lm l vit li Activity. Ti Example.java v chnh sa theo ni dung sau: M: package at.exam; import java.util.ArrayList; import import import import import import import import import import import import android.app.Activity; android.app.AlertDialog; android.content.DialogInterface; android.os.Bundle; android.view.Menu; android.view.MenuItem; android.view.View; android.view.View.OnClickListener; android.widget.ArrayAdapter; android.widget.Button; android.widget.EditText; android.widget.ListView;

public class Example extends Activity { //Cc hng dng cho to Option Menu private static final int DELETE_WORK = Menu.FIRST; private static final int ABOUT = Menu.FIRST + 2; ArrayList<Work> array; ListWorkAdapter arrayAdapter; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); array = new ArrayList<Work>(); arrayAdapter = new ListWorkAdapter(this,

R.layout.list, array); final EditText workEnter = (EditText) findViewById(R.id.work_enter); final EditText hourEdit = (EditText) findViewById(R.id.hour_edit); final EditText minuteEdit = (EditText) findViewById(R.id.minute_edit); final Button button = (Button) findViewById(R.id.button); //To list view cho danh sch cng vic final ListView list = (ListView) findViewById(R.id.list); list.setAdapter(arrayAdapter); OnClickListener add = new OnClickListener() { @Override public void onClick(View v) { if (workEnter.getText().toString().equals("") || hourEdit.getText().toString().equals("") || minuteEdit.getText().toString().equals("")) { AlertDialog.Builder builder = new AlertDialog.Builder(Example.this); builder.setTitle("Info missing"); builder.setMessage("Please enter all information of the work"); builder.setPositiveButton("Continue", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub } });

builder.show(); } else { String workContent = workEnter.getText().toString(); String timeContent = hourEdit.getText().toString() + ":" + minuteEdit.getText().toString(); Work work = new Work(workContent, timeContent); array.add(0, work); arrayAdapter.notifyDataSetChanged(); workEnter.setText(""); hourEdit.setText(""); minuteEdit.setText(""); } } }; button.setOnClickListener(add); } //To Option Menu public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); menu.add(0, DELETE_WORK, 0,"Delete" ).setIcon(android.R.drawable.ic_delete); menu.add(0, ABOUT, 0,"About" ).setIcon(android.R.drawable.ic_menu_info_details); return true; } //X l s kin khi cc option trong Option Menu c la chn public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) {

case DELETE_WORK: { deleteCheckedWork(); break; } case ABOUT: { AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("VietAndroid"); builder.setMessage("AUTHOR:" + "\n" + " Nguyen Anh Tuan" + "\n" + "SOURCE:" + "\n" + " diendan.vietandroid.com"); builder.setPositiveButton("Close", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { } }); builder.setIcon(android.R.drawable.ic_dialog_info); builder.show(); break; } } return true; } private void deleteCheckedWork() { if (array.size() > 0) { for (int i = 0; i < array.size(); i++) { if (i > array.size()) { break; } if (array.get(i).isChecked()) { array.remove(i); arrayAdapter.notifyDataSetChanged(); continue; } } }

} } OK. Vy l xong. Option Menu l menu n ch hin ra khi bn nhn nt Menu ca in thoi. Option Menu rt tin trong vic a ra cc ty chnh, ging nh khi bn nhn phm Esc khi ang chi game trn PC vy. Cc bn c th lu l thay v s dng ArrayList<String> nh trc mnh thay bng ArrayList<Work> v trong khi to i tng arrayAdapter th i s th 2 l R.layout.list thay v android.R.layout.simple_list_item_1, ngha l chng ta s dng layout do mnh t to thay v layout Android cung cp sn cho hin th cc thnh phn ca ListView. Nu chy th, cc bn c th thy khi ta nh du vo checkbox ca 1 thnh phn trong list, ri nhn Menu v chn delete th thnh phn s b g b khi danh sch.

Trong bi ny mnh s i su ni r v Intent, phn c bn v ng vai tr rt quan trng trong lp trnh ng dng Android. Khi nim v Intent:

Theo nh ngha ca Google, Intent l mt miu t v mt hot ng cn c thc hin. Cn ni mt cch n gin v d hiu hn, Intent l mt c cu cho php truyn thng ip gia cc thnh phn ca 1 ng dng v gia cc ng dng vi nhau. Cc thuc tnh ca Intent: - action: l hnh ng c thc hin, vd : ACTION_VIEW, ACTION_MAIN - data: l d liu s c x l trong action, thng c din t l mt Uri (Uniform Resource Identifier, tham kho http://en.wikipedia.org/wiki/Uniform...rce_Identifier hiu r thm chi tit). VD: ACTION_VIEW content://contacts/people/1 - Hin th thng tin v ngi vi m danh 1 ACTION_DIAL content://contacts/people/1 - Hin th mn hnh gi n ngi vi m danh 1 ACTION_DIAL tel:123 - Hin th mn hnh gi vi s gi l 123 Ngoi ra cn c 1 s thuc tnh m ta c th b sung vo Intent: - category: b sung thm thng tin cho action ca Intent. VD: CATEGORY_LAUNCHER thng bo s thm vo Launcher nh l mt ng dng

top-level - type: ch r kiu ca data - component: ch r thnh phn s nhn v x l intent. Khi thuc tnh ny c xc nh th cc thuc tnh khc s tr thnh thuc tnh ph. - extras: mang theo i tng Bundle cha cc gi tr b sung. VD: ACTION_MAIN v CATEGORY_HOME: tr v mn hnh Home ca Android (khi bm nt Home ca di ng) Phn loi Intent: Intent c chia lm 2 loi: - Explicit Intents: intent c xc nh thuc tnh component, ngha l ch r thnh phn s nhn v x l intent. Thng thng intent dng ny s khng b sung thm cc thuc tnh khc nh action, data. Explicit Intent thng c s dng khi chy cc activity trong cng 1 ng dng. - Implicit Intents: Intent khng ch r component x l, thay vo n b sung thng tin trong cc thuc tnh. Khi intent c gi i, h thng s da vo nhng thng tin ny quyt nh component no thch hp nht x l n. VD: ACTION_DIAL tel:123 thng thng s c h thng giao cho activity Phone Dialer mc nh ca Android x l. Mt s action thng s dng trong Intent: ACTION_ANSWER - m Activity x l cuc gi ti, thng l Phone Dialer ca Android ACTION_CALL - m 1 Phone Dialer (mc nh l PD ca Android) v ngay lp tc thc hin cuc gi da vo thng tin trong data URI ACTION_DELETE - m Activity cho php xa d liu m a ch ca n cha trong data URI ACTION_DIAL - m 1 Phone Dialer (mc nh l PD ca Android) v in thng tin ly t a ch cha trong data URI

ACTION_EDIT - m 1 Activity cho php chnh sa d liu m a ch ly t data URI ACTION_SEND - m 1 Activity cho php gi d liu ly t data URI, kiu ca d liu xc nh trong thuc tnh type ACTION_SENDTO - m 1 Activity cho php gi thng ip ti a ch ly t data URI ACTION_VIEW - action thng dng nht, khi chy activity thch hp hin th d liu trong data URI ACTION_MAIN - s dng khi chy 1 Activity

OK, l thuyt nh th l tm n. Gi chng ta s chuyn qua phn thc hnh hiu r cch s dng Intent. Nh nu trn, Intent chia lm 2 loi: explicit intent v implicit intent. Mi loi Intent s c cch ci t v s dng khc nhau. Using Explicit Intents Yu cu: Xy dng chng trnh gm 2 Activity. Activity1 l Activity chy ban u lc khi ng ng dng, cho php nhp vo 1 gi tr, cho php khi chy Activity2 v gi gi tr ny ti Activity2. Activity2 s nhn v hin th gi tr, ri li gi gi tr ny ti 1 BroadcastReceiver. C ch gi v khi chy Activity s dng thng qua Intent. B1: Khi to project: File -> New -> Android Project Project name: Explicit Intent Example Build Target: Chn Android 1.5 Application name: Explicit Intent Example Package name: at.exam Create Activity: Activity1 => Kch nt Finish. B2: To giao din cho Activity1 -> res\layout\main.xml chuyn tn thnh activity1_layout.xml M:

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/andro id" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Activity 1 - Send value" android:typeface="normal" android:textSize="14px" android:textStyle="bold" android:textColor="#cccccc" android:background="#333333" /> <EditText android:id="@+id/value_edit" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textSize="20px" android:gravity="center" android:lines="1" android:numeric="integer" /> <RelativeLayout android:layout_width="fill_parent" android:layout_height="fill_parent"> <Button android:id="@+id/send_button" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Send to Activity 2" android:layout_alignParentBottom="true" /> </RelativeLayout> </LinearLayout>

Layout cho Activity1 bao gm 1 LinearLayout cha 1 TextView, 1 EditText nhp gi tr ( gii hn kiu nhp l number), v 1 RelativeLayout c 1 Button khi chy Activity2. Mnh s dng RelaytiveLayout c th xp Button ny xung pha cui ca giao din.

B3: To giao din cho Activity2 -> Chut phi vo folder res\layout -> New -> Android XML File ->G tn l activity2_layout.xml M: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/andro id" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Activity 2 - Receive value" android:typeface="normal" android:textSize="14px" android:textStyle="bold" android:textColor="#cccccc" android:background="#333333" /> <EditText android:id="@+id/value_receive" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textSize="20px" android:gravity="center" android:lines="1" android:numeric="integer" android:enabled="false" /> <RelativeLayout android:layout_width="fill_parent" android:layout_height="fill_parent">

<Button android:id="@+id/call_button" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Call Broadcast Receiver" android:layout_alignParentBottom="true" /> </RelativeLayout> </LinearLayout> Layout ca Activity2 tng t nh Activity1, nhng Button by gi l gi BroadCast Receiver. Ngoi ra mnh dng EditText hin th value nhn c (do n c ci ng bao ngoi p hn TextView ^_^) nn khng cho php nhp gi tr vo EditText ny M: android:enabled="false"

B4:Sa li ni dung ca Activity1.java nh sau: M: package at.exam; import import import import import import import android.app.Activity; android.content.Intent; android.os.Bundle; android.view.View; android.view.View.OnClickListener; android.widget.Button; android.widget.EditText;

public class Activity1 extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity1_layout);

final EditText editValue = (EditText) findViewById(R.id.value_edit); final Button sendButton = (Button) findViewById(R.id.send_button); sendButton.setOnClickListener(new OnClickListener() { public void onClick(View v) { String valueString = editValue.getText().toString(); long value; if (valueString != null) { value = Long.parseLong(valueString); } else { value = 0; } //To 1 i tng Bundle gi i cng Intent Bundle sendBundle = new Bundle(); sendBundle.putLong("value", value); //To Intent khi chy Activity2 v gn sendBundble vo Intent Intent i = new Intent(Activity1.this, Activity2.class); i.putExtras(sendBundle); startActivity(i); //Gii phng Activity1 khi Activity Stack v ta s ko quay li n na finish(); } }); } }

B5: To mi 1 Class Activity2.java trong package at.exam -> chnh sa ni dung: M: package at.exam; import import import import import import import android.app.Activity; android.content.Intent; android.os.Bundle; android.view.View; android.view.View.OnClickListener; android.widget.Button; android.widget.EditText;

public class Activity2 extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity2_layout); final EditText receiveValueEdit = (EditText) findViewById(R.id.value_receive); final Button callReceiverButton = (Button) findViewById(R.id.call_button); //Ly v Bundle c gi km Intent ri ly ra gi tr Bundle receiveBundle = this.getIntent().getExtras(); final long receiveValue = receiveBundle.getLong("value"); receiveValueEdit.setText(String.valueOf(receiveValue)); callReceiverButton.setOnClickListener(new OnClickListener() { public void onClick(View v) { //Khi to 1 Intent gi ti BroadCast Receiver

//Gn gi tr vo Intent, ln ny ko cn Bundle na Intent i = new Intent(Activity2.this, Receiver.class); i.putExtra("new value", receiveValue - 10); sendBroadcast(i); } }); } }

B6: To BroadCast Receiver nhn Intent m Activity2 gi ti -> To 1 file Receiver.java trong at.exam -> Ni dung: M: package at.exam; import import import import android.content.BroadcastReceiver; android.content.Context; android.content.Intent; android.widget.Toast;

public class Receiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { long value = intent.getLongExtra("new value", -10) + 10; Toast toast = Toast.makeText(context, "Broadcast Receiver catch an Intent" + " \n" + "The value is stored in the Intent is " + String.valueOf(value), Toast.LENGTH_LONG); toast.show(); } } Code khng h kh hiu, v mnh cng add comment. Ch cn lu y l Toast l lp hin th mt thng bo n gin trong 1 khong thi gian c nh, v ko th thay i thi gian ny T_T (why???) ch c th chn gia LENGTH_SHORT vi LENGTH_LONG B7: B sung thm thng tin v component mi vo AndroidManifest.xml:

M: <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/andro id" package="at.exam" android:versionCode="1" android:versionName="1.0"> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".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=".Activity2"></activity> <receiver android:name=".Receiver"></receiver> </application> <uses-sdk android:minSdkVersion="3" /> </manifest>

xong s dng Explicit, gi n lt Implicit Intent. Trc khi i vo v d, hy do qua 1 cht kin thc v Intent Filter v vai tr ca n. Intent Filter l g Activity, Service v BroadCast Receiver s dng Intent Filter thng bo cho h thng bit cc dng Implicit Intent m n c th x l. Ni cch khc, Intent Filter l b lc Intent, ch cho nhng Intent c php i qua n. Intent Filter m t kh nng ca component nh ngha n. Khi h thng bt c 1 Implicit Intent (ch cha 1 s thng tin chung chung v action, data v category...), n s s dng nhng thng tin trong Intent ny, kim tra i chiu vi Intent Filter ca cc component cc ng dng, sau quyt nh khi chy ng dng no thch hp nht x l Intent bt c. Nu c 2 hay nhiu hn ng dng thch hp, ngi dng s c la chn ng dng mnh mun. VD: M: <activity android:name=".ExampleActivity" android:label="@string/activity_name"> <intent-filter> <action android:name="android.intent.action.SENDTO" /> <category android:name="android.intent.category.DEFAULT" /> <data android:scheme="sms" /> </intent-filter> </activity> Trn l 1 Activity vi b lc Intent cho php bt v x l cc Intent gi SMS. Hy lu t kha M: andoid:scheme

T kha ny cho bit protocol (lut) x l d liu trong URI. Ni 1 cch n gin th n l kiu ca d liu. 1 s kiu khc nh http, https, fpt, content...

Using Implicit Intent: Yu cu: Xy dng chng trnh nhp s v gi. Lu chng trnh ca mnh y ch xy dng n mc khi nhn nt Call ca di ng th s chy ng dng v hin th giao din cho php nhp s. Phn gi dnh cho ai yu thch tm hiu thm ^_^ Phn ny khng h kh nhng y mnh ch mun minh ha Implicit Intent nn s khng a vo. B1: Khi to project: File -> New -> Android Project Project name: Implicit Intent Example Build Target: Chn Android 1.5 Application name: Implicit Intent Example Package name: at.exam Create Activity: Example => Kch nt Finish. B2: y l bc quan trng nht v cng l bc c ngha duy nht trong c project ny, cc bc cn li ch l bc ru ria m mnh thm vo cho ci project n ra hn 1 cht. Bc ny s thm 1 b lc Intent Filter vo cho activity Example ca chng ta bt s kin nhn nt Call ca di ng -> Vo AndroidManifest.xml chnh sa nh sau: M: <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/andro id" package="at.exam" android:versionCode="1" android:versionName="1.0"> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".Example" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.CALL_BUTTON" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity> </application> <uses-sdk android:minSdkVersion="3" /> </manifest> Thc cht ch l b sung thm dng ch mnh nh du thi ^_^ B3: Xy dng giao din trong main.xml, bc ny ko quan trng, ch l ru ria cho activity c ci giao din: M: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/andro id" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TextView android:paddingTop="10px" android:id="@+id/number_display" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textSize="30px" android:gravity="center" android:lines="2" android:background="#ffffff" android:textColor="#000000" />

<TableLayout xmlns:android="http://schemas.android.com/apk/res/andro id" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TableRow android:gravity="center" android:paddingTop="30px" > <Button android:id="@+id/button1" android:layout_width="80px" android:layout_height="80px" android:gravity="center" android:text="1" android:textSize="25px" /> <Button android:id="@+id/button2" android:layout_width="80px" android:layout_height="80px" android:gravity="center" android:text="2" android:textSize="25px" /> <Button android:id="@+id/button3" android:layout_width="80px" android:layout_height="80px" android:gravity="center" android:text="3" android:textSize="25px" /> </TableRow> <TableRow android:gravity="center" > <Button

android:id="@+id/button4" android:layout_width="80px" android:layout_height="80px" android:gravity="center" android:text="4" android:textSize="25px" /> <Button android:id="@+id/button5" android:layout_width="80px" android:layout_height="80px" android:gravity="center" android:text="5" android:textSize="25px" /> <Button android:id="@+id/button6" android:layout_width="80px" android:layout_height="80px" android:gravity="center" android:text="6" android:textSize="25px" /> </TableRow> <TableRow android:gravity="center" > <Button android:id="@+id/button7" android:layout_width="80px" android:layout_height="80px" android:gravity="center" android:text="7" android:textSize="25px" /> <Button android:id="@+id/button8" android:layout_width="80px"

android:layout_height="80px" android:gravity="center" android:text="8" android:textSize="25px" /> <Button android:id="@+id/button9" android:layout_width="80px" android:layout_height="80px" android:gravity="center" android:text="9" android:textSize="25px" /> </TableRow> <TableRow android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="center" > <Button android:id="@+id/button_star" android:layout_width="80px" android:layout_height="80px" android:gravity="center" android:text="*" android:textSize="25px" /> <Button android:id="@+id/button0" android:layout_width="80px" android:layout_height="80px" android:gravity="center" android:text="0" android:textSize="25px" /> <Button android:id="@+id/button_clear" android:layout_width="80px" android:layout_height="80px" android:gravity="center"

android:text="Clear" android:textSize="25px" /> </TableRow> </TableLayout> </LinearLayout> LinearLayout cha 1 TextView hin th s nhn, 1 TableLayout c cc Button tng ng vi cc s v 1 Button clear cho TextView.

B4: Code code code... So tired... Tutorial is really take time. Chnh Example.java: M: package at.exam; import import import import import import import import android.app.Activity; android.os.Bundle; android.view.Menu; android.view.MenuItem; android.view.View; android.view.View.OnClickListener; android.widget.Button; android.widget.TextView;

public class Example extends Activity { Button button1, button2, button3; Button button4, button5, button6; Button button7, button8, button9; Button button0, buttonStar, buttonClear; TextView numberView; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); numberView = (TextView) findViewById(R.id.number_display); button1 = (Button) findViewById(R.id.button1); button2 = (Button) findViewById(R.id.button2); button3 = (Button) findViewById(R.id.button3);

button4 = (Button) findViewById(R.id.button4); button5 = (Button) findViewById(R.id.button5); button6 = (Button) findViewById(R.id.button6); button7 = (Button) findViewById(R.id.button7); button8 = (Button) findViewById(R.id.button8); button9 = (Button) findViewById(R.id.button9); button0 = (Button) findViewById(R.id.button0); buttonStar = (Button) findViewById(R.id.button_star); buttonClear = (Button) findViewById(R.id.button_clear); button1.setOnClickListener(this.appendString("1")); button2.setOnClickListener(this.appendString("2")); button3.setOnClickListener(this.appendString("3")); button4.setOnClickListener(this.appendString("4")); button5.setOnClickListener(this.appendString("5")); button6.setOnClickListener(this.appendString("6")); button7.setOnClickListener(this.appendString("7")); button8.setOnClickListener(this.appendString("8")); button9.setOnClickListener(this.appendString("9")); button0.setOnClickListener(this.appendString("0")); buttonStar.setOnClickListener(this.appendString("*")); buttonClear = (Button) findViewById(R.id.button_clear);

buttonClear.setOnClickListener(new OnClickListener() { public void onClick(View v) { numberView.setText(""); } }); } public OnClickListener appendString(final String number) { return new OnClickListener() { public void onClick(View arg0) { numberView.append(number); } }; } public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); menu.add(0, Menu.FIRST, 0,"Exit" ).setIcon(android.R.drawable.ic_delete); return true; } public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case Menu.FIRST: { finish(); break; } } return false; } } Code qu n gin, mnh cn ko thm comment na. Lu c 1 Option Menu ng Activity v cng l ng lun ng dng. B5: Time to test... Khi chy project, ri s dng Option Menu ca mnh (bm nt

Menu ca Emulator hoc di ng Android) thot khi chng trnh. Ok, sau khi chn Exit ta c th chc chn l ng dng c ng hon ton, activity ko cn tn ti trong stack ca Emulator/di ng na. Gi nhn nt Call ca Emulator/di ng, Tadaaaaaaaaa

Android Service 4 Tutorial trc cc bn c 1 lng kin thc kha kh, tip sau y mnh xin gii thiu 1 khi nim c bn na trong android, l Service Service l 1 trong 4 thnh phn chnh trong 1 ng dng Android ( Activity, Service, BroadcastReceiver, ContentProvider) thnh phn ny chy trong hu trng v lm nhng cng vic khng cn ti giao din nh chi nhc, download, x l tnh ton Mt Service c th c s dng theo 2 cch: - N c th c bt u v c cho php hot ng cho n khi mt ngi no dng n li hoc n t ngt. ch ny, n c bt u bng cch gi Context.startService() v dng bng lnh Context.stopService(). N c th t ngt bng lnh Service.stopSelf() hoc Service.stopSelfResult(). Ch cn mt lnh stopService() ngng Service li cho d lnh startService() c gi ra bao nhiu ln - Service c th c vn hnh theo nh c lp trnh vic s dng mt Interface m n nh ngha. Cc ngi dng thit lp mt ng truyn ti i tng Service v s dng ng kt ni thm nhp vo Service. Kt ni ny c thit lp bng cch gi lnh Context.bindService() v c ng li bng cch gi lnh Context.unbindService(). Nhiu ngi dng c th kt ni ti cng mt thit b. Nu Service vn cha c khi chy, lnh bindService() c th ty khi chy n. Hai ch ny th khng tch bit ton b. Bn c th kt ni vi mt Service m n c bt u vi lnh startService(). V d, mt Service nghe nhc ch nn c th c bt u bng cch gi lnh startService() cng

vi mt i tng Intent m nh dng c m nhc chi. Ch sau , c th l khi ngi s dng mun kim sot trnh chi nhc hoc bit thm thng tin v bi ht hin ti ang chi, th s c mt Activity to lp mt ng truyn ti Service bng cch gi bindService(). Trong trng hp nh th ny, stopService() s khng thc s ngng Service cho n khi lin kt cui cng c ng li. Ging nh mt Activity, mt Service cng c cc phng thc chu k thi gian m bn c th ci t kim sot nhng s thay i trong trng thi ca n. Nhng nhng phng thc ca Service th t hn l ca Activity ch c 3- v chng th c s dng rng ri, khng c bo v. void onCreate() void onStart(Intent intent) void onDestroy() Bng vic thc hin nhng phng thc ny, bn c th gim st 2 vng lp ca chu k thi gian ca mi Service Entire lifetime ca mt Service din ra gia thi gian onCreate() c gi ra v thi gian m onDestroy() tr li. Ging nh mt Activity, mt Service li tit hnh ci t ban u onCreate(), v gii phng tt c cc ti nguyn cn li onDestroy() V d, mt Service pht li nhc c th to ra mt lung v bt u chi nhc onCreate(),v sau lung chi nhc s dng li onCreate(), Active lifetime ca mt Service bt u bng mt lnh ti onStart(). yl phng thc c chuyn giao i tng Intent m c thng qua ti startService() Service m nhc s m i tng Intent quyt nh xem s chi loi nhc no v bt u pht nhc. Khng c callback tng ng no cho thi im Service ngng li khng c phng thc onStop() Cc phng thc onCreate() v onDestroy() c gi cho tt c cc Service d chng c c bt u bng Context.startService() hoc Context.bindService() hay khng. Tuy nhin th, onStart() ch c gi ra i vi cc Service bt u bng startService(). Nu mt Service cho php nhng Service khc kt ni vi n th s c thm cc phng thc callback dnh cho Service thc hin IBinder onBind(Intent intent) boolean onUnbind(Intent intent) void onRebind(Intent intent) Hm callback onBind() thng qua i tng Intent oc truyn n bindService v onUnbind() c chuyn giao i tng m c chuyn n. Nu Service

ang c ch nh (binding), onBind() quay tr li knh thng tin m ngi dng s dng tng tc vi Service. Phng thc onUnbind() c th yu cu onRebind() c gi nu mt ngi dng kt ni vi Service Biu di y minh ha cho cc phng thc callback ginh cho mt Service. Mc d, n phn tch cc Service c to ra thng qua startService vi cc Service m c to ra bng bindService(). Hy nh rng bt k Service no, cho d n c khi to nh th no th n vn c th cho php cc ngi dng kt ni ti n mt cch hiu qu nht, cho nn bt k Service no cng c th c ch nh thng qua cc cc phng thc onBind()v onUnbind()

Service LifeCycle

Cc bn c v hiu v Service trong Part 1. Tip theo mnh s lm 1 demo nh cc bn hiu r hn v Service. Demo to 1 service chi nhc v ngi s dng c th iu khin service ny. Giao din chng trnh :

u tin l to 1 giao din iu khin service chi nhc bng layout n gin : M: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/andro id" android:orientation="vertical" android:padding="4dip" android:gravity="center_horizontal" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="0" android:paddingBottom="4dip" android:text="@string/local_service_binding"/> <Button android:id="@+id/bind" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/bind_service"> <requestFocus /> </Button> <Button android:id="@+id/unbind" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/unbind_service"> </Button> <Button android:id="@+id/play" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/Play"> </Button> </LinearLayout>

To 1 class LocalService.java extend t Service v mt lp con LocalBinder tha k t lp Binder ( dng iu khin service ) M: public class LocalService extends Service { public class LocalBinder extends Binder { LocalService getService() { return LocalService.this; } } ..... } T np chng phng thc onBind bng cch tr li gi tr mBinder M: private final IBinder mBinder = new LocalBinder(); @Override public IBinder onBind(Intent intent) { return mBinder; } To mt i tng MediaPlayer chi nhc n gin ( s dng chi file abc.mp3 t trong folder res/raw ): M: MediaPlayer mMediaPlayer; public void startMp3Player() { mMediaPlayer = MediaPlayer.create(getApplicationContext(), R.raw.abc); mMediaPlayer.start(); } public void mp3Stop() { mMediaPlayer.stop(); mMediaPlayer.release(); }

lp LocalServiceBinding.java extend t lp Activity chng ta ch cn n i tng mConnection c nhim v gim st kt ni ca service chi nhc. M: private ServiceConnection mConnection = new ServiceConnection() { public void onServiceConnected(ComponentName className, IBinder service) { mBoundService = ((LocalService.LocalBinder)service).getService(); Toast.makeText(LocalServiceBinding.this, R.string.local_service_connected, Toast.LENGTH_SHORT).show(); } public void onServiceDisconnected(ComponentName className) { mBoundService = null; Toast.makeText(LocalServiceBinding.this, R.string.local_service_disconnected, Toast.LENGTH_SHORT).show(); } }; V x l s kin 3 button ( Bind, Unbin, Play/Stop ) M: private OnClickListener mBindListener = new OnClickListener() { public void onClick(View v) { bindService(new Intent(LocalServiceBinding.this, LocalService.class), mConnection, Context.BIND_AUTO_CREATE); mIsBound = true; mPlayButton.setEnabled(true); } }; private OnClickListener mPlayListener = new OnClickListener() {

public void onClick(View v) { if(mPlayButton.getText() == "Play") { mBoundService.startMp3Player(); mPlayButton.setText("Stop"); } else { mBoundService.mp3Stop(); mPlayButton.setText("Play"); } } }; private OnClickListener mUnbindListener = new OnClickListener() { public void onClick(View v) { if (mIsBound) { unbindService(mConnection); mIsBound = false; mPlayButton.setEnabled(false); } } };

Hng dn lp trnh c bn vi Android - Bi 6 Bi 6 : Android SQLite Database Trong bi hm nay mnh s gii thiu vi cc bn c s d liu trn Android SQLiteDatabase. 0. Gii thiu SQLite Database Mi ng dng u s dng d liu, d liu c th n gin hay i khi l c 1 cu trc. Trong Android th h c s d liu c s dng l SQLite Database, y l h thng m ngun m c s dng rng ri trong cc ng dng ( Mozilla

Firefox s dng SQLite lu tr cc d liu v cu hnh, iPhone cng s dng c s d liu l SQLite). Trong Android , c s d liu m bn to cho 1 ng dng th ch ng dng c quyn truy cp v s dng, cc ng dng khc th khng. Khi c to, c s d liu SQLite c cha trong th mc /data/data/<package_name>/databases . Tip theo mnh s gii thiu vi cc bn cch to v s dng c s d liu SQLite . Cch tt nht hiu l thuyt l thc hnh, cc bn c th to ngay 1 project trong workspace t tn l : SQLiteDemo. ng dng ny n gin ch to 1 c s d liu USER bao gm 2 trng ( id , name ) , ngoi ra c cc thao tc thm , c , sa , xa.

Cc bc thc hin vi CSDL: 1. To 1 CSDL ( thng thng ch cn lm 1 ln ) 2. M CSDL 3. Thm gi tr vo trong table 4. Truy vn. 5. ng CSDL 1. To c s d liu. u tin cc bn add 1 class DBAdapter x l tt c cc thao tc lin quan n CSDL. M: public static final String KEY_ID = "_id"; public static final String KEY_NAME = "name"; private DatabaseHelper mDbHelper; private SQLiteDatabase mDB; private static final String DATABASE_CREATE = "create table users (_id integer primary key autoincrement, " + "name text not null);"; private static final String DATABASE_NAME = "Database_Demo"; private static final String DATABASE_TABLE = "users"; private static final int DATABASE_VERSION = 2; private final Context mContext; To 1 lp bn trong DBAdapter c extend t lp SQLiteOpenHelper, override 2 phng thc onCreate() v onUpgrade() qun l vic to CSDL v version ca CSDL .

M: private static class DatabaseHelper extends SQLiteOpenHelper{ public DatabaseHelper(Context context, String name, CursorFactory factory, int version) { super(context, name, factory, version); // TODO Auto-generated constructor stub } @Override public void onCreate(SQLiteDatabase db) { // TODO Auto-generated method stub db.execSQL(DATABASE_CREATE); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // TODO Auto-generated method stub Log.i(TAG, "Upgrading DB"); db.execSQL("DROP TABLE IF EXISTS users"); onCreate(db); } } 2. M CSDL : M: public DBAdapter open() { mDbHelper = new DatabaseHelper(mContext, DATABASE_NAME, null, DATABASE_VERSION); mDB = mDbHelper.getWritableDatabase(); return this; } 3. Thm gi tr vo CSDL

M: public long createUser(String name){ ContentValues inititalValues = new ContentValues(); inititalValues.put(KEY_NAME, name); return mDB.insert(DATABASE_TABLE, null, inititalValues); } 4. Truy vn Bn c th get ton b data hoc c th get data theo ID ( tin cho vic chnh sa hay cp nht thng tin ca tng bn ghi). M: public Cursor getAllUsers(){ return mDB.query(DATABASE_TABLE, new String[] {KEY_ID, KEY_NAME}, null, null, null, null, null); } Cn rt nhiu cc thao tc nh sa, xa, update.... bn ghi, cc bn c th t pht trin. Tt c cc chc nng u c cung cp bi lp SQLiteDatabase, cc bn ch cn c th ha bng cc cu truy vn l c. 5. ng CSDL M: public void close(){ mDbHelper.close(); } 6. S dng CSDL test CSDL m bn va to, cc bn c th thm 1 vi dng code thm 1 user v hin th CSDL ln mn hnh thng qua lp Activity ban u: y mnh create 1 user thng qua cu lnh mDB.createUser("Username"); sau M: public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);

setContentView(R.layout.main); mDB = new DBAdapter(this); mDB.open(); mDB.createUser("Do Minh Thong"); getData(); } private void getData(){ mCursor = mDB.getAllUsers(); startManagingCursor(mCursor); String[] from = new String[]{DBAdapter.KEY_NAME}; int[] to = new int[] {R.id.text1}; SimpleCursorAdapter users = new SimpleCursorAdapter(this, R.layout.users_row, mCursor, from, to); setListAdapter(users); } Kt qu :

Sourcecode y : http://www.mediafire.com/?yzw2d1ijymo Bi ny l bi c s mnh vit tip Phn 7 : ContentProvider , cc bn ch theo di nh

Android Content Provider


Cui tun rnh ri hn, nh ra l phi tip tc vit Tutorial cho din n, rt nhiu cc Newbies ang cn Trc khi vo bi, cc bn down Sourcecode ca bi hc ti y Sourcecode ca bi hc bao gm 3 Project demo : ContentProviderDemo ContentProviderDemo1 ContentProviderDemo2 Mi Demo s gii quyt tng vn ca Tutorial. Cc bn c add ht vo workspace tin theo di. 1. Gii thiu Content Provider Content Provider l 1 trong 4 thnh phn c bn ca 1 ng dng Android thng c bao gm: 1. Activity 2. Service 3. Broadcast Receiver 4. Content Provider Mt Content Provider cung cp mt tp chi tit d liu ng dng n cc ng dng khc. Thng c s dng khi chng ta mun to c s d liu di dng public (cc ng dng khc c th truy xut ). D liu thng c lu tr file h thng, hoc trong mt SQLite database. n gin cc bn c th hnh dung nh : Danh b, Call log, cu hnh ci t...trn in thoi l d liu di dng Content Provider.

Content Provider hin thc mt tp phng thc chun m cc ng dng khc c th truy xut v lu tr d liu ca loi n iu khin. Tuy nhin, nhng ng dng khng th gi cc phng thc trc tip. Hn th chng dng lp Content Resolver v gi nhng phng thc . Mt Content Resolver c th giao tip n nhiu content provider; n cng tc vi cc provider qun l bt k giao tip bn trong lin quan. n gin hn, chng ta c th lm 1 ng dng nh ly tt c cc thng tin cu hnh trong my load ln listview. Cc bn c th chy Project ContentProviderDemo1 trong SourcecodeDemo.

Chng ta c th tm hiu s qua v code ca demo ny, rt ngn gn

M: ContentResolver cr = getContentResolver(); Cursor cursor = cr.query(Settings.System.CONTENT_URI, null, null, null, null); startManagingCursor(cursor); ListView listView = (ListView) findViewById(R.id.listView); String[] from = { Settings.System.NAME, Settings.System.VALUE }; int[] to = { R.id.textName, R.id.textValue }; SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.row, cursor, from, to); listView.setAdapter(adapter); Nh cc bn thy, ch cn 2 dng code n gin ly c con tr thao tc trn tp d liu cn ly: M: ContentResolver cr = getContentResolver(); Cursor cursor = cr.query(Settings.System.CONTENT_URI, null, null, null, null); Lp Content Resolver cung cp cc phng thc x l d liu thng qua cc Uri, mi Content Provider c 1 Uri c th , y Uri Settings.System.CONTENT_URI s tr li tp d liu l thng tin cu hnh ca thit b. Sau khi ly c con tr ti tp d liu, vic cn li n gin l bind data ln listview hin th:

M: startManagingCursor(cursor); ListView listView = (ListView) findViewById(R.id.listView); String[] from = { Settings.System.NAME, Settings.System.VALUE }; int[] to = { R.id.textName, R.id.textValue }; SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.row, cursor, from, to); listView.setAdapter(adapter)

2. To v s dng 1 Content Provider do ngi dng t nh ngha d hiu hn cc bn m Project ContentProviderDemo trong Sourcecode down v. Trong Project mnh to 1 Content Provider Books, mi bn ghi Book bao gm 2 trng : ID v Title. Sau y l cc bc to 1 Content Provider c bn ( c th l to ContentProvider Book) 1. To 1 class tha k lp ContentProvider M: public class BookProvider extends ContentProvider 2. nh ngha 1 bin Uri (public static final ) c gi CONTENT_URI. Cc xu ny lun c bt u bng content:// tip theo l ni dung ca m ContentProvider x l. Xu ny phi c c tnh l duy nht. M: public static final String PROVIDER_NAME = "com.vietandroid.provider.Books"; public static final Uri CONTENT_URI = Uri.parse("content://" + PROVIDER_NAME + "/books"); 3. Khai bo cc xu nh ngha cho tng thuc tnh tng ng vi cc ct gi tr t Cursor. M: public static final String _ID = "_id"; public static final String TITLE = "title"; 4. Chng ta cn to h thng cha d liu cho ContentProvider, c th cha di nhiu hnh thc : s dng XML, thng qua CSDL SQLite, hay thm ch l WebService. Trong Demo ny chng ta s dng cch ph bin nht l SQLite:

M: private private "Books"; private "titles"; private SQLiteDatabase bookDB; static final String DATABASE_NAME = static final String DATABASE_TABLE = static final int DATABASE_VERSION = 1;

5. nh ngha tn ca cc ct m chng ta s tr li gi tr cho cc clients.Nu chng ta ang s dng Database ContentProvider hay cc lp SQLiteOpenHelper, tn cc ct ny chnh l id ca cc ct trong c s d liu SQL. Trong trng hp ny, chng ta phi gp c ct c gi tr l s nguyn c gi _id nh ngha id ca mi bn ghi. Nu ang s dng c s d liu SQLite, n s l INTEGER PRIMARY KEY AUTOINCREMENT. Ty chn AUTOINCREMENT khng bt buc, c tc dng t ng tng ID ca mi bn ghi ln nu ngi dng khng nhp. Android cung cp SQLiteOpenHelper gip to v qun l cc phin bn ca c s d liu. M: private static final String DATABASE_CREATE = "create table " + DATABASE_TABLE + " (_id integer primary key autoincrement, " + "title text not null);"; private static class DatabaseHelper extends SQLiteOpenHelper { public DatabaseHelper(Context context) { super(context, DATABASE_NAME , null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL(DATABASE_CREATE);

} @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("DROP TABLE IF EXISTS titles"); onCreate(db); } } 6. Nu chng ta mun public cc d liu kiu byte nh bitmap th cc trng m cha d liu ny nn l mt xu vi 1 content://URI cho file . y chnh l lin kt cc ng dng khc c th truy cp v s dng d liu bitmap ny. 7. S dng Cursor thao tc trn tp d liu : query (), update(), insert(), delete().. C th gi phng thc ContentResolver.notifyChange() bitkhi no d liu c cp nht. Add Book M: @Override public Uri insert(Uri uri, ContentValues values) { long rowID = bookDB.insert(DATABASE_TABLE, "", values); if(rowID > 0) { Uri mUri = ContentUris.withAppendedId(CONTENT_URI, rowID); getContext().getContentResolver().notifyChange(mUr i, null); return mUri; } throw new SQLException("Failed to insert new row into " + uri); }

Get All Books M: @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { SQLiteQueryBuilder sqlBuilder = new SQLiteQueryBuilder(); sqlBuilder.setTables(DATABASE_TABLE); if(uriMatcher.match(uri) == BOOK_ID) sqlBuilder.appendWhere(_ID + "=" + uri.getPathSegments().get(1)); if(sortOrder == null || sortOrder == "") sortOrder = TITLE; Cursor c = sqlBuilder.query(bookDB, projection, selection, selectionArgs, null, null, sortOrder); c.setNotificationUri(getContext().getContentResolv er(), uri); return c; } } Mnh ch demo 2 chc nng l thm sch v ly ton b bn ghi trong CSDL , ngoi ra cc phng thc edit, sa , update, xa... cc bn c th t lm .

8. Khai bo Content Provider trong file AndroidManifest.xml M: <provider android:name = "BookProvider" android:authorities="com.vietandroid.provider.Book s" /> Nh vy chng ta to xong ContentProvider Book t nh ngha.

9. Test th thnh qu : Mi content Provider gn vi 1 Uri c th, nh trn th ContentProvider Book c Uri l: M: com.vietandroid.provider.Books/books test th , vn trong Project Demo ContentProviderDemo , cc bn c th thm 2 Button Add Book v View All Books vo . Giao din nh sau:

Chng ta s thm 1 Book vo CSDL thng qua URI ny: M: public void addBook(String title) { ContentValues values = new ContentValues(); values.put(BookProvider.TITLE, title); Uri uriInsert = getContentResolver().insert(BookProvider.CONTENT_URI, values); if(uriInsert != null) { Toast.makeText(this, "Book's added", Toast.LENGTH_SHORT).show(); } Log.d(getClass().getSimpleName(),uriInsert.toStrin g()); } Kt qu :

Truy vn ton b d liu Books c trong CSDL M: public void getAllBooks() { Uri uriGetListTitles = Uri.parse("content://com.vietandroid.provider.Books/boo ks"); Cursor c = managedQuery(uriGetListTitles, null, null, null, "title desc"); if(c.moveToFirst()){ do{ String bookRecord = "ID = " + c.getString(c.getColumnIndex(BookProvider._ID)) + " Title = " + c.getString(c.getColumnIndex(BookProvider.TITLE));

Toast.makeText(this, bookRecord , Toast.LENGTH_LONG).show(); }while(c.moveToNext()); } } Kt qu : [IMGhttp://i123.photobucket.com/albums/o286/firewall7845/VietAndroid/21.png[/IMG] 3. S dng d liu Content Provider t 1 ng dng bt k Bi 6 mnh cp v c s d liu SQLite Database, dng d liu ny khng public cho cc ng dng khc s dng, d liu ca ng dng no th ng dng s dng. 1 li th ca d liu di dng Content Provider l public, tt c cc ng dng u c th truy cp v s dng. Phn ny cc bn s dng ProjectDemo l ContentProviderDemo2 trong sourcecode i km ban u. Demo ny ch n gin l c li ton b d liu trong CSDL Books c to trong phn 2. Nh mnh ni trn, ch cn ly c Uri ca ContentProvider cn ly v cc tn ca cc trng d liu th chng ta c th truy vn c ht. Trong hm onCreate() cc bn thm vo: M: @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Uri uriGetListTitles = Uri.parse("content://com.vietandroid.provider.Books/boo ks"); Cursor c = managedQuery(uriGetListTitles, null, null, null, "title desc"); if(c != null) { if(c.moveToFirst()){ do{

String bookRecord = "ID = " + c.getString(c.getColumnIndex("_id")) + " Title = " + c.getString(c.getColumnIndex("title")); Toast.makeText(this, bookRecord , Toast.LENGTH_LONG).show(); }while(c.moveToNext()); } } else { Toast.makeText(this, "Database is emtpy", Toast.LENGTH_SHORT).show(); } } 2 trng d liu y c nh ngha trn l "_id" v "title". Phn truy vn vn nh vy. Kt qu :

You might also like