Envío de datos de una actividad a WearableListenerService

Cuando leí sobre la comunicación entre una Activity y un Service , encontré que podemos usar cualquiera

  • IBinder
  • Mensajero
  • AIDL

Estoy interesado en los dos primeros. Así que cuando intenté implementar esto para comunicarse entre una Activity y WearableListenerService , necesitaba anular la función onBind .

Pero entonces, estoy recibiendo un error del compilador diciéndolo

No puede anular el método final "onBind"

No consigo tal error cuando utilizo un Service normal. Asi que,

1. ¿Significa eso que no podemos usar el IBinder o Messenger para comunicarnos con el WearableListenerService de una Activity ?

2. Si es así, ¿cuál es la siguiente mejor manera de pasar el mensaje a WearableListenerService de una Activity (o llamar a un método público de ese servicio de una actividad)?

Después de excavar, encontré la solución. Espero que ayude a alguien más.

Podemos enviar el mensaje de una actividad a WearableListenerService usando las funciones Wearable.MessageApi . Cuando la Activity y WearableListenerService están en el mismo nodo (dispositivo), necesitamos obtener la instancia del nodo local (nodo actual desde el cual se envía el mensaje) para enviar el mensaje como a continuación

 NodeApi.GetLocalNodeResult nodes = Wearable.NodeApi.getLocalNode(mGoogleApiClient).await(); 

más bien que

 NodeApi.GetConnectedNodesResult nodes = Wearable.NodeApi.getConnectedNodes(mGoogleApiClient).await(); 

Que se utiliza para obtener la lista de otros dispositivos (como el desgaste) conectados al teléfono.

Así pues, pude enviar con éxito un mensaje de mi actividad a WearableListenerService de la siguiente manera

Código de actividad

 public class PhoneActivity extends Activity implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener{ private static final String TAG = "PhoneActivity"; public static final String CONFIG_START = "config/start"; public static final String CONFIG_STOP= "config/stop" Intent intent; TextView txtview; GoogleApiClient mGoogleApiClient; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_phone); if(null == mGoogleApiClient) { mGoogleApiClient = new GoogleApiClient.Builder(this) .addApi(Wearable.API) .addConnectionCallbacks(this) .addOnConnectionFailedListener(this) .build(); Log.v(TAG, "GoogleApiClient created"); } if(!mGoogleApiClient.isConnected()){ mGoogleApiClient.connect(); Log.v(TAG, "Connecting to GoogleApiClient.."); } startService(new Intent(this, PhoneService.class)); } @Override public void onConnectionSuspended(int cause) { Log.v(TAG,"onConnectionSuspended called"); } @Override public void onConnectionFailed(ConnectionResult connectionResult) { Log.v(TAG,"onConnectionFailed called"); } @Override public void onConnected(Bundle connectionHint) { Log.v(TAG,"onConnected called"); } @Override protected void onStart() { super.onStart(); Log.v(TAG, "onStart called"); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.phone, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); if (id == R.id.action_start_) { new SendActivityPhoneMessage(CONFIG_START,"").start(); }else if (id == R.id.action__stop) { new SendActivityPhoneMessage(CONFIG_STOP,"").start(); }else if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } class SendActivityPhoneMessage extends Thread { String path; String message; // Constructor to send a message to the data layer SendActivityPhoneMessage(String p, String msg) { path = p; message = msg; } public void run() { NodeApi.GetLocalNodeResult nodes = Wearable.NodeApi.getLocalNode(mGoogleApiClient).await(); Node node = nodes.getNode(); Log.v(TAG, "Activity Node is : "+node.getId()+ " - " + node.getDisplayName()); MessageApi.SendMessageResult result = Wearable.MessageApi.sendMessage(mGoogleApiClient, node.getId(), path, message.getBytes()).await(); if (result.getStatus().isSuccess()) { Log.v(TAG, "Activity Message: {" + message + "} sent to: " + node.getDisplayName()); } else { // Log an error Log.v(TAG, "ERROR: failed to send Activity Message"); } } } } 

Código de servicio

 public class PhoneService extends WearableListenerService implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener{ private static final String TAG = "PhoneService"; public static final String CONFIG_START = "config/start"; public static final String CONFIG_STOP = "config/stop"; GoogleApiClient mGoogleApiClient; public PhoneService() { } @Override public void onCreate() { super.onCreate(); Log.v(TAG, "Created"); if(null == mGoogleApiClient) { mGoogleApiClient = new GoogleApiClient.Builder(this) .addApi(Wearable.API) .addConnectionCallbacks(this) .addOnConnectionFailedListener(this) .build(); Log.v(TAG, "GoogleApiClient created"); } if(!mGoogleApiClient.isConnected()){ mGoogleApiClient.connect(); Log.v(TAG, "Connecting to GoogleApiClient.."); } } @Override public void onDestroy() { Log.v(TAG, "Destroyed"); if(null != mGoogleApiClient){ if(mGoogleApiClient.isConnected()){ mGoogleApiClient.disconnect(); Log.v(TAG, "GoogleApiClient disconnected"); } } super.onDestroy(); } @Override public void onConnectionSuspended(int cause) { Log.v(TAG,"onConnectionSuspended called"); } @Override public void onConnectionFailed(ConnectionResult connectionResult) { Log.v(TAG,"onConnectionFailed called"); } @Override public void onConnected(Bundle connectionHint) { Log.v(TAG,"onConnected called"); } @Override public void onDataChanged(DataEventBuffer dataEvents) { super.onDataChanged(dataEvents); Log.v(TAG, "Data Changed"); } @Override public void onMessageReceived(MessageEvent messageEvent) { super.onMessageReceived(messageEvent); if(messageEvent.getPath().equals(CONFIG_START)){ //do something here }else if(messageEvent.getPath().equals(CONFIG_STOP)){ //do something here } } @Override public void onPeerConnected(Node peer) { super.onPeerConnected(peer); Log.v(TAG, "Peer Connected " + peer.getDisplayName()); } @Override public void onPeerDisconnected(Node peer) { super.onPeerDisconnected(peer); Log.v(TAG, "Peer Disconnected " + peer.getDisplayName()); } } 
  • Recuperación del nombre del dispositivo de desgaste
  • Cómo mostrar la notificación únicamente en el dispositivo Android Wear
  • ¿Será esto posible con Android sdk usable
  • No se puede crear una notificación de "control de acción simple"
  • Creación de un Wear AVD
  • GoogleApiClient falla para Android Wear El API requiere actualización pero ya estoy actualizado
  • API del sensor de ritmo cardíaco para Android
  • La imagen no está centrada en ActionPage en el dispositivo de desgaste androide 320x320
  • ¿Cuál es la mejor práctica para compartir clases entre una aplicación de Wear y Android?
  • Compilación de una sencilla aplicación portátil en Android Studio - WatchActivity not found
  • No se muestra la notificación de Android Wear si se utiliza FLAG_NO_CLEAR
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.