Beginning Android for Application - Chapter 8: Messaging

Sau khi ứng dụng của bạn được khởi chạy, điều thú vị tiếp theo mà bạn có thể thêm

vào đó là khả năng giao tiếp với thế giới bên ngoài. Bạn có thể muốn gửi một SMS đến một

mobile khác khi một sự kiện xảy ra( ví dụ như khi bạn đến một địa điểm cụ thể), hay khi bạn

truy xuất vào một dịch vụ web service ( như thời tiết ).

Trong chương này bạn sẽ học cách gửi và nhận SMS một cách tự động bên trong ứng

dụng Android của bạn. Bạn cũng sẽ tìm hiểu cách gọi ra Mail application từ Android app để

gửi e-mail đến người khác.

SMS Messaging

Thông thường bạn có thể gửi sms bằng điện thoại, nhưng cũng có những trường hợp

bạn có thể muốn tích hợp khả năng gửi sms vào phần mềm của bạn. Ví dụ như bạn muốn viết

một ứng dụng gửi SMS tại một thời điểm nào đó. Sẽ rất hữu dụng nếu bạn muốn theo dõi vị

trí của trẻ con. Bạn chỉ việc đơn giản đưa cho chúng thiết bị Android và gửi ra SMS chứa vị

trí của chúng mỗi 30 phút.

pdf21 trang | Chuyên mục: Android | Chia sẻ: dkS00TYs | Lượt xem: 2604 | Lượt tải: 2download
Tóm tắt nội dung Beginning Android for Application - Chapter 8: Messaging, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
 một thời điểm nào đó. Sẽ rất hữu dụng nếu bạn muốn theo dõi vị 
trí của trẻ con. Bạn chỉ việc đơn giản đưa cho chúng thiết bị Android và gửi ra SMS chứa vị 
trí của chúng mỗi 30 phút. 
Bây giờ chúng ta sẽ tìm hiểu cách gửi và nhận về SMS và test ngay trên thiết bị mô 
phỏng. 
Gửi SMS. 
Thangit14.blogspot.com Thangit14@gmail.com 
2 
Thangit14.blogspot.com Thangit14@gmail.com 
3 
Chú ý rằng khi bạn gửi SMS sử dụng SmsManager thì sms 
được gửi sẽ không xuất hiện trong phần tin nhắn của điện thoại. 
Có 5 tham số của sendTextMessage() 
- destinationAddtess: Phone number 
- scAddress: Service center address; bạn để null nếu để 
mặc định là SMSC 
- text: Nội dung của sms 
- sentIntent: Intent được gọi khi sms được gửi đi. 
- deliveryIntent: Intent được gọi khi tin nhắn được báo 
đã gửi thành công. 
Lấy Feedback sau khi đã gửi SMS 
Trong ví dụ trước bạn đã biết cách gửi tin nhắn, vậy làm cách nào bạn biết tin nhắn đã 
được gửi thành công? Để làm điều sso bạn cần tạo ra 2 PendingIntent object để lắng nghe 
trạng thái của quá trình gửi SMS. Đó chính là 2 tham số trong method sendTextMessage(). 
Thangit14.blogspot.com Thangit14@gmail.com 
4 
Thangit14.blogspot.com Thangit14@gmail.com 
5 
Ở đây, ta đã tạo ra 2 PendingIntent object trong method onCreate(). 2 PendingIntent 
object này sẽ được sử dụng để gửi broadcasts khi một SMS gửi đi “SMS_SENT” và hồi đáp 
“SMS_DELIVERED”. 
Trong phương thức onResume(), bạn tạo và đăng kí 2 BroadcastReceivers. Chúng sẽ 
lắng nghe intent được match với “SMS_SENT” và “SMS_DELIVERED” (được fire bởi 
SmsManager khi message được gửi và hồi đáp.) 
Khi tạo một BroadcastReceiver bạn override onReceive() method và lấy ra result code 
để so sánh. 
Sau đó 2 PendingIntent object được truyền vào method sendTextMessage() 
Cuối cùng, trong phương thức onPause() bạn unregister 2 BroadcastReceivers object. 
Chú ý: Khi bạn test trên máy mô phỏng, chỉ có sentPI PendingIntent object được 
fired mà deliveredPI sẽ không được fired. 
Gửi SMS sử dụng Intent. 
Sử dụng SmsManager class, bạn có thể gửi SMS từ ứng dụng của bạn mà không cần 
đến ứng dụng Messaging của điện thoại. Tuy nhiên, trong vài trường hợp sẽ đơn giản hơn 
nhiều nếu bạn sử dụng Messaging của điện thoại và để chúng gửi sms cho bạn. 
Để kích hoạt built-in Messaging app trong ứng dụng của bạn, bạn có thẻ sử dụng 
Intent object cùng với MIME type “vnd.android-dir/mms-sms” 
Thangit14.blogspot.com Thangit14@gmail.com 
6 
Và bạn có thể gửi đến nhiều số điện thoại: 
Note: Chú ý, nếu bạn sử dụng method để gọi Messaging 
application, sẽ không cần thêm permission SEND_SMS trong 
AndroidManifest.xml . 
Nhận về SMS Messages 
Bên cạnh gửi SMS từ Android applications, bạn có thể nhận về SMS từ ứng dụng sử 
dụng BroadcastReceiver object. Điều này là rất hữu dụng khi bạn muốn ứng dụng của bạn 
thực hiện một action khi một sms chắc chắn được nhận về. Ví dụ, bạn có thể muốn lưu giữ vị 
trí của điện thoại khi nó bị mất. Trong trường hợp đó, bạn có thể viết một ứng dụng cho phép 
tự động lắng nghe một tin nhắn SMS chứa những đoạn mã bí mật. Một khi tin nhắn đã được 
nhận, điện thoại sẽ gửi một SMS chứa vị trí của nó đến người đã gửi tin nhắn đến. 
Thangit14.blogspot.com Thangit14@gmail.com 
7 
Thangit14.blogspot.com Thangit14@gmail.com 
8 
Để lắng nghe một sms tới, bạn tạo ra một BroadcastReceiver class. Lớp này sẽ cho 
phép ứng dụng của bạn nhần về intent được gửi bởi ứng dụng khác, sử dụng sendBroadcast(). 
Về bản chất, nó cho phép ứng dụng của bạn xử lý những event xảy ra bởi ứng dụng khác. Khi 
một intent được nhận, method onReceive(), vì thế bạn cần override nó. 
Thangit14.blogspot.com Thangit14@gmail.com 
9 
Sms message được chứa trong Intent object như là Bundle object. Chú ý rằng, mỗi 
Sms message được nhận sẽ gọi ra một onReceive() method. Nếu thiết bị của bạn nhận về 5 
sms thì method onReceive() sẽ được gọi 5 lần. 
Mỗi SMS được lưu trữ trong một Object array trong PDU format. Nếu SMS dài ít hơn 
160 kí tự, thì mảng sẽ có một phần tử. Nếu một SMS mà chứa nhiều hơn 160 kí tự thì SMS 
đó sẽ được chia nhỏ thành nhiều message nhỏ và được lưu trữ thành nhiều phần tử trong 
array. 
Để lấy về nội dung của mỗi message, bạn sử dụng method static createFromPdu() 
trong SmsMessage class. Số điện thoại gửi đi sẽ được gọi ra bằng method 
getOriginatingAddress(). Vì thế, nếu bạn muốn gửi đi một tin nhắn tự động trả lời đến người 
gửi, method này sẽ lấy ra số điện thoại của người gửi. Để lấy nị dung của tin nhắn, bạn sử 
dụng method getMessageBody(). 
Một đặc điểm rất hay của BroadcastReceiver đó là ứng dụng của bạn sẽ tiếp tục lắng 
nghe những sms tới ngay cả khi nó không được chạy; miễn là app được cài đặt trên thiết bị, 
bất kì sms nào được gửi đến đều được nhận ra bởi ứng dụng của bạn. 
Ứng dụng chặn tin nhắn đến 
Trong phần trước bạn cần chú ý rằng, mỗi lần bạn gửi một SMS đến máy áo( hoặc 
điện thoại), cả ứng dụng của bạn và buit-in application (phần gửi tin nhắn của điện thoại) đều 
được nhận nó. Vì khi một SMS được nhận, tất cả ứng dụng trên Android đều bắt được sự 
kiện có tin nhắn đến. Đôi khí, đó không phải là điều mà bạn muốn. Ví dụ như bạn chỉ muốn 
ứng dụng của bạn nhận được tin nhắn, mà ko cho người dùng biết. Điều này rất hữu dụng, 
đặc biệt là khi bạn muốn làm một app theo dõi. 
Giải pháp rất đơn giản. Để ngăn ngừa một tin nhắn đến được đưa vào buit-in Message 
app, thì ứng dụng của bạn cần phải xử lý tin nhắn trước khi Meessage app có cơ hội để làm 
điều đó. Để làm điều đó bạn chỉnh sửa trong file AndroiManifest.xml: 
Bạn hãy set priority một giá trị cao. Với quyền ưu tiên cao như vậy, ứng dụng của bạn 
sẽ được thực hiện trước, bạn có thể quyết định xem làm gì với tin nhắn đó. Để ngăn ngừa tin 
nhắn đến các ứng dụng khác, bạn chỉ cần gọi method abortBroadcast() trong 
BroadcastReceiver class. 
Chú ý: Khi làm như vậy thì tất cả các tin nhắn đến đều bị chặn và không bao giờ quay 
lại trong buit-in Messaging app nữa. 
Thangit14.blogspot.com Thangit14@gmail.com 
10 
Updating một Activity từ BroadcastReceiver 
Trong phần trước, bạn đã biết sử dụng BroadcastReceiver để lắng nghe sự kiện có tin 
nhắn đến và hiển thị qua Toast class. Thông thường bạn sẽ muốn gửi SMS trở về main 
activity. Ví dụ bạn muốn hiển thị tin nhắn trong một TextView. 
Thangit14.blogspot.com Thangit14@gmail.com 
11 
Thangit14.blogspot.com Thangit14@gmail.com 
12 
Thangit14.blogspot.com Thangit14@gmail.com 
13 
Thangit14.blogspot.com Thangit14@gmail.com 
14 
Thangit14.blogspot.com Thangit14@gmail.com 
15 
Bạn chỉnh sửa file SMSReceiver để khi nhận về một sms, nó sẽ truyền đi một intent 
object khác để tất cả các app lắng nghe intent này có thể nhận biết ( Bạn sẽ tạo trong activity 
tiếp theo). 
Trong activity chính, bạn tạo ra một BroadcastReceiver object để lắng nghe bradcast 
intents: 
Thangit14.blogspot.com Thangit14@gmail.com 
16 
Bạn cần tạo ra một IntentFilter object để bạn có thể lắng nghe một intent nhất định. 
Trong trường hợp này là intent “SMS_RECEIVED_ACTION” 
Cuối cùng, bạn đăng kí BroadcastReceiver trong onResume và unregister trong 
onPause() event. 
Điều này có nghĩa là TextView sẽ hiển thị tin nhắn chỉ khi activity đang chạy trên 
màn hình, nếu nó được đưa vào back stack mà có tin nhắn đến thì Textview sẽ ko đc cập 
nhật. 
Invoking Activity từ BroadcastReceiver. 
Trong ví dụ trước, bạn đã nhận một SMS và hiển thị nó trong activity. Tuy nhiên, 
trong một số trường hợp activity của bạn có thể nằm trong background khi tin nhắn được gửi 
đến. Trong trường hợp đó, bạn cần đưa activity sang trạng thái foreground. 
Thangit14.blogspot.com Thangit14@gmail.com 
17 
Thangit14.blogspot.com Thangit14@gmail.com 
18 
Thangit14.blogspot.com Thangit14@gmail.com 
19 
Để đảm bảo rằng Textview vẫn được cập nhật ngay cả khi activity của bạn đang nằm 
trong trạng thái background thì bạn cần register một BroadcastReceiver tại method 
onCreate() và unregister ở method onDestroy(). 
Phương thức startActivity() khởi chạy activity và đưa nó vào trạng thái foreground. 
Chú ý rằng bạn cần set flag Intent.FLAG_ACTIVITY_NEW_TASK bởi vì method 
startActivity() được gọi bên ngoài activity context và cần request flag đó. 
Cuối cùng bạn cũng phải chỉnh sửa file AndroidManifest.xml thành singleTask. Điều 
này sẽ tránh việc có nhiều activity được khởi chạy nếu có nhiều sms message được gửi đến. 
Chú ý rằng trong ví dụ này, nếu activity ở trạng thái background ( nhấn nút Home) thì 
textview sẽ được cập nhật, còn nếu activity ở trạng thái foreground( nhấn nút Back để destroy 
activity đó) thì activity cũng được khởi chạy nhưng textview sẽ không được cập nhật. Lý do 
là khi sms được gửi tới rồi mới kích hoạt activity và đăng kí lắng nghe sự kiện. Vì thế, do 
chưa đăng kí lắng nghe sự kiện khi sms được gửi tới nên sự kiện ấy không được bắt bởi 
activity. 
Caveats and Warning 
Trong khi tính năng gửi và nhận sms trong Android rất thú vị và giúp xây dựng những 
ứng dụng phức tạp, nhưng nó cũng có cái giá của mình. Khi người dùng nhấn vào cài đặt ứng 
dụng, người đó được coi là đã cấp quyền cho phần mềm gửi và nhận sms. Điều này là rất 
Thangit14.blogspot.com Thangit14@gmail.com 
20 
nguy hiểm, ví dụ như sau khi ứng dụng được cài đặt nó có thể gửi và nhận tin nhắn sms mà 
người dùng không biết đến. 
Ngoài ra ứng dụng cũng có thể tìm kiếm các thông tin quan trọng trong sms và có thể 
có được vị trí địa lý của bạn và theo dõi bạn. Tất cả những công việc này đều có thể thực hiện 
một cách dễ dàng mà người dùng không hề biết. Vì thế người dùng nên tránh việc cài đặt 
những ứng dụng không rõ ràng, hay đến từ những nguồn không tin cậy. 
Gửi Email 
Cũng giống như sms, Android cũng hỗ trợ email. Gmail/Email application trên 
Android cho phép bạn thiết lập một email account sử dụng POP3 hoặc IMAP. Bên cạnh việc 
gửi và nhận emails sử dụng Gmail/Email app, bạn có thể gử email một cách tự động. 
Thangit14.blogspot.com Thangit14@gmail.com 
21 
 Tổng kết 

File đính kèm:

  • pdfBeginning Android for Application - Chapter 8 Messaging.pdf