Push クラウド・サービスを利用して Android アプリを拡張する

2014年 7月 31日
PDF (806 KB)
 
author photo - belinda johnson

Belinda Johnson

Software Engineer, IBM Mobile Cloud Services

@BeeMarieJohnson

author photo - Salim Zeitouni

Salim Zeitouni

Software Engineer, IBM Application and Integration Middleware

Find me on LinkedIn

IBM Bluemix™ にサインアップ
無償のサービス、ランタイム、インフラを含むクラウド・プラットフォームが、新たなモバイルやウェブ・アプリのクイックな構築とデプロイを実現します。

皆さんは既に Bluemix を使用するメリットをいくつかご存知のことでしょう。Bluemix は、モバイル・アプリケーションと Web アプリケーションを開発、デプロイするための IBM のオープン・プラットフォームです。Bluemix には、あらかじめビルドされたサービスが数多く用意されていて、簡単にアプリケーションの作成や機能強化を行えるようになっています。

この記事では、Push サービスを利用して Android アプリケーションを拡張する方法について説明します。この連載の他の記事では、クラウド・ベースの他のサービスをアプリケーションに追加する方法について説明しています。

この連載の前回の記事で紹介したように、BlueList アプリケーションは単純な Android アプリケーションです。今回の記事では、この BlueList アプリケーションに Push サービスと Node.js Cloud サービスを追加します。これらのサービスを追加することにより、リストが更新されると通知が送信されるようになり、いずれかの端末によってリストが何らかの方法で更新されると、すべての端末上でリストが更新されるようになります。

Bluemix の無料サービスを利用すれば、すぐに独自のアプリケーションの作成や拡張を始めることができます。

この連載の前回の記事では Mobile Data サービスを追加し、リストの項目が維持されるようになりました。今回の記事では、リストが更新されるたびにそれを通知するために Node.js Cloud サービスから送信される Push 通知を追加します。この連載の前回の記事を読んでいない人は bluelist-mobiledata (v1) コードから始めて構いませんが、Push サービスと Node.js Cloud サービスを追加するのに必要なステップを実行する前に、「キャッチアップ」作業を行う必要があります。前回の記事を読んだ人は、前回のコードを出発点に、以下の手順に従って Push サービスと Node.js Cloud サービスを追加することができます。bluelist-push (v2) コードをダウンロードして即座に始めたい人は、いくつかのステップを実行するだけで、BlueList アプリケーションで Mobile Data サービス、Push サービス、Node.js Cloud サービスを利用できるようになります。bluelist-push (v2) コードには、今回の記事で bluelist-mobiledata (v1) コードに対して加える変更が含まれています。

アプリケーションに必要となるもの

 
  • この連載の前回の記事の内容についての理解。前回の記事では Android アプリケーションに Mobile Data サービスを追加しました。そのアプリケーションが今回の記事の出発点です。
  • Android 開発についての十分な知識。
  • Android 開発環境。私たちは Eclipse で ADT を使用しましたが、他の環境を使用しても構いません。
  • bluelist-mobiledata (v1) をダウンロードできる程度の git についての理解と Node.js アプリケーション・コードについての十分な知識。
  • bluelist-mobiledata (v1) コード (上記のボタンをクリックしてください)、またはこの連載の前回の記事で作成したコード。
  • Node.js アプリケーション。このアプリケーションは、bluelist-push プロジェクトの bluelist-push-node フォルダー内にあります。
  • Googl から入手した GCM Sender ID と API キー。このキーの入手方法については、Google の説明を読むか、この記事の説明を読んでください。

    注: この作業を行うには、Gmail アカウントが必要です。

キャッチアップ: この連載の前回の記事を読んでいない場合

 
  1. まだ bluelist-mobiledata (v1) コードをダウンロードしていない場合には、bluelist-mobiledata (v1) コードをダウンロードします (上のボタンをクリックします)。
  2. この連載の前回の記事「ステップ 1: Bluemix 上で Mobile Cloud アプリケーションを作成する」を参照し、そこに記載されているステップ 1 の 1 から 10 までを実行します。これらのステップにより、Bluemix へのログイン、Bluemix 上でのアプリケーション (BlueList) の作成、Android SDK のダウンロード、アプリケーション ID による bluelist.properties ファイルの更新、libs ディレクトリーへの ibmbaas.jar、ibmdata.jar、ibmfilesync.jar の追加が行われます。
  3. Push サービスを追加する作業に進む前に、現時点でのコードをエミュレーターで実行し、Android 開発環境が適切に構築されていることを確認します。そのためには、この連載の前回記事の「ステップ 7. アプリケーションを実行する」「ステップ 8. クラウド上のデータを表示する」を実行することができます。

    アプリケーションが適切に実行されれば、すべてのキャッチアップが完了し、Push サービスと Node.js Cloud サービスを追加する準備ができたことになります。

始める前に: Push に必要な Google API のプロジェクト番号と GCM API キーを入手する

 

Google API のプロジェクト番号と GCM API キーを入手する

 
  1. Google Developers Console を開きます。
  2. 「プロジェクトを作成」をクリックしてプロジェクト名を入力し、「作成」をクリックします。
  3. ページの先頭からプロジェクト番号をコピーします。これが皆さんの GCM 送信者 ID (Google API プロジェクト番号) です。この ID が後で必要になります。
  4. ページの左側にある「API と認証」をクリックします。
  5. 「Google Cloud Messaging for Android」を有効にします。
  6. 「API と認証」の下にある「認証情報」をクリックします。
  7. 「公開 API へのアクセス」セクションの下にある「新しいキーを作成」をクリックします。
  8. 「サーバー キー」をクリックします。
  9. 「作成」をクリックします。
  10. 「公開 API へのアクセス」セクションから API キーをコピーします。これが皆さんの送信者認証トークン (GCM API キー) です。このキーが後で必要になります。

プロジェクトに Google Play サービスを追加する

 
  1. Eclipse を開き、「Window (ウィンドウ)」 > 「Android SDK Manager (Android SDK マネージャー)」の順に選択します。
  2. 下の方へスクロールし、「Extras (エクストラ)」配下の「Google Play services (Google Play サービス)」を選択します。 「Google Play services (Google Play サービス)」ライブラリーを選択している画面のスクリーン・キャプチャー
  3. 「Install 1 package (1 パッケージのインストール)」をクリックし、ライセンスを受け入れます。 「Install 1 package (1 パッケージのインストール)」を選択する画面のスクリーン・キャプチャー
  4. インストールに成功したら、ファイルシステムの <Android_SDK_Location>\extras\google\google_play_services\libproject\google-play-services_lib に現在置かれているプロジェクトを Eclipse のワークスペースにインポートします。それには、「File (ファイル)」 > 「Import (インポート)」の順に選択し、「Android」 > 「Existing Android Code Into Workspace (既存の Android コードをワークスペースに)」と続けて選択した後、google-play-services_lib プロジェクトを参照します。 Eclipse における新規 Android ライブラリー・プロジェクトのスクリーン・キャプチャー
  5. google-play-services_lib をワークスペースへインポートするのに成功したら、このライブラリーを Android ライブラリー・プロジェクトとして設定しておく必要があります。それには、このプロジェクトの「Properties (プロパティー)」を開いて「Is Library (ライブラリーです)」チェックボックスを選択します。 Android プロジェクトの「Is Library (ライブラリーです)」プロパティーのスクリーン・キャプチャー

    クリックして大きなイメージを見る

  6. 次に、皆さんのプロジェクトは、この新しいライブラリー・プロジェクトを参照する必要があります。Android ライブラリー・プロジェクト google-play-services_lib への参照を追加するには、以下のステップに従います。
    1. このライブラリー・プロジェクトと、このライブラリー・プロジェクトに依存するアプリケーション・プロジェクトが、両方ともにワークスペース内にあることを確認します。もし、いずれかのプロジェクトがワークスペース内にない場合には、そのプロジェクトをワークスペースにインポートします。
    2. パッケージ・エクスプローラーで、依存関係プロジェクトを右クリックし、「Properties (プロパティー)」を選択します。
    3. 「Properties (プロパティー)」ウィンドウでは、左にある「Android」プロパティー・グループを選択し、右に表示される「Library (ライブラリー)」プロパティーを見つけます。
    4. 「Add (追加)」をクリックすると、「Project Selection (プロジェクト選択)」ダイアログが開きます。
    5. 使用可能なライブラリー・プロジェクトのリストから、「google-play-services_lib」プロジェクトを選択して「OK」をクリックします。
    6. ダイアログが閉じたら、「Properties (プロパティー)」ウィンドウで「Apply (適用)」をクリックします。
    7. 「OK」をクリックして「Properties (プロパティー)」ウィンドウを閉じます。
    BlueList プロジェクトのプロパティーの中でライブラリー・プロジェクトへの参照を追加する画面のスクリーン・キャプチャー

    クリックして大きなイメージを見る

  7. 皆さんのアプリケーションの AndroidManifest.xml で、<application> 要素の最初の子として google-play-services バージョンへの参照を追加します。
    <meta-data
    	android:name="com.google.android.gms.version"
        android:value="@integer/google_play_services_version" />
  8. この結果として、コンパイル・エラーが発生するはずです。このエラーは、google-play-services_lib/res/values/version.xml に見つかるファイルをアプリケーションの res/values ディレクトリーにコピーすることで、修正することができます。
  9. 最後に、android-support-v4.jar ファイルを皆さんのプロジェクトの libs ディレクトリーにコピーします。この JAR アーカイブは、<Android_SDK_Location>/extras/android/support/v4 で見つけることができます。

IBM Push と IBM Cloud Code クライアント SDK の JAR をプロジェクトに追加する

 
  1. 前回の記事のステップ 1 の 7 でダウンロードした Android SDK を見つけます。
  2. ibmcloudcode.jar ファイルと ibmpush.jar ファイルをプロジェクトの libs ディレクトリーにコピーします。これで、libs ディレクトリーに 6 つの jar ファイル (そして、Android Dependencies に 1 つの jar ファイル) が存在するようになるはずです。 jar ファイルのスクリーン・キャプチャー

ステップ 1. Bluemix 上でアプリケーションに Google API のプロジェクト番号と GCM API キーを追加する

 
  1. Bluemix にログインします。
  2. 前回の記事のステップを完了しているか、上記の「キャッチアップ」のステップを完了しているという前提の下で、「DASHBOARD (ダッシュボード)」ビューでアプリケーションをクリックします。
  3. Push サービス (「<アプリケーション名>:Push」) をクリックします。 Push サービスのスクリーン・キャプチャー
  4. この Push サービスの「Configuration (構成)」タブで「Google Cloud Messaging (Google クラウド・メッセージング)」の下にある「EDIT (編集)」をクリックします。
  5. 先ほど Google から入手した GCM API キーと Google API プロジェクト番号を入力し、「Save (保存)」をクリックします。 「Google Cloud Messaging (Google クラウド・メッセージング)」の「Edit (編集)」ボタンのスクリーン・キャプチャー

ステップ 2. サーバー・サイドの Node.js を理解する

 
  1. まだ Node.js アプリケーションをダウンロードしていない場合には、Node.js アプリケーションをダウンロードします。Node.js アプリケーションは、bluelist-push プロジェクトの bluelist-push-node フォルダー内にあります。
  2. bluelist-push-node/app.js ファイルにひと通り目を通してコードを理解します。app.js コード内の appID 値は更新する必要があります。

ステップ 3. Node.js アプリケーションをインポートする

 
  1. アプリケーションの「OVERVIEW (概要)」ページを表示して、BlueList の「Application ID (アプリケーション ID)」をメモします。 アプリケーション ID が表示されている場所のスクリーン・キャプチャー
  2. Cloud Foundry のコマンドライン・インターフェースを使用します。Cloud Foundry CLI バージョン 6 をダウンロードして、この CLI を実行することになるシステムに対応したインストーラーを選択します。
  3. コマンド・プロンプトを開き、以下のコマンドを実行して、Cloud Foundry が適切にインストールされていることを確認します。
    cf --version

    適切にインストールされていれば、バージョンが表示されます。

  4. CLI から以下のコマンドを実行して、Bluemix にログインします。
    cf login -a https://api.ng.bluemix.net
  5. コマンド・プロンプトから、Node.js アプリケーション・コードが含まれている bluelist-push/bluelist-push-node ディレクトリーまでナビゲートします。
  6. このディレクトリーの内容を一覧表示して、app.js、manifest.yml、package.json、そして公開ディレクトリーが存在していることを確認します。
  7. テキスト・エディターで app.js を開き、IBM Bluemix 上の皆さんの Mobile Cloud アプリケーションのアプリケーション ID とアプリケーション・ルートを追加します。
    ...				 
    //configuration for application
    var appConfig = {
        applicationId: "<INSERT_YOUR_APPLICATION_ID_HERE>",
        applicationRoute: "BlueList.mybluemix.net"
    };
    ....
  8. 以下のコマンドを実行することで、bluelist-push-node アプリケーションを Bluemix Node.js ランタイムへプッシュ (アップロード) します。
    cf push BlueList -p .

    400 エラーが返された場合は、ホスト "BlueList" が取得されるので、manifest.yml ファイルの host プロパティーを一意の名前で更新します。

  9. コマンド・プロンプトに、成功を示す以下のメッセージが表示されることを確認します。

    リスティングを見るにはここをクリック

    1 of 1 instances running
    
    App started
    
    Showing health and status for app BlueList in org <your_org_name> / space <your_space> as yourid@ibm.com...
    OK
    
    requested state: started
    instances: 1/1
    usage: 512M x 1 instances
    urls: BlueList.mybluemix.net
    
         state     since                    cpu    memory          disk
    #0   running   2014-04-25 02:23:27 PM   0.0%   53.2M of 512M   34.7M of 1G
  10. 現在、Node.js アプリケーションは実行されているはずです。

ステップ 4. セットアップした Push サービスと Node.js サービスを操作するための変更をクライアント・サイド・コードに加える

 
  1. 前回の記事のステップを完了しているか、上記「キャッチアップ」セクションのステップを完了しているという前提の下で、このプロジェクトのコードを bluelist-push (v2) レベルにするための変更を加えます。
  2. まだ (Bluemix 上にある) 皆さんのアプリケーションの「Overview (概要)」ページに表示されている applicationId、applicationSecret、applicationRoute の値を、皆さんのプロジェクトの assets フォルダーにある bluelist.properties ファイルにコピーしていない場合は、コピーします。
    applicationID=<INSERT_APPLICATION_ID_HERE>
    applicationSecret=<INSERT_APPLICATION_SECRET_HERE>
    applicationRoute=<INSERT_APPLICATION_ROUTE_HERE>
  3. AndroidManifest.xml を開き、permission セクションと activity セクションを以下のように更新します。最後の activity セクションの後に、RECEIVEREGISTRATION のための新しい GCM Intent Service と intent-filter を追加します。
    <!--  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" />
    <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. BlueListApplication.java を開き、変更を加える準備をします。
  5. 後で使用する IBMPush サービスと Activity 変数を作成します。deviceAlias および consumerID という名前の String を作成します。また、IBMPush サービス、IBMPushNotificationListener、アクティビティーを対象とした変数を作成します。
    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. 4 つの ActivityLifecycleCallbacks の中でアクティビティーのステータスを追跡します。
    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. アプリケーションを作成したら、Push サービスを初期化し、このサービスに端末を登録して、IBMPushResponseListener を定義します。この処理を既存のサービス初期化呼び出しに追加します。更新された onCreate メソッドは以下のようになるはずです。

    リスティングを見るにはここをクリック

    @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
    	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.isFaulted()) {
    				Log.e(CLASS_NAME, "Exception : " + task.getError().getMessage());
    				return null;
    			}
    			Log.d(CLASS_NAME, "Device Successfully Registered");
    			
    			return null;
    		}
    		
    	});
    	
    }
  8. アクティビティーを作成したら、IBMPushNotificationListener を定義します。新しい onActivityCreated メソッドは以下のようになるはずです。

    リスティングを見るにはここをクリック

    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();
    								}
    							});
    							
    						}											
    					}
    				}
    			});
    		}					
    	};
    }
  9. アクティビティーが再開または一時停止された場合は push を確認します。新しい onActivityResumed メソッドと onActivityPaused メソッドは以下のようになるはずです。
    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. 項目が編集、作成、削除された場合のための updateOtherDevices の呼び出しを MainActivity.java に追加します。そして、新しい updateOtherDevices メソッドを追加します。このメソッドは先ほどアプリケーションにアップロードされた、IBM Cloud Code にホストされる Node.js アプリケーション (app.js) を呼び出します。

    リスティングを見るにはここをクリック

    	/**
    	 * 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.isFaulted()) {
    					Log.e(CLASS_NAME, "Exception : " + task.getError().getMessage());
    					return null;
    				}
    				
    				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) {
    		            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
    		if (!isFinishing()) {
    			listItems();
    			// Call updateOtherDevices to invoke Cloud functions
    			updateOtherDevices();
    		}
    		
    	. . .
    	}
    public void deleteItem(Item item) {
    	. . .
    	
    	// If the result succeeds, reload the list
    	if (!isFinishing()) {
    		runOnUiThread(new Runnable() {
    			public void run() {
    				// Call updateOtherDevices to invoke Cloud functions
    				updateOtherDevices();
    				lvArrayAdapter.notifyDataSetChanged();
    			}
    		});
    	}
    	
    	. . .
    }

ステップ 5. アプリケーションを実行する

 
  1. これでコードの変更が完了したので、このコードはバージョン 2 と等価なはずです。
  2. 最新のコードを 2 つの別々のエミュレーターで実行します。

    注: 皆さんの Android 端末が Google API をサポートしていることを確認してください。

    • Eclipse で、「Project (プロジェクト)」 > 「Properties (プロパティー)」 > 「Android」の順に選択します。
    • 皆さんの Android 端末がサポートしている API レベルの Google API が選択されていることを確認し、「Apply (適用)」をクリックします。
    • 「Android Virtual Device Manager (Android 仮想デバイス・マネージャー)」を開いて皆さんの Android 端末を選択し、「Edit (編集)」をクリックして「Target: to Google APIs (Google Inc.) - API Level XX (ターゲット: Google API (Google Inc.) - API レベル XX)」を設定します (ここで、「XX」は皆さんの Android 端末の API レベルです)。
  3. 食料品リストに項目を追加します。
  4. 各リストが更新されることを確認します。
  5. また、BlueList 上の項目を作成、削除、または更新するときには必ず、Push サービスに登録されているすべての端末では、ホストされている Node.js アプリケーションから送信されたプッシュ通知が受信されます!端末上に表示される自動通知メッセージのスクリーン・キャプチャー

ステップ 6. Bluemix からの通知の送信をテストする

 
  1. Bluemix にログインします。
  2. 「DASHBOARD (ダッシュボード)」ビューでサンプル・アプリケーションをクリックします。
  3. 「Push」サービスのアイコンをクリックします。
  4. 「Notification (通知)」タブをクリックします。
  5. 「Message text (メッセージ・テキスト)」フィールドに任意の文字列を入力し、「NEXT (次へ)」をクリックします。 通知メッセージのスクリーン・キャプチャー
  6. 「Recipients (受信者)」を選択し、「SEND (送信)」をクリックします。
  7. 皆さんのモバイル端末またはエミュレーターがプッシュ通知を受信することを確認してください。 端末に表示された通知メッセージのスクリーン・キャプチャー

まとめ

 

Bluemix の Push サービスと Node.js サーバー・サイド・サービスを利用してアプリケーションを拡張してみると、モバイル・クラウド・サービスを利用してモバイル・データ機能を使用したり、統合したりするのがいかに容易か、感覚をつかめるはずです。この連載のここまででは、Mobile Data サービスを使用して、クラウド上にオブジェクトのリストを保管して、そのリストに対して削除、更新、クエリーを実行しました。また Push サービスと Node.js サーバー・サイド・サービスを利用することで、いずれかの端末によってリストが何らかの方法で更新されたときに、すべての端末上でリストが更新され、通知が送信されるようにしました。


関連トピック:前回の記事 (Mobile Data クラウド・サービスを利用して Android アプリを作成する)

コメントの追加

注意: HTML コードは、コメント内ではサポートされません。


残り 1000 文字

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Mobile development, Cloud computing
ArticleID=967814
ArticleTitle=Push クラウド・サービスを利用して Android アプリを拡張する
publish-date=07312014