Khi chúng ta chạy một Activity
khác thì chúng ta không những có thể chạy được Activity
đó mà còn có thể nhận những giá trị trả về của Activity
đó, chẳng hạn như chúng ta mở Camera và nhận về ảnh chụp từ Camera đó, hay mở danh sách số điện thoại liên lạc và lấy về danh sách đó…v.v. Để làm được điều này thì chúng ta sẽ cần phải sử dụng đến phương thức startActivityForResult()
thay vì dùng phương thức startActivity(),
khi người dùng hoàn tất công việc và tắt Activity
thì dữ liệu sẽ được gửi về qua phương thức onActivityResult(),
chúng ta phải override phương thức này.
Ví dụ
Chúng ta sẽ viết ứng dụng lấy số điện thoại của một item trong danh sách liên lạc.
Đầu tiên chúng ta thiết kế main layout đơn giản như thế này:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.phocode.MainActivity"> <TextView android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </RelativeLayout>
Layout này chỉ có một TextView
làm nhiệm vụ hiển thị số điện thoại sau khi đã chọn xong.
Tiếp theo là file Activity:
package com.phocode; import android.content.Intent; import android.database.Cursor; import android.net.Uri; import android.provider.ContactsContract; import android.app.Activity; import android.os.Bundle; import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.TextView; public class MainActivity extends Activity { private static final int PICK_CONTACT_REQUEST = 1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Intent pickContactIntent = new Intent(Intent.ACTION_PICK, Uri.parse("content://contacts")); pickContactIntent.setType(ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE); startActivityForResult(pickContactIntent, PICK_CONTACT_REQUEST); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if(requestCode == PICK_CONTACT_REQUEST) if(resultCode == RESULT_OK) { Uri contactUri = data.getData(); String[] projection = {ContactsContract.CommonDataKinds.Phone.NUMBER}; Cursor cursor = getContentResolver().query(contactUri, projection, null, null, null); cursor.moveToFirst(); TextView tv = (TextView)findViewById(R.id.textView); int column = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER); String number = cursor.getString(column); tv.setText(number); } } }
Ở đây chúng ta mở một Activity
mới bằng phương thức startActivityForResult().
private static final int PICK_CONTACT_REQUEST = 1; ... startActivityForResult(pickContactIntent, PICK_CONTACT_REQUEST);
Phương thức startActivityForResult()
ngoài việc nhận một đối tượng Intent
còn nhận thêm một tham số là một số nguyên, tham số này sẽ được gán vào đối tượng Intent
và có tác dụng giống như một ID dành cho mỗi đối tượng Intent
vậy, bởi vì nhiều khi ứng dụng của chúng ta có thể có nhiều đối tượng Intent
khác nhau nên chúng ta cần một ID để phân biệt các đối tượng Intent.
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { ... }
Khi người dùng chọn xong một số điện thoại liên lạc và màn hình Activity
của danh sách liên lạc tắt đi thì ứng dụng sẽ gọi đến phương thức onActivityResult()
và truyền vào các tham số là các kết quả trả về của Activity
đó, ở đây có 3 tham số là requestCode
tức là ID mà chúng ta đã khai báo ở trên, resultCode
là kết quả của hành động mà người dùng đã thực hiện (có 2 giá trị là RESULT_OK
tức là người dùng chọn thành công và RESULT_CANCELED
tức là thất bại, chẳng hạn như người dùng bấm nút lùi, tắt máy…v.v), tham số data
là dữ liệu mà người dùng đã chọn.
if(requestCode == PICK_CONTACT_REQUEST) if(resultCode == RESULT_OK) { Uri contactUri = data.getData(); String[] projection = {ContactsContract.CommonDataKinds.Phone.NUMBER}; Cursor cursor = getContentResolver().query(contactUri, projection, null, null, null); cursor.moveToFirst(); TextView tv = (TextView)findViewById(R.id.textView); int column = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER); String number = cursor.getString(column); tv.setText(number); }
Để có thể xử lý dữ liệu trả về thì bạn phải biết định dạng của dữ liệu đó. Chẳng hạn như định dạng của một danh sách liên lạc sẽ khác với định dạng của một tấm ảnh trả về bởi camera. Trong đoạn code trên chúng ta kiểm tra ID và kết quả trả về rồi lấy dữ liệu gán vào TextView.
Việc lấy dữ liệu được thực hiện thông qua các ContentProvider
, chúng ta sẽ tìm hiểu về chủ đề này trong các bài sau.
Chạy ứng dụng, ban đầu ứng dụng sẽ chạy Activity
danh sách liên lạc, khi chúng click vào một số điện thoại nào thì số điện thoại đó sẽ được gửi tới Activity
chính của chúng ta.