Xem mẫu
- 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
- - 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ã:
- 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ã:
- 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
- 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
- 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
- B7: B sung thêm thông tin v component m i vào AndroidManifest.xml:
Mã:
www.Beenvn.com – T sách online
- www.Beenvn.com – T sách online
- www.Beenvn.com – T sách online
- ðã 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
-
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
-
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ã:
- android:layout_height="80px"
android:gravity="center"
android:text="3"
android:textSize="25px"
>
- 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
- 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
- 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
- www.Beenvn.com – T sách online
- www.Beenvn.com – T sách online
- www.Beenvn.com – T sách online
- K t thúc bài 4
www.Beenvn.com – T sách online
nguon tai.lieu . vn