gpt4 book ai didi

android - 将数据从 Activity 发送到 WearableListenerService

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:28:59 26 4
gpt4 key购买 nike

当我读到 ActivityService 之间的通信时,我发现我们可以使用其中之一

  • IBinder
  • 信使
  • AIDL

我对前两个感兴趣。因此,当我尝试实现此功能以在 ActivityWearableListenerService 之间进行通信时,我需要覆盖 onBind 函数。

但是,我得到一个编译器错误提示

cannot override final method "onBind"

当我使用普通的 Service 时,我不会收到这样的错误。所以,

1. 这是否意味着我们不能使用 IBinderMessenger 方法与 WearableListenerService 进行通信 Activity ?

2. 如果是这样,从 Activity(或调用该服务来自 Activity )?

最佳答案

经过一番挖掘,我找到了解决方案。希望对其他人有帮助。

我们可以使用 Wearable.MessageApi 函数将消息从 Activity 发送到 WearableListenerService。当ActivityWearableListenerService在同一个Node(设备)上时,我们需要获取本地节点的实例(当前节点来自哪个节点)消息已发送)用于发送消息如下

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

而不是

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

用于获取手机连接的其他设备(比如wear)的列表。

因此,我能够成功地将一条消息从我的 Activity 发送到 WearableListenerService,如下所示

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

Service Code

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

关于android - 将数据从 Activity 发送到 WearableListenerService,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26479193/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com