Sau đây là ví dụ Using Explicit Intents trong quá trình học lập trình android


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ã:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/andro
id"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Activity 1 - Send value"
android:typeface="normal"
android:textSize="14px"
android:textStyle="bold"
android:textColor="#cccccc"
android:background="#333333"
/>
<EditText
android:id="@+id/value_edit"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="20px"
android:gravity="center"
android:lines="1"
android:numeric="integer"
/>
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<Button
android:id="@+id/send_button"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Send to Activity 2"
android:layout_alignParentBottom="true"
/>
</RelativeLayout>
</LinearLayout>
Layout cho Activity1 bao 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ã:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/andro
id"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Activity 2 - Receive value"
android:typeface="normal"
android:textSize="14px"
android:textStyle="bold"
android:textColor="#cccccc"
android:background="#333333"
/>
<EditText
android:id="@+id/value_receive"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="20px"
android:gravity="center"
android:lines="1"
android:numeric="integer"
android:enabled="false"
/>
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<Button
android:id="@+id/call_button"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Call Broadcast Receiver"
android:layout_alignParentBottom="true"
/>
</RelativeLayout>
</LinearLayout>

Layout 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);
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);
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 fileReceiver.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ữaLENGTH_SHORT với LENGTH_LONGB7: Bổ sung thêm thông tin về component mới vào AndroidManifest.xml:Mã:
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/andro
id"
package="at.exam"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon"
android:label="@string/app_name">
<activity android:name=".Activity1"
android:label="@string/app_name">
<intent-filter>
<action
android:name="android.intent.action.MAIN" />
<category
android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".Activity2"></activity>
<receiver
android:name=".Receiver"></receiver>
</application>
<uses-sdk android:minSdkVersion="3" />
</manifest>


0 nhận xét:

Đăng nhận xét

 
Top