2014-10-21 23 views
6

WearableListenerService Wenn ich über die Kommunikation zwischen einem Activity und Service lesen, fand ich, dass wir entwederDaten von einer Aktivität Senden

  • IBinder
  • Messenger
  • AIDL

ich verwenden kann, Ich bin an den ersten beiden interessiert. Also, als ich versuchte, dies zu implementieren, um zwischen einem Activity und WearableListenerService zu kommunizieren, musste ich die onBind Funktion überschreiben.

Aber dann bin ich einen Compiler-Fehler immer sagen, es

nicht letzte Methode außer Kraft setzen kann „onBind“

ich nicht einen solchen Fehler, wenn ich einen normalen Service verwenden. So

1. Heißt das, wir nicht IBinder oder Messenger Ansatz können mit dem WearableListenerService von einem Activity zu kommunizieren?

2. Wenn ja, was ist die nächste beste Art und Weise Nachricht an WearableListenerService von einem Activity zu passieren (oder eine öffentliche Methode dieses Dienstes von einer Aktivität zu nennen)?

+0

https://developer.android.com/training/ wearables/data-layer/events.html – pskink

+0

@pskink Ich spreche über das Senden von Daten von einer Aktivität an einen 'WearableListenerService' (oder das Auslösen einer öffentlichen Funktion im 'WearableListenerService' von der Aktivität). Aber die Data-Layer-API-Beispiele in der Verknüpfung bietet Details zum Abhören der Ereignisse von "WearableListenerService" und nicht die andere Art und Weise – BlackCursor

+1

nie damit gespielt, aber ist nicht "onMessageReceived()" dafür? – pskink

Antwort

14

Nach einigem Graben fand ich die Lösung. Hoffe es hilft jemand anderem.

Wir können eine Nachricht von einer Aktivität zu WearableListenerService mit Wearable.MessageApi Funktionen senden. Wenn die Activity und WearableListenerService auf demselben Knoten (Gerät) sind, müssen wir das Beispiel des lokalen Knotens (aktuelle Knoten, von dem die Nachricht gesendet wird) zum Senden der Nachricht, wie unten

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

zu erhalten statt

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

die verwendet wird, um die Liste der anderen Geräte (wie Verschleiß) mit dem Telefon verbunden zu bekommen.

Also, ich konnte erfolgreich eine Nachricht von meiner Aktivität zu WearableListenerService senden, wie

folge

Aktivität Code

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"); 
      } 
     } 
    } 
} 

Servicecode

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()); 
    } 
} 
Verwandte Themen