アプリのホーム画面の起動時に(ハンドヘルドにある)データベースからデータを取得する摩耗アプリを作成しています。そのため、ホームページのアクティビティが起動すると、 Wearable.MessageApi.sendMessage 関数を使用して Android ウェアからハンドヘルドにメッセージを送信します。ハンドヘルドには、 onMessageReceived 関数でこのメッセージを受信し、データベースを読み取る WearableListenerService があります。データベースを読み取った後、putDatamapRequest をウェアに送信します。
摩耗側では、別の WearableListenerService があります。このサービスでは、onDataChanged() 関数は呼び出されません。時々実行されますが、これまでに2〜3回実行されましたが、それ以外は実行されません。それは非常にランダムです。また、データが Wear 側で受信されたら、Activity でデータを表示するために使用する静的な Arraylist を設定します。ただし、onDataChanged 関数は常に呼び出されるとは限らないため、空の配列リストが返されます。
サービスを宣言した Wear アプリの AndroidManifest ファイルを次に示します。
<service
android:name="com.example.deals.DataListenerService"
android:enabled="true"
android:exported="true" >
<intent-filter>
<action android:name="com.google.android.gms.wearable.BIND_LISTENER" />
</intent-filter>
</service>
ウェアからハンドヘルドにメッセージを送信するコードは次のとおりです。
mGoogleApiClient = new GoogleApiClient.Builder(this).addConnectionCallbacks(new GoogleApiClient.ConnectionCallbacks() {
@Override
public void onConnected(Bundle bundle) {
Wearable.NodeApi.getConnectedNodes(mGoogleApiClient).setResultCallback(new ResultCallback<NodeApi.GetConnectedNodesResult>() {
@Override
public void onResult(NodeApi.GetConnectedNodesResult getConnectedNodesResult) {
if(!getConnectedNodesResult.getNodes().isEmpty())
{
node = getConnectedNodesResult.getNodes().get(0);
System.out.println("Connected: "+ node.getId());
Wearable.MessageApi.sendMessage(mGoogleApiClient, node.getId(), FETCH_ALL_DEALS, null).setResultCallback(new ResultCallback<MessageApi.SendMessageResult>() {
@Override
public void onResult(MessageApi.SendMessageResult sendMessageResult) {
if (!sendMessageResult.getStatus().isSuccess()) {
Log.e("Wear:", "ERROR: failed to send Message: " + sendMessageResult.getStatus());
}
else
System.out.println("success");
}
});
}
else
System.out.println("Wear not connected to Phone");
}
});
}
@Override
public void onConnectionSuspended(int i) {
}
})
.addOnConnectionFailedListener(new GoogleApiClient.OnConnectionFailedListener() {
@Override
public void onConnectionFailed(ConnectionResult result) {
Log.v("Phone to wear connection failed", "onConnectionFailed: " + result);
}
})
.addApi(Wearable.API)
.build();
mGoogleApiClient.connect();
ハンドヘルドでの onMessageReceive のコードは次のとおりです。
public void onMessageReceived(MessageEvent messageEvent) {
System.out.println("Message Received on Phone on launch of wear homepage");
if(messageEvent.getPath().equals(FETCH_ALL_DEALS)) {
sendSavedDeals(); //fetch from db and make a datamap object using PutDataRequest
System.out.println("Message Received on Phone on launch of wear homepage");
}
else {
System.out.println("Unable to recognise action for "+messageEvent.getPath());
}
}
私の摩耗側では、WearableListenerService がありますが、onDataChanged メソッドが呼び出されることはありません。それを手伝ってくれませんか。