Android – Giao tiếp với ứng dụng khác – Phần 2


Được đăng vào ngày 16/05/2016 | 0 bình luận
Android – Giao tiếp với ứng dụng khác – Phần 2
Đánh giá bài viết

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.

Screenshot_2016-05-16-13-10-18

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.

Screenshot_2016-05-16-13-10-33







Trả lời

Thư điện tử của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *