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<String, Void>() { @Override public Void then(Task<String> 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