Download pdf - Android Viet

Transcript
  • 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:

    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:

    Hello World, Example!

    Example 1

    Enter the work

    here

    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:

    #ff3300

    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 android.app.Activity;

    import android.os.Bundle;

    import android.view.KeyEvent;

    import android.view.View;

    import android.view.View.OnKeyListener;

    import android.widget.EditText;

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

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

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

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

  • android:padding="5px"

    />

  • android:gravity="center"

    android:text="@string/button_content"

    />

    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:

    Example 2

    Enter the work

    here

    Hour

    Minute

    Add work

    B4: To mi colors.xml trong values vi ni dung: M:

  • #cccccc

    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 android.app.Activity;

    import android.app.AlertDialog;

    import android.content.DialogInterface;

    import android.os.Bundle;

    import android.view.View;

    import android.view.View.OnClickListener;

    import android.widget.ArrayAdapter;

    import android.widget.Button;

    import android.widget.EditText;

    import 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 arrayWork = new

    ArrayList();

    //Adapter dng kt ni mng vi List View

    final ArrayAdapter arrayAdapter = new

    ArrayAdapter(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:

  • android:layout_height="wrap_content"

    android:text=""

    android:paddingTop="45px"

    android:paddingRight="10px"

    />

    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:

  • />

    B4: To file colors.xml trong res\value: M:

  • #ffffff

    #cccccc

    #cccccc

    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:

    Example 3

    Enter the work

    here

    Hour

    Minute

    Add work

    B6: Time to coding. i ti src\at.exam to mt class mi l CustomViewGroup vi ni dung sau: M:

    package at.exam;

    import android.content.Context;

    import android.view.LayoutInflater;

    import android.widget.CheckBox;

    import android.widget.LinearLayout;

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

    ArrayList array;

    int resource;

    Context context;

  • public ListWorkAdapter(Context context, int

    textViewResourceId,

    ArrayList 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 android.app.Activity;

    import android.app.AlertDialog;

    import android.content.DialogInterface;

    import android.os.Bundle;

    import android.view.Menu;

    import android.view.MenuItem;

    import android.view.View;

    import android.view.View.OnClickListener;

    import android.widget.ArrayAdapter;

    import android.widget.Button;

    import android.widget.EditText;

    import 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 array;

    ListWorkAdapter arrayAdapter;

    @Override

    public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.main);

    array = new ArrayList();

    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 nh trc mnh thay

    bng ArrayList 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:

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

  • 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 android.app.Activity;

    import android.content.Intent;

    import android.os.Bundle;

    import android.view.View;

    import android.view.View.OnClickListener;

    import android.widget.Button;

    import 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 android.app.Activity;

    import android.content.Intent;

    import android.os.Bundle;

    import android.view.View;

    import android.view.View.OnClickListener;

    import android.widget.Button;

    import 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 android.content.BroadcastReceiver;

    import android.content.Context;

    import android.content.Intent;

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

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

    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:

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

  • android:id="@+id/button4"

    android:layout_width="80px"

    android:layout_height="80px"

    android:gravity="center"

    android:text="4"

    android:textSize="25px"

    />

  • android:layout_height="80px"

    android:gravity="center"

    android:text="8"

    android:textSize="25px"

    />

  • android:text="Clear"

    android:textSize="25px"

    />

    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 android.app.Activity;

    import android.os.Bundle;

    import android.view.Menu;

    import android.view.MenuItem;

    import android.view.View;

    import android.view.View.OnClickListener;

    import android.widget.Button;

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

  • 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//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 SQLiteDatabase bookDB;

    private static final String DATABASE_NAME =

    "Books";

    private static final String DATABASE_TABLE =

    "titles";

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

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

    1.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 :

  • Trong bi ny mnh s trnh by tm tt nhng kin thc c bn nht v Intent trong lp trnh Android, cch truyn nhn thng tin qua Intent v minh ha bng mt v d n gin. Hy vng s gip cc bn mi lm quen vi Android nm bt c mt cch nhanh chng.

    I- Intent l g?

    -L mt cu trc d liu m t cch thc, i tng thc hin ca mt Activity -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. iu ny cng ging nh vic di chuyn qua li gia cc Forms trong lp trnh Windows Form

    (Ch : trong hnh v trn Activity B ch tr v kt qu khi cn thit. VD : gi s Activity A nhc ngi dng chn nh profile ; Activity B lit k cc nh trong sdcard v cho php ngi dng chn nh. Khi cp code+result l cn thit v c th l 0:null tc cancel hoc 1:nh 20 tc chn nh 20)

    bit thm v Activity xem ti y.

  • -Intent l mt khi nim then cht v c trng ca Android Platform. C th ni lp trnh Android chnh l lp trnh intent-base.

    II-Intent cha nhng d liu g ?

    -Intent v c bn l mt cu trc d liu, c m t trong lp android.content.Intent

    -Cc thuc tnh ca mt i tng Intent :

    -Cc action nh ngha sn :

  • y l nhng hng String c nh ngha sn trong lp Intent. i km vi n l cc Activity hay Application c xy dng sn s c triu gi mi khi Intent tng ng c gi (tt nhin khi c cung cp ng data). VD: +Dial mt s phone:

    PHP Code:

    Intent dialIntent = new Intent(Intent.ACTION_DIAL, Uri.

    parse("tel:123456"));

    startActivity(dialIntent);

    +Hin danh b in thoi:

  • PHP Code:

    Intent listContacts = new Intent(Intent.ACTION_VIEW,

    Uri.pa

    rse(content://contacts/people/);

    startActivity(listContacts);

    n y chc bn s t hi nhng chui data trong hm Uri.parse(data) c ngha l g? l nh dng d liu tng ng vi mi action (chun RFC 3986). Mt khi bn s dng built-in action th bn phi cung cp data cho n theo nh dng ny. Bng di y lit k mt s nh dng v action tng ng c nh ngha sn:

    -T nh ngha action

    V nguyn tc bn 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, bn 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 bn c th c triu gi t mt app khc. V d bn vit mt app c activity p ng intent ACTION_SEND v chia s mt bc nh ln trang web ca bn (ging nh ta lm vi Facebook, Flickr etc.) Khi c th app ca bn s l mt la chn chia s nh ca ngi dng in thoi.

  • III-S dng Intent nh th no?

    -Cc hm thc thi Activity

    -Intent tng minh thc thi Activity

    Nh trnh by phn II, 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(C