Xem mẫu

  1. Hư ng d n l p trình cơ b n v i Android - Bài 4 http://diendan.vietandroid.com/cac-bai-hoc-co-kem-ma-nguon/831-huong- Reflink: dan-lap-trinh-co-ban-voi-android-bai-4-a.html List tutorial Bài 0 - Cài ñ t và s d ng Android v i Eclipse Bài 1 - Cơ b n Android Bài 2 - Xây d ng giao di n ñơn gi n Bài 3 - ViewGroup và Custom Adapter Bài 4 - Intent và Broadcast Receiver Bài 5 - Service Bài 6 - SQLite Bài 7 - Content Provider Sorry m i ngư i vì quá lâu m i ra ñư c bài ti p theo. M t ph n vì công vi c b n b u, m t ph n vì lư i + ng i ^_^ mà ñã tr h n v i anh em. Mình ñoán nh ng newbie ñ c bài c a mình t 1, 2, 3 gi ñã s p thành pro h t r i, vì v y ñành dành bài này cho các newbie m i. Trong bài này mình s ñi sâu nói rõ v Intent, ph n cơ b n và ñóng vai trò r t quan tr ng trong l p trình ng d ng Android. Khái ni m v Intent: Theo ñ nh nghĩa c a Google, Intent là m t miêu t v m t ho t ñ ng c n ñư c th c hi n. Còn nói m t cách ñơn gi n và d hi u hơn, Intent là m t cơ c u cho phép truy n thông ñi p gi a các thành ph n c a 1 ng d ng và gi a các ng d ng v i nhau. Các thu c tính c a Intent: - action: là hành ñ ng ñư c th c hi n, vd : ACTION_VIEW, ACTION_MAIN - data: là d li u s ñư c x lý trong action, thư ng ñư c di n t là m t Uri (Uniform Resource Identifier, tham kh ohttp://en.wikipedia.org/wiki/Uniform...rce_Identifier ñ hi u rõ thêm chi ti t). VD: ACTION_VIEW content://contacts/people/1 - Hi n th thông tin v ngư i v i mã danh 1 ACTION_DIAL content://contacts/people/1 - Hi n th màn hình g i ñ n ngư i v i mã danh 1 ACTION_DIAL tel:123 - Hi n th màn hình g i v i s g i là 123 Ngoài ra còn có 1 s thu c tính mà ta có th b sung vào Intent: - category: b sung thêm thông tin cho action c a Intent. VD: CATEGORY_LAUNCHER thông báo s thêm vào Launcher như là m t ng d ng top-level - type: ch rõ ki u c a data - component: ch rõ thành ph n s nh n và x lý intent. Khi thu c tính này ñư c xác ñ nh thì các thu c tính khác s tr thành thu c tính ph . - extras: mang theo ñ i tư ng Bundle ch a các giá tr b sung. VD: ACTION_MAIN và CATEGORY_HOME: tr v màn hình Home c a Android (khi b m nút Home c a di ñ ng) Phân lo i Intent: Intent ñư c chia làm 2 lo i: www.Beenvn.com – T sách online
  2. - Explicit Intents: intent ñã ñư c xác ñ nh thu c tính component, nghĩa là ñã ch rõ thành ph n s nh n và x lý intent. Thông thư ng intent d ng này s không b sung thêm các thu c tính khác như action, data. Explicit Intent thương ñư c s d ng ñ kh i ch y các activity trong cùng 1 ng d ng. - Implicit Intents: Intent không ch rõ component x lý, thay vào ñó nó b sung thông tin trong các thu c tính. Khi intent ñư c g i ñi, h th ng s d a vào nh ng thông tin này ñ quy t ñ nh component nào thích h p nh t ñ x lý nó. VD: ACTION_DIAL tel:123 thông thư ng s ñư c h th ng giao cho activity Phone Dialer m c ñ nh c a Android x lý. M t s action thư ng s d ng trong Intent: ACTION_ANSWER - m Activity ñ x lý cu c g i t i, thư ng là Phone Dialer c a Android ACTION_CALL - m 1 Phone Dialer (m c ñ nh là PD c a Android) và ngay l p t c th c hi n cu c g i d a vào thông tin trong data URI ACTION_DELETE - m Activity cho phép xóa d li u mà ñ a ch c a nó ch a trong data URI ACTION_DIAL - m 1 Phone Dialer (m c ñ nh là PD c a Android) và ñi n thông tin l y t ñ a ch ch a trong data URI ACTION_EDIT - m 1 Activity cho phép ch nh s a d li u mà ñ a ch l y t data URI ACTION_SEND - m 1 Activity cho phép g i d li u l y t data URI, ki u c a d li u xác ñ nh trong thu c tính type ACTION_SENDTO - m 1 Activity cho phép g i thông ñi p t i ñ a ch l y t data URI ACTION_VIEW - action thông d ng nh t, kh i ch y activity thích h p ñ hi n th d li u trong data URI ACTION_MAIN - s d ng ñ kh i ch y 1 Activity OK, lý thuy t như th là ñã t m n. Gi chúng ta s chuy n qua ph n th c hành ñ hi u rõ cách s d ng Intent. Như ñã nêu trên, Intent chia làm 2 lo i: explicit intent và implicit intent. M i lo i Intent s có cách cài ñ t và s d ng khác nhau. Using Explicit Intents Yêu c u: Xây d ng chương trình g m 2 Activity. Activity1 là Activity ch y ban ñ u lúc kh i ñ ng ng d ng, cho phép nh p vào 1 giá tr , cho phép kh i ch y Activity2 và g i giá tr này t i Activity2. Activity2 s nh n và hi n th giá tr , r i l i g i giá tr này t i 1 BroadcastReceiver. Cơ ch g i và kh i ch y Activity s d ng thông qua Intent. B1: Kh i t o project: File -> New -> Android Project Project name: Explicit Intent Example Build Target: Ch n Android 1.5 Application name: Explicit Intent Example Package name: at.exam Create Activity: Activity1 => Kích nút Finish. B2: T o giao di n cho Activity1 -> res\layout\main.xml chuy n tên thành activity1_layout.xml Mã:
  3. android:layout_height="fill_parent" > Layout cho Activity1 bao g m 1 LinearLayout ch a 1 TextView, 1 EditText ñ nh p giá tr (ñã gi i h n ki u nh p là number), và 1 RelativeLayout có 1 Button ñ kh i ch y Activity2. Mình s d ng RelaytiveLayout ñ có th x p Button này xu ng phía cu i c a giao di n. B3: T o giao di n cho Activity2 -> Chu t ph i vào folder res\layout -> New -> Android XML File ->Gõ tên là activity2_layout.xml Mã:
  4. android:background="#333333" > Layout c a Activity2 tương t như Activity1, nhưng Button bây gi là ñ g i BroadCast Receiver. Ngoài ra mình dùng EditText ñ hi n th value nh n ñư c (do nó có cái ñư ng bao ngoài ñ p hơn TextView ^_^) nên không cho phép nh p giá tr vào EditText này Mã: android:enabled="false" __________________ B4:S a l i n i dung c a 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); www.Beenvn.com – T sách online
  5. 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; } //T o 1 ñ i tư ng Bundle ñ g i ñi cùng Intent Bundle sendBundle = new Bundle(); sendBundle.putLong("value", value); //T o Intent ñ kh i ch y Activity2 và g n sendBundble vào Intent Intent i = new Intent(Activity1.this, Activity2.class); i.putExtras(sendBundle); startActivity(i); //Gi i phóng Activity1 kh i Activity Stack vì ta s ko quay l i nó n a finish(); } }); } } B5: T o m i 1 Class Activity2.java trong package at.exam -> ch nh s a n i 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); www.Beenvn.com – T sách online
  6. final EditText receiveValueEdit = (EditText) findViewById(R.id.value_receive); final Button callReceiverButton = (Button) findViewById(R.id.call_button); //L y v Bundle ñư c g i kèm Intent r i l y 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) { //Kh i t o 1 Intent ñ g i t i BroadCast Receiver //G n giá tr vào Intent, l n này ko c n Bundle n a Intent i = new Intent(Activity2.this, Receiver.class); i.putExtra("new value", receiveValue - 10); sendBroadcast(i); } }); } } B6: T o BroadCast Receiver ñ nh n Intent mà Activity2 g i t i -> T o 1 file Receiver.java trong at.exam -> N i 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 không h khó hi u, và mình cũng ñã add comment. Ch c n lưu ý ñây là Toast là l p ñ hi n th m t thông báo ñơn gi n trong 1 kho ng th i gian c ñ nh, và ko th thay ñ i th i gian này T_T (why???) ch có th ch n gi a LENGTH_SHORT v i LENGTH_LONG www.Beenvn.com – T sách online
  7. B7: B sung thêm thông tin v component m i vào AndroidManifest.xml: Mã: www.Beenvn.com – T sách online
  8. www.Beenvn.com – T sách online
  9. www.Beenvn.com – T sách online
  10. ðã xong s d ng Explicit, gi ñ n lư t Implicit Intent. Trư c khi ñi vào ví d , hãy d o qua 1 chút ki n th c v Intent Filter và vai trò c a nó. Intent Filter là gì Activity, Service và BroadCast Receiver s d ng Intent Filter ñ thông báo cho h th ng bi t các d ng Implicit Intent mà nó có th x lý. Nói cách khác, Intent Filter là b l c Intent, ch cho nh ng Intent ñư c phép ñi qua nó. Intent Filter mô t kh năng c a component ñ nh nghĩa nó. Khi h th ng b t ñư c 1 Implicit Intent (ch ch a 1 s thông tin chung chung v action, data và category...), nó s s d ng nh ng thông tin trong Intent này, ki m tra ñ i chi u v i Intent Filter c a các component các ng d ng, sau ñó quy t ñ nh kh i ch y ng d ng nào thích h p nh t ñ x lý Intent b t ñư c. N u có 2 hay nhi u hơn ng d ng thích h p, ngư i dùng s ñư c l a ch n ng d ng mình mu n. VD: Mã: www.Beenvn.com – T sách online
  11. Trên là 1 Activity v i b l c Intent cho phép b t và x lý các Intent g i SMS. Hãy lưu ý t khóa Mã: andoid:scheme T khóa này cho bi t protocol (lu t) ñ x lý d li u trong URI. Nói 1 cách ñơn gi n thì nó là ki u c a d li u. 1 s ki u khác như http, https, fpt, content... Using Implicit Intent: Yêu c u: Xây d ng chương trình nh p s và g i. Lưu ý chương trình c a mình ñây ch xây d ng ñ n m c khi nh n nút Call c a di ñ ng thì s ch y ng d ng và hi n th giao di n cho phép nh p s . Ph n g i dành cho ai yêu thích tìm hi u thêm ^_^ Ph n này không h khó nhưng ñây mình ch mu n minh h a Implicit Intent nên s không ñưa vào. B1: Kh i t o project: File -> New -> Android Project Project name: Implicit Intent Example Build Target: Ch n Android 1.5 Application name: Implicit Intent Example Package name: at.exam Create Activity: Example => Kích nút Finish. B2: ðây là bư c quan tr ng nh t và cũng là bư c có ý nghĩa duy nh t trong c project này, các bư c còn l i ch là bư c râu ria mà mình thêm vào cho cái project nó ra h n 1 chút. Bư c này s thêm 1 b l c Intent Filter vào cho activity Example c a chúng ta ñ b t s ki n nh n nút Call c a di ñ ng -> Vào AndroidManifest.xml ch nh s a như sau: Mã: www.Beenvn.com – T sách online
  12. Th c ch t ch là b sung thêm dòng ch ñ mình ñánh d u thôi ^_^ B3: Xây d ng giao di n trong main.xml, bư c này ko quan tr ng, ch là râu ria cho activity có cái giao di n: Mã:
  13. android:layout_height="80px" android:gravity="center" android:text="3" android:textSize="25px" >
  14. android:id="@+id/button9" android:layout_width="80px" android:layout_height="80px" android:gravity="center" android:text="9" android:textSize="25px" > LinearLayout ch a 1 TextView ñ hi n th s nh n, 1 TableLayout có các Button tương ng v i các s và 1 Button ñ clear cho TextView. B4: Code code code... So tired... Tutorial is really take time. Ch nh 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; www.Beenvn.com – T sách online
  15. 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) { www.Beenvn.com – T sách online
  16. 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 gi n, mình còn ko thèm comment n a. Lưu ý có 1 Option Menu ñ ñóng Activity và cũng là ñóng luôn ng d ng. B5: Time to test... Kh i ch y project, r i s d ng Option Menu c a mình (b m nút Menu c a Emulator ho c di ñ ng Android) ñ thoát kh i chương trình. Ok, sau khi ch n Exit ta có th ch c ch n là ng d ng ñã ñư c ñóng hoàn toàn, activity ko còn t n t i trong stack c a Emulator/di ñ ng n a. Gi nh n nút Call c a Emulator/di ñ ng, Tadaaaaaaaaa www.Beenvn.com – T sách online
  17. www.Beenvn.com – T sách online
  18. www.Beenvn.com – T sách online
  19. www.Beenvn.com – T sách online
  20. K t thúc bài 4 www.Beenvn.com – T sách online
nguon tai.lieu . vn