4.3.1. Vấn đề
Ứng dụng A muốn gọi thực hiện một thao tác nào đó của ứng dụng B, nghĩa
là muốn gọi một Activity của ứng dụng B vào thời điểm Runtime. Ví dụ như từ ứng dụng Contact gọi chức năng gởi tin nhắn của ứng dụng SMS.
4.3.2. Giải pháp
Trong tập tin cấu hình AndroidManifesh.XML của ứng dụng SMS, khai báo
activity Create_Message để các ứng dụng khác có thể gọi thực hiện activity này.
<activity android:name=".Create_message"> <intent-filter> <action android:name="android.intent.action.Create_Message"/> <category android:name="android.intent.category.DEFAULT"/> </intent-filter> </activity>
Dĩ nhiên Activity Create_message phải được khái báo trong ứng dụng để
các Activity trong cùng ứng dụng có thể gọi nó. Ngoài ra, để các ứng dụng khác có thể truy cập vào nó, ta phải khai báo thêm tag <intent-filter> trong tag <activity>, tag này gồm hai tag con <action> và <category>.
Trong cấu hình trên, tag <action> là quan trọng nhất, phải khái báo thuộc tính android:name của tag này có giá trị duy nhất trong hệ thống Android.. Với khai báo như trên, thì ứng dụng sẽ đăng ký với hệ thống Android một Action có tên là : android.intent.action.Create_Message, để bất cứ ứng dụng nào cũng có thể
gọi thực hiện Activity Create_Message.
Trong các ứng dụng khác, để thực hiện activity Create_Message, ta thực hiện
như sau :
// khởi tạo một Intent với tên Activity đã đăng ký trong hệ thống
Intent i = new Intent("android.intent.action.Create_Message");
// gọi thực hiện activity này với phương thức startSubAntivity()
startSubActivity(I, 0);
4.3.3. Chi tiết giải pháp
Cấu hình trong tập tin AndroidManifesh.XML của ứng dụng SMS
<activity android:name=".Create_message"> <intent-filter> <action android:name="android.intent.action.Create_Message"/> <category android:name="android.intent.category.DEFAULT"/> </intent-filter> </activity>
Khởi tao Intent và gọi thực hiện Activity Create_Message
// khởi tao intent để gọi thực hiện activity
Intent i = new Intent("android.intent.action.Create_Message");
//khởi tạo đối tượng Bundle để truyển đối số cho activity Create_Message
Bundle wr = new Bundle();
wr.putString(“phoneNumber”,”0913141322”); // số điện thoại cần gởi tin nhắn
i.putExtras(wr);
//gọi thực hiện Activity
4.4. Kỹ thuật xử lý cuộc gọi 4.4.1. Vấn đề
Trong ứng dụng Contact, cho phép gọi nhanh một số điện thoại có trong Contact.
4.4.2. Giải pháp
Thao tác thực hiện một cuộc gọi được xây dựng sẵn trong hệ thống Android.
Hình 4.2: Màn hình gọi điện thoại
Chúng ta chỉ cần gọi thực hiện Activity này từ trong ứng dụng Contact. Như
vậy, quay lại vấn đế gọi thực hiện activity giữa hai ứng dụng khác nhau. Ở đấy, đặt biệt, activity dùng để gọi điện thoại được đăng ký sẵn trong Android với ACTION là : android.intent.action.CALL và khi gọi thực hiện activity này thì phải cho biết nó thực hiện với Contact Item nào trong Contact. Ngoài ra, cần phải đăng ký ứng dụng được phép gọi điện thoại với hệ thống trong file cấu hình AndroidManifesh.XML
4.4.3. Chi tiết giải pháp
Để thực hiện một cuộc gọi, lần lược thức hiện các bước sau :
Đăng ký ứng dụng được gọi điện thoại với hệ thống Android trong file
AndroidManifest.xml <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="khtn.gpcontact"> <uses-permission android:name="android.permission.CALL_PHONE" /> <application android:icon="@drawable/icon"> ... </application> </manifest>
Xác định ID của số điện thoại cần gọi , ví dụ ID=5
Khởi tạo Intent với Action là Intent.CALL_ACTION và dữ liệu là chuỗi URI: content://contacts/phones/5
Gọi thực hiện Intent với phương thức startSubActivity của lớp Activity.
Uri data = Uri.parse(Phones.CONTENT_URI.toString() + "/" +5) Intent is = new Intent(Intent.CALL_ACTION,data);
startSubActivity(is, 0);
Ngoài ra còn có thể thực hiện cuộc gọi dựa vào ID của Contact Item, khi đó,
mặc nhiên sẽ gọi thực hiện cuộc gọi tương ứng với số điện thoại chính của
Contact Item đó. Ví dụ, gọi điện thoại với Contact Item có ID =5
Uri data = Uri.parse(People.CONTENT_URI.toString() + "/" +5) Intent is = new Intent(Intent.CALL_ACTION,data);
startSubActivity(is, 0);