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
.
- Android Wear y Google Fit: ¿Cómo forzar la actualización de datasets entre smartwatch y smartphone?
- Android desgaste acción ícono icono tamaño vs teléfono notificación acción artículo tamaño
- Instalar APK firmado no instala la aplicación en Android Wear
- Android Wear detecta "Mute"
- Android Wear genera dos apk
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)?
- Android Wear sabor
- Falló el gradle de construcción para la aplicación de desgaste
- Detectar si la aplicación de desgaste comenzó con el comando de voz o la entrada táctil
- Android Wear Project Gradle Sync falla
- Adición de imágenes / iconos adicionales a CardFragment (Android Wear)
- Android Wear BLE Función central
- Cuadro de diálogo Timepicker en Android Wear: ¿El material timepicker es demasiado grande?
- Cara de reloj personalizada para Android Wear
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()); } }
- Cómo configurar Alarma para días laborables en android
- Cómo depurar aplicaciones en Amazon Kindle Fire con Eclipse en Mac?