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.
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:
- Beginning Android for Application - Chapter 8 Messaging.pdf