PDF

Mở rộng ứng dụng Android bằng dịch vụ đám mây IBM
Push cho Bluemix
Dùng thông báo Push để gửi nội dung liên quan đến các thiết bị di
động
Belinda Vennam
Kỹ sư phần mềm
IBM
21 08 2014
(Xuất bản lần đầu tiên vào ngày 01 04
2015)
Salim Zeitouni
Kỹ sư phần mềm
IBM
Paul Mariduena (https://www.ibm.com/
developerworks/community/profiles/html/
profileView.do?key=1f068cb1-8ce6-4b1d-bbddb832ec6f436e&lang=en&tabid=dwAboutMe)
Kỹ sư phần mềm
IBM
Xây dựng ứng dụng Android bằng các dịch vụ IBM Push cho Bluemix và Node.js có sẵn trên
IBM Bluemix. Loạt hướng dẫn gồm nhiều phần này sẽ hướng dẫn lần lượt từng phần, mỗi phần
sẽ giới thiệu đến bạn các dịch vụ mới. Hướng dẫn này gồm các mã mẫu và chỉ dẫn đầy đủ để tạo
ứng dụng BlueList Android. Bạn có thể áp dụng những gì đã học để tích hợp các dịch vụ IBM
Mobile Data cho Bluemix, Node.js và IBM Push cho Bluemix vào ứng dụng của riêng bạn.
Có thể bạn đã biết đến một số lợi ích của Bluemix, một nền tảng mở của IBM dùng để phát triển
và triển khai các ứng dụng web và di động. Nhiều dịch vụ tạo sẵn trong Giải pháp di động trong
Bluemix đã giúp việc xây dựng và nâng cao ứng dụng trở nên dễ dàng.
Các hướng dẫn trong loạt bài này sẽ trình bày cho bạn cách thêm các dịch vụ trên nền tảng đám
mây vào ứng dụng của bạn. Trong hướng dẫn này, chúng ta sẽ mở rộng một ứng dụng Android bằng
cách dùng dịch vụ IBM Push cho Bluemix .
ĐỌC: Bắt đầu với Push
© Copyright IBM Corporation 2015
Mở rộng ứng dụng Android bằng dịch vụ đám mây IBM Push cho
Bluemix
Nhẫn hiệu đăng ký
Trang 1 của 17
developerWorks®
ibm.com/developerWorks/vn/
Như đã giới thiệu trong hướng dẫn trước đó của loạt bài này, ứng dụng BlueList là một ứng dụng
Android đơn giản. Trong hướng dẫn này, chúng ta sẽ thêm IBM Push cho Bluemix gọi từ ứng dụng
trên nền Node.js vào ứng dụng BlueList, để các thông báo sẽ được gửi khi một danh sách được cập
nhật, và danh sách được cập nhật trên tất cả thiết bị khi một trong các thiết bị được cập nhật danh
sách theo một cách nào đó.
“ Với các dịch vụ miễn phí trên Bluemix, bạn có thể bắt đầu
viết và mở rộng các ứng dụng của riêng mình một cách
nhanh chóng! ”
Lấy mã bluelist-mobiledata (v1)
Lấy mã bluelist-push (v2)
Trong hướng dẫn trước đó của loạt bài này, chúng ta đã thêm IBM Mobile Data cho Bluemix (Dữ
liệu di động), trong đó các mục trong một danh sách là ổn định. Bây giờ chúng ta sẽ thêm khả năng
gửi thông báo Push từ ứng dụng Node.js trên nền tảng đám mây mỗi khi danh sách được cập nhật.
Nếu bạn bỏ qua hướng dẫn trước đó trong loạt hướng dẫn này, bạn có thể bắt đầu với mã bluelistmobiledata(v1) , nhưng bạn cần phải thực hiện các tác vụ trong phần "Bổ sung" trước khi tiếp tục
với các bước yêu cầu để thêm IBM Push cho Bluemix (Push) và ứng dụng Node.js trên nền tảng
đám mây. Nếu bạn đã theo dõi hướng dẫn trước đó trong loạt hướng dẫn này, bạn có thể bắt đầu
với mã hiện có và làm theo các bước dưới đây để thêm Push và ứng dụng đám mây Node.js. Nếu
bạn muốn đi trước bằng cách tải xuống mã bluelist-push(v2), bạn chỉ cần thực hiện vài bước để lấy
ứng dụng BlueList với dịch vụ Mobile Data và Push hoạt động trên ứng dụng đám mây Node.js. Mã
bluelist-push(v2) gồm cả các thay đổi được thực hiện ở mã bluelist-mobiledata(v1) trong hướng dẫn
này.
Bạn cần có gì cho ứng dụng của mình
• Làm quen với hướng dẫn trước đó của loạt bài này, trong đó chúng ta đã thêm dịch vụ IBM
Mobile Data cho Bluemix vào một ứng dụng Android. Ứng dụng đó là khởi điểm cho hướng
dẫn này.
• Làm quen với phát triển Android.
• Một môi trường phát triển Android. Chúng tôi dùng Eclipse với ADT, nhưng bạn có thể thoải
mái lựa chọn ưu tiên của bạn.
Lưu ý: Nếu quyết định dùng Android Studio, bạn có thể bỏ qua các bước Thêm dịch vụ Google
Play vào dự án của bạn và Thêm các JAR của IBM Push và IBM CloudCode Client SDK vào
dự án của bạn vì tập tin gradle.build được cấp trong thư mục gốc Android sẽ kéo vào các phụ
thuộc yêu cầu. Hãy kiểm tra nó, làm quen với mã xây dựng Gradle và bỏ chú thích các phụ
thuộc yêu cầu. Bạn cũng sẽ cần phải tải xuống Gradle.zip và trích xuất nội dung vào thư mục
tùy chọn. Khi Android Studio nhắc bạn về GRADLE_HOME, hãy dùng đường dẫn mà bạn đã
trích xuất tập tin .zip đến, nơi có thư mục bin.
• Làm quen với git để tải xuống mã bluelist-mobiledata(v1) và mã ứng dụng Node.js.
• Mã bluelist-mobiledata(v1) (nhấp vào nút phía trên) hoặc mã hiện có của bạn từ hướng dẫn
trước đó trong loạt hướng dẫn này.
• Ứng dụng Node.js nằm trong thư mục bluelist-push-node của dự án bluelist-push.
Mở rộng ứng dụng Android bằng dịch vụ đám mây IBM Push cho
Bluemix
Trang 2 của 17
ibm.com/developerWorks/vn/
developerWorks®
• Một ID người gửi GCM và khóa API từ Google. Tìm hiểu cách để lấy khóa này trong Hướng
dẫn của Google hoặc trong hướng dẫn của chúng tôi.
Lưu ý: Bạn cần có một tài khoản Gmail để thực hiện tác vụ này.
Bổ sung: Nếu bạn bỏ qua hướng dẫn trước đó trong loạt hướng dẫn này
1. Nếu chưa có, hãy tải xuống mã bluelist-mobiledata(v1) (nhấp vào nút phía trên).
2. Xem Bước 1. Tạo ứng dụng đám mây di động trên Bluemix trong hướng dẫn trước đó
của loạt hướng dẫn này. Thực hiện các bước từ 1.1 đến 1.10. Các bước này sẽ hướng dẫn
bạn từ việc đăng ký vào Bluemix và tạo một ứng dụng (BlueList) trên Bluemix, tải xuống
Android SDK, cập nhật tập tin bluelist.properties bằng ID ứng dụng của bạn, thêm ibmbaas.jar,
ibmdata.jar và ibmfilesync.jar vào thư mục thư viện của bạn.
3. Trước khi thêm dịch vụ IBM Push cho Bluemix, hãy chạy mã trong trình mô phỏng của bạn để
xác minh rằng môi trường phát triển Android đã được thiết lập đúng. Bạn phải có thể thực hiện
Bước 7. Chạy ứng dụng và Bước 8. Xem dữ liệu của bạn trong đám mây từ hướng dẫn trước
đó trong loạt hướng dẫn này.
Nếu ứng dụng chạy thành công, bạn đã bổ sung đầy đủ và sẵn sàng thêm thông báo Push và
ứng dụng trên nền tảng đám mây Node.js!
Trước khi bắt đầu: Lấy số sự án Google API Project Number và khóa
GCM API cần thiết cho Push
Lấy số dự án Google API Project Number và khóa GCM API
1. Mở tài khoản Google Developers Console.
2. Nhấp CREATE PROJECT, nhập tên dự án và nhấp Create.
3. Sao chép số dự án ở đầu trang. Đây là ID người gửi GCM của bạn (số dự án Google API
Project Number). Sau này bạn sẽ cần đến nó!
4. Nhấp APIs & auth ở bên trái trang.
5. BẬT Google Cloud Messaging for Android.
6. Dưới APIs & auth, nhấp Credentials.
7. Nhấp CREATE NEW KEY dưới phần truy cập API chung.
8. Nhấp Server key.
9. Nhấp Create.
10. Sao chép khóa API từ phần truy cập API chung. Đây là token xác thực người gửi (khóa GCM
API) của bạn. Sau này bạn sẽ cần đến nó!
Thêm Dịch vụ Google Play vào dự án của bạn (Bỏ qua bước này nếu dùng
Android Studio)
1. Mở Eclipse và chọn Window > Android SDK Manager.
2. Cuộn xuống dưới cùng và chọn Google Play services dưới Extras:
Mở rộng ứng dụng Android bằng dịch vụ đám mây IBM Push cho
Bluemix
Trang 3 của 17
developerWorks®
ibm.com/developerWorks/vn/
3.
Nhấp Install 1 package... và chấp nhận giấy phép.
4. Sau khi cài đặt thành công, hãy nhập dự án hiện đang nằm trong hệ thống tập tin của bạn
tại <Android_SDK_Location>\extras\google\google_play_services\libproject\google-playservices_lib vào vùng làm việc Eclipse. Để thực hiện, chọn File > Import, và sau đó chọn
Android > Existing Android Code into Workspace, và duyệt đến dự án google-play-
services_lib.
Mở rộng ứng dụng Android bằng dịch vụ đám mây IBM Push cho
Bluemix
Trang 4 của 17
ibm.com/developerWorks/vn/
developerWorks®
5. Sau khi nhập thành công google-play-services_lib vào vùng làm việc, cần đánh dấu nó là
Dự án thư viện Android. Để thực hiện, mở Properties của dự án và chọn ô chọn Is Library:
6. Kế tiếp, dự án của bạn cần tham chiếu dự án thư viện mới. Để thêm tham chiếu vào dự án thư
viện Android google-play-services_lib, hãy làm theo các bước sau:
a. Đảm bảo rằng cả thư viện dự án và dự án ứng dụng phụ thuộc vào nó đều nằm trong vùng
làm việc của bạn. Nếu thiếu một trong các dự án, hãy nhập nó vào vùng làm việc của bạn.
b. Trong Package Explorer, nhấp phải dự án phụ thuộc và chọn Properties.
c. Trong cửa sổ Properties, chọn nhóm thuộc tính Android ở bên trái, và xác định thuộc
tính Library ở bên phải.
d. Nhấp Add để mở hộp thoại Chọn dự án.
e. Từ danh sách các dự án thư viện có sẵn, chọn dự án google-play-services_lib và nhấp
OK.
f. Khi hộp thoại đóng, nhấp Apply trong cửa sổ Properties.
g. Nhấp OK để đóng cửa sổ Properties.
Mở rộng ứng dụng Android bằng dịch vụ đám mây IBM Push cho
Bluemix
Trang 5 của 17
developerWorks®
ibm.com/developerWorks/vn/
7. Thêm tham chiếu vào phiên bản google-play-services tại AndroidManifest.xml của ứng dụng
làm tập con đầu tiên của phần tử <application> .
<meta-data
android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />
8. Điều này sẽ gây ra lỗi biên dịch, và bạn có thể sửa lỗi bằng cách sao chép tập tin nằm ở
google-play-services_lib/res/values/version.xml vào thư mục res/values của ứng dụng.
9. Cuối cùng, sao chép tập tin android-support-v4.jar vào thư mục thư viện của dự án. Có thể tìm
thấy sao lưu JAR tại <Android_SDK_Location>/extras/android/support/v4
Thêm các JAR IBM Push và IBM CloudCode client SDK vào dự án của bạn (bỏ
qua bước này nếu dùng Android Studio)
1. Xác định vị trí Android SDK mà bạn đã tải xuống ở Bước 1.7 trong hướng dẫn trước đó.
Mở rộng ứng dụng Android bằng dịch vụ đám mây IBM Push cho
Bluemix
Trang 6 của 17
ibm.com/developerWorks/vn/
developerWorks®
2. Sao chép tập tin ibmcloudcode.jar và ibmpush.jar vào thư mục thư viện của dự án.
Bây giờ bạn phải có 6 tập tin jar sau đây trong thư mục thư viện (và một trong "Android
Dependencies"):
Bước 1. Thêm số dự án Google API Project Number và khóa GCM API
vào ứng dụng của bạn trong Bluemix
1. Đăng nhập Bluemix.
2. Giả sử bạn đã hoàn tất các bước trong hướng dẫn trước đó hoặc các bước trong phần "Bổ
sung" ở trên, hãy nhấp vào ứng dụng của bạn trong màn hình BẢNG ĐIỀU KHIỂN.
3.
Nhấp vào dịch vụ Push, Your_app_name:Push.
4. Dưới thẻ Configuration của giao diện dịch vụ Push, nhấp EDIT bên dưới Google Cloud
Messaging.
5. Điền vào khóa GCM API và số dự án Google API Project Number mà bạn đã có trước đó từ
Google và nhấp SAVE.
Mở rộng ứng dụng Android bằng dịch vụ đám mây IBM Push cho
Bluemix
Trang 7 của 17
developerWorks®
ibm.com/developerWorks/vn/
Bước 2. Làm quen với Node.js máy chủ
1. Nếu chưa có, hãy tải xuống ứng dụng Node.js. Ứng dụng Node.js nằm trong thư mục bluelistpush-node của dự án bluelist-push.
2. Xem tập tin bluelist-push-node/app¬.js và làm quen với mã. Giá trị appID trong mã app.js cần
được cập nhật.
Bước 3. Nhập ứng dụng Node.js
1. Đi đến trang Tổng quan của ứng dụng và ghi lại ID ứng dụng của BlueList.
2. Dùng giao diện dòng lệnh Cloud Foundry: Tải xuống Cloud Foundry CLI phiên bản 6 và
chọn trình cài đặt thích hợp với hệ thống mà bạn sẽ dùng để chạy CLI.
3. Mở dấu nhắc lệnh và chạy lệnh sau đây để xác minh cài đặt có đúng hay không:
cf --version
Nếu cài đặt đúng, bạn sẽ thấy một phiên bản được trả lại.
4. Đăng nhập vào Bluemix từ CLI bằng cách chạy lệnh:
cf login -a https://api.ng.bluemix.net
5. Từ dấu nhắc lệnh, điều hướng đến thư mục bluelist-push/bluelist-push-node chứa mã ứng dụng
Node.js.
6. Liệt kê nội dung trong thư mục để đảm bảo bạn thấy được app.js, manifest.yml, package.json
và thư mục chung.
7. Mở app.js trong trình soạn thảo văn bản và thêm ID ứng dụng, định tuyến ứng dụng cho ứng
dụng Đám mây di động của bạn trên IBM Bluemix.
...
//configuration for application
var appConfig = {
applicationId: "<INSERT_YOUR_APPLICATION_ID_HERE>",
applicationRoute: "BlueList.mybluemix.net"
};
....
8. Đẩy (tải lên) ứng dụng bluelist-push-node lên thời gian chạy Bluemix Node.js bằng cách chạy
lệnh sau:
cf push BlueList -p .
Nếu có lỗi 400 trả về, máy chủ "BlueList" đã được lấy. Cập nhập thuộc tính máy chủ host trong
tập tin manifest.yml bằng một tên duy nhất.
9. Xác nhận thông điệp thành công sau đây được trả về ở dấu nhắc lệnh:
Mở rộng ứng dụng Android bằng dịch vụ đám mây IBM Push cho
Bluemix
Trang 8 của 17
ibm.com/developerWorks/vn/
developerWorks®
1 of 1 instances running
App started
Showing health and status for app BlueList in org <your_org_name> / space <your_space> as
[email protected]...
OK
requested state: started
instances: 1/1
usage: 512M x 1 instances
urls: BlueList.mybluemix.net
ủ0
state
running
since
2014-04-25 02:23:27 PM
10. Bây giờ ứng dụng Node.js sẽ chạy.
cpu
0.0%
memory
53.2M of 512M
disk
34.7M of 1G
Bước 4. Thực hiện một số thay đổi ở mã máy khách để tương tác với các
dịch vụ IBM Push cho Bluemix và Node.js mà bạn vừa thiết lập
1. Giả sử bạn đã hoàn tất các bước trong hướng dẫn trước đó, hoặc trong phần "Bổ sung" ở trên,
chúng ta sẽ bắt đầu thực hiện các thay đổi cho mã dự án này để đưa nó vào cấp bluelistpush(v2).
2. Nếu chưa thực hiện, hãy sao chép các giá trị applicationId, applicationSecret và
applicationRoute có sẵn trên trang Tổng quan của ứng dụng (trên Bluemix) vào tập tin
bluelist.properties trong thư mục tài sản của dự án.
applicationID=<INSERT_APPLICATION_ID_HERE>
applicationSecret=<INSERT_APPLICATION_SECRET_HERE>
applicationRoute=<INSERT_APPLICATION_ROUTE_HERE>
3. Mở AndroidManifest.xml và cập nhật phần permission và activity như bên dưới. Thêm GCM
Intent Service mới và các bộ lọc intent-filter cho RECEIVE và REGISTRATION vào sau phần hoạt
động cuối cùng.
<!-- Push Permission -->
<permission
android:name="com.ibm.bluelist.permission.C2D_MESSAGE"
android:protectionLevel="signature" />
<!-- Permissions -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.USE_CREDENTIALS" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!-- Push Permissions -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="com.ibm.bluelist.permission.C2D_MESSAGE" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
Mở rộng ứng dụng Android bằng dịch vụ đám mây IBM Push cho
Bluemix
Trang 9 của 17
developerWorks®
ibm.com/developerWorks/vn/
<activity
android:name="com.ibm.bluelist.MainActivity"
android:label="@string/app_name"
android:configChanges="keyboardHidden|orientation">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<!-- Push Settings Start -->
<!-- Notification Intent -->
<intent-filter>
<action android:name="com.ibm.bluelist.BlueList.IBMPushNotification" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<!-- Push Settings End -->
</activity>
<activity
android:name="com.ibm.bluelist.EditActivity"
android:label="@string/title_activity_edit"
android:configChanges="keyboardHidden|orientation">
</activity>
<!-- Push Settings Start -->
<!-- Add GCM Intent Service and intent-filters for RECEIVE and REGISTRATION of notifications -->
<activity android:name="com.ibm.mobile.services.push.IBMUIActivity" />
<service android:name="com.ibm.mobile.services.push.IBMPushIntentService" />
<receiver android:name="com.ibm.mobile.services.push.IBMPushBroadcastReceiver"
android:permission="com.google.android.c2dm.permission.SEND">
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<category android:name="com.ibm.mbaas.push.sdk.client.android.sample" />
</intent-filter>
<intent-filter>
<action android:name="com.google.android.c2dm.intent.REGISTRATION" />
<category android:name="com.ibm.mbaas.push.sdk.client.android.sample" />
</intent-filter>
</receiver>
<!-- Push Settings End -->
4. Mở BlueListApplication.java và sẵn sàng để thực hiện một số thay đổi.
5. Tạo một dịch vụ IBMPush và biến Activity để sử dụng sau này. Tạo Strings cho deviceAlias
và consumerID. Ngoài ra, tạo các biến cho dịch vụ IBMPush, IBMPushNotificationListenervà
Activity.
public final class BlueListApplication extends Application {
public static final int EDIT_ACTIVITY_RC = 1;
public static IBMPush push = null;
private Activity mActivity;
private static final String deviceAlias = "TargetDevice";
private static final String consumerID = "MBaaSListApp";
private static final String CLASS_NAME = BlueListApplication.class.getSimpleName();
private static final String APP_ID = "applicationID";
private static final String APP_SECRET = "applicationSecret";
private static final String APP_ROUTE = "applicationRoute";
private static final String PROPS_FILE = "bluelist.properties";
private IBMPushNotificationListener notificationListener = null;
List<Item> itemList;
6. Theo dõi trạng thái hoạt động trong bốn ActivityLifecycleCallbacks.
Mở rộng ứng dụng Android bằng dịch vụ đám mây IBM Push cho
Bluemix
Trang 10 của 17
ibm.com/developerWorks/vn/
developerWorks®
public BlueListApplication() {
registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
@Override
public void onActivityCreated(Activity activity,Bundle savedInstanceState) {
Log.d(CLASS_NAME, "Activity created: " + activity.getLocalClassName());
//Track activity
mActivity = activity;
}
@Override
public void onActivityStarted(Activity activity) {
Log.d(CLASS_NAME, "Activity started: " + activity.getLocalClassName());
//Track activity
mActivity = activity;
}
@Override
public void onActivityResumed(Activity activity) {
Log.d(CLASS_NAME, "Activity resumed: " + activity.getLocalClassName());
//Track activity
mActivity = activity;
}
@Override
public void onActivitySaveInstanceState(Activity activity,Bundle outState) {
Log.d(CLASS_NAME, "Activity saved instance state: "
+ activity.getLocalClassName());
}
@Override
public void onActivityPaused(Activity activity) {
Log.d(CLASS_NAME, "Activity paused: " + activity.getLocalClassName());
//Track activity
if (activity != null && activity.equals(mActivity))
mActivity = null;
}
@Override
public void onActivityStopped(Activity activity) {
Log.d(CLASS_NAME, "Activity stopped: " + activity.getLocalClassName());
}
@Override
public void onActivityDestroyed(Activity activity) {
Log.d(CLASS_NAME, "Activity destroyed: " + activity.getLocalClassName());
}
});
}
7. Khi đã tạo được ứng dụng, khởi chạy dịch vụ IBM Push cho Bluemix và đăng ký thiết bị với
dịch vụ. Dùng phương thức continueWith() để kiểm tra kết quả. Bạn đang thêm vào các lệnh
gọi khởi tạo dịch vụ hiện có tại đây. Phương thức onCreate đã cập nhật của bạn phải có dạng
như sau:
@Override
public void onCreate() {
super.onCreate();
itemList = new ArrayList<Item>();
// Read from properties file.
Properties props = new java.util.Properties();
Context context = getApplicationContext();
try {
AssetManager assetManager = context.getAssets();
props.load(assetManager.open(PROPS_FILE));
Log.i(CLASS_NAME, "Found configuration file: " + PROPS_FILE);
} catch (FileNotFoundException e) {
Log.e(CLASS_NAME, "The bluelist.properties file was not found.", e);
} catch (IOException e) {
Log.e(CLASS_NAME, "The bluelist.properties file could not be read properly.", e);
}
Log.i(CLASS_NAME, "Application ID is: " + props.getProperty(APP_ID));
// Initialize the IBM core backend-as-a-service.
Mở rộng ứng dụng Android bằng dịch vụ đám mây IBM Push cho
Bluemix
Trang 11 của 17
developerWorks®
ibm.com/developerWorks/vn/
IBMBluemix.initialize(this, props.getProperty(APP_ID), props.getProperty(APP_SECRET),
props.getProperty(APP_ROUTE));
// Initialize the IBM Data Service.
IBMData.initializeService();
// Register Item Specialization here.
Item.registerSpecialization(Item.class);
// Initialize IBM Push service.
IBMPush.initializeService();
// Retrieve instance of the IBM Push service.
push = IBMPush.getService();
// Register the device with the IBM Push service.
push.register(deviceAlias, consumerID).continueWith(new Continuation&lt;String, Void&gt;() {
@Override
public Void then(Task&lt;String&gt; task) throws Exception {
if (task.isCancelled()) {
Log.e(CLASS_NAME, "Exception : Task " + task.toString() + " was cancelled.");
} else if (task.isFaulted()) {
Log.e(CLASS_NAME, "Exception : " + task.getError().getMessage());
} else {
Log.d(CLASS_NAME, "Device Successfully Registered");
}
return null;
}
});
}
8. Khi một hoạt động được tạo ra, hãy xác định IBMPushNotificationListener. Phương thức
onActivityCreated mới của bạn phải có dạng như sau:
public void onActivityCreated(Activity activity,Bundle savedInstanceState) {
Log.d(CLASS_NAME, "Activity created: " + activity.getLocalClassName());
mActivity = activity;
//Define IBMPushNotificationListener behavior on push notifications
notificationListener = new IBMPushNotificationListener() {
@Override
public void onReceive(final IBMSimplePushNotification message) {
mActivity.runOnUiThread(new Runnable(){
@Override
public void run() {
Class<? extends Activity> actClass = mActivity.getClass();
if (actClass == MainActivity.class) {
((MainActivity)mActivity).listItems();
Log.e(CLASS_NAME, "Notification message received: " + message.toString());
//present the message when sent from Push notification console.
if(!message.getAlert().contains("ItemList was updated")){
mActivity.runOnUiThread(new Runnable() {
public void run() {
new AlertDialog.Builder(mActivity)
.setTitle("Push notification received")
.setMessage(message.getAlert())
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
}
})
.show();
}
});
}
}
}
});
}
};
}
Mở rộng ứng dụng Android bằng dịch vụ đám mây IBM Push cho
Bluemix
Trang 12 của 17
ibm.com/developerWorks/vn/
developerWorks®
9. Kiểm tra push khi hoạt động được tiếp tục hoặc bị dừng lại. Phương thức onActivityResumed
và onActivityPaused mới của bạn phải có dạng như sau:
public void onActivityResumed(Activity activity) {
Log.d(CLASS_NAME, "Activity resumed: " + activity.getLocalClassName());
//Track activity
mActivity = activity;
if (push != null) {
push.listen(notificationListener);
}
}
public void onActivityPaused(Activity activity) {
if (push != null) {
push.hold();
}
Log.d(CLASS_NAME, "Activity paused: " + activity.getLocalClassName());
if (activity != null && activity.equals(mActivity))
mActivity = null;
}
10. Trong MainActivity.java, thêm một lệnh gọi vào updateOtherDevices khi sửa, tạo và xóa một
mục. Thêm phương thức updateOtherDevices() mới, phương thức này sẽ thực hiện một lệnh
gọi đến ứng dụng Node. js trên nền tảng đám mây (app.js) mà trước đó bạn đã tải lên ứng
dụng của bạn.
/**
* Send a notification to all devices whenever the BlueList is modified (create, update, or delete)
*/
private void updateOtherDevices() {
// initialize and retrieve an instance of the IBM CloudCode service
IBMCloudCode.initializeService();
IBMCloudCode myCloudCodeService = IBMCloudCode.getService();
JSONObject jsonObj = new JSONObject();
try {
jsonObj.put("key1", "value1");
} catch (JSONException e) {
e.printStackTrace();
}
// Call the node.js application hosted in the IBM Cloud Code service
// with a POST call, passing in a non-essential JSONObject
// The URI is relative to, appended to, the BlueMix context root
myCloudCodeService.post("notifyOtherDevices", jsonObj).continueWith(new Continuation<IBMHttpResponse,
Void>() {
@Override
public Void then(Task<IBMHttpResponse> task) throws Exception {
if (task.isCancelled()) {
Log.e(CLASS_NAME, "Exception : Task" + task.isCancelled() + "was cancelled.");
} else if (task.isFaulted()) {
Log.e(CLASS_NAME, "Exception : " + task.getError().getMessage());
} else {
InputStream is = task.getResult().getInputStream();
try {
BufferedReader in = new BufferedReader(new InputStreamReader(is));
String responseString = "";
String myString = "";
while ((myString = in.readLine()) != null)
responseString += myString;
in.close();
Log.i(CLASS_NAME, "Response Body: " + responseString);
} catch (IOException e) {
Mở rộng ứng dụng Android bằng dịch vụ đám mây IBM Push cho
Bluemix
Trang 13 của 17
developerWorks®
ibm.com/developerWorks/vn/
e.printStackTrace();
}
Log.i(CLASS_NAME, "Response Status from notifyOtherDevices: " +
task.getResult().getHttpResponseCode());
}
return null;
}
});
}
/*if an edit has been made, notify that the data set has changed.*/
case BlueListApplication.EDIT_ACTIVITY_RC:
// Call updateOtherDevices to invoke Cloud functions
updateOtherDevices();
sortItems(itemList);
lvArrayAdapter.notifyDataSetChanged();
break;
}
public void createItem(View v) {
. . .
// If the result succeeds, load the list.
else {
listItems();
updateOtherDevices();
}
. . .
}
public void deleteItem(Item item) {
. . .
// If the result succeeds, reload the list.
else {
updateOtherDevices();
lvArrayAdapter.notifyDataSetChanged();
}
. . .
}
Bước 5. Chạy ứng dụng
1. Bây giờ bạn đã thực hiện các thay đổi cho mã, mã của bạn phải tương đương với phiên bản 2!
2. Chạy mã cập nhật trong hai trình mô phỏng riêng biệt.
Lưu ý: Hãy chắc chắn là thiết bị Android của bạn hỗ trợ các API của Google.
• Trong Eclipse, đi đến Project > Properties > Android.
• Đảm bảo đã chọn các API của Google cho mức API của bạn và nhấp Apply.
• Mở Trình quản lý thiết bị ảo Android, chọn thiết bị của bạn, nhấp Edit và đặt Đích thành
API Google (Google Inc.) - Mức API XX (trong đó XX là mức API của bạn).
3. Thêm một số mục của ứng dụng danh sách mua sắm (grocery list).
4. Hãy xem khi mỗi danh sách được cập nhật!
Mở rộng ứng dụng Android bằng dịch vụ đám mây IBM Push cho
Bluemix
Trang 14 của 17
ibm.com/developerWorks/vn/
developerWorks®
5. Ngoài ra, mỗi khi tạo, xóa hoặc cập nhật một mục trên BlueList, tất cả thiết bị đã đăng ký với
dịch vụ Push sẽ nhận được một thông báo push được gửi từ ứng dụng trên nền Node.js của
bạn!
Bước 6. Kiểm thử gửi thông báo từ Bluemix
1. Đăng nhập Bluemix.
2. Từ màn hình BẢNG ĐIỀU KHIỂN, nhấp vào ứng dụng của bạn.
3. Nhấp biểu tượng dịch vụ Push .
4. Nhấp vào thẻ Notification .
5. Ðiền vào trường văn bản Thông điệp với nội dung tùy ý và nhấp NEXT.
6. Chọn Người nhận và nhấp SEND.
Mở rộng ứng dụng Android bằng dịch vụ đám mây IBM Push cho
Bluemix
Trang 15 của 17
developerWorks®
ibm.com/developerWorks/vn/
7.
Xem thiết bị di động hoặc trình mô phỏng nhận thông báo push!
Kết luận
Mở rộng ứng dụng bằng dịch vụ Push và Node.js của máy chủ có sẵn trong Bluemix sẽ cho bạn một
cách thức dễ dàng để sử dụng và tích hợp các khả năng dữ liệu di động bằng cách dùng Dịch vụ
di động trong Bluemix. Cho đến thời điểm hiện nay của loạt hướng dẫn này, bạn đã sử dụng IBM
Mobile Data cho Bluemix để lưu, xóa, cập nhật và truy vấn một danh sách đối tượng được lưu trên
đám mây. Bạn cũng đã dùng dịch vụ IBM Push cho Bluemix và ứng dụng Node.js trên nền tảng
đám mây để làm mới lại danh sách trên tất cả thiết bị và gửi thông báo khi một trong các thiết bị
cập nhật danh sách theo bất kỳ cách thức nào.
Mở rộng ứng dụng Android bằng dịch vụ đám mây IBM Push cho
Bluemix
Trang 16 của 17
ibm.com/developerWorks/vn/
developerWorks®
Đôi nét về các tác giả
Belinda Vennam
Kỹ sư phần mềm, bộ phận Dịch vụ IBM Mobile Cloud
Salim Zeitouni
Kỹ sư phần mềm, IBM Application and Integration Middleware
Paul Mariduena
Kỹ sư phần mềm, IBM Application and Integration Middleware
© Copyright IBM Corporation 2015
(www.ibm.com/legal/copytrade.shtml)
Nhẫn hiệu đăng ký
(www.ibm.com/developerworks/vn/ibm/trademarks/)
Mở rộng ứng dụng Android bằng dịch vụ đám mây IBM Push cho
Bluemix
Trang 17 của 17