Skip to content
This repository was archived by the owner on Aug 16, 2021. It is now read-only.

Receive_zh

晨鹤 edited this page Dec 20, 2017 · 3 revisions

通过监听器接收数据

WearTools 也提供了各式各样的监听器,你可以在任何地方注册它们。回调函数将运行在与监听器实例化的同一线程,因此,你可以方便地在回调中更新UI.

警告!! 不论何种监听器,如果要在 Activity 中实例化,请务必特别处理以免造成内存泄漏。详情请参见内存泄漏章节

监听 Message

实例化并注册 WTMessageListener 即可实现对 Message 的监听。 下面是一个简单的 Demo:

WTMessageListener messageListener = new WTMessageListener() {
	@Override
	public void onMessageReceived(String nodeId, String path, byte[] data, byte[] bothwayId) {
            Log.i(TAG, "Receive msg: " + new String(data));
	}
};
WTRegister.addMessageListener(context, messageListener); //注册

//WTRegister.removeMessageListener(context, messageListener); //移除

监听 DataMap

实例化并注册 WTMessageListener 即可实现对 Message 的监听。 下面是一个简单的 Demo:

WTDataListener dataListener = new WTDataListener() {
	@Override
	public void onDataChanged(String path, DataMap dataMap) {
      	//此回调对应 WTSender.sendData()
		Log.i(TAG, "Receive data: " + dataMap.getString("test"));
	}

	@Override
	public void onDataDeleted(String path) {
      	//此回调对应 WTSender.deleteData()
		Log.i(TAG, "Data deleted: " + path);
	}
};
WTRegister.addDataListener(context, dataListener); //注册

//WTRegister.removeDataListener(context, dataListener); //移除

从 DataMap 中取出 Asset 数据

上面提到,可以利用 Asset 传输较大的文件。 WearTools 提供了 AssetHelper.get() 来方便地取出数据。 下面是一个 Demo 展示如何取出上文发送的图片并显示:

@Override
public void onDataChanged(String path, DataMap dataMap) {
	super.onDataChanged(path, dataMap);
	
  	Log.i(TAG, "Receive image");
	Asset asset = dataMap.getAsset("image");
	AssetHelper.get(context, asset, new AssetHelper.AssetCallback() {
		@Override
		public void onResult(InputStream ins) {
			imageView.setImageBitmap(BitmapFactory.decodeStream(ins));
		}
	});
}

通过 Service 接收数据

有时我们仅仅需要默默地接收数据并处理,而不需要UI交互。此时便适用于使用 Service 来监听。

创建 Service

首先请创建一个类,并继承自 WTListenerService,此 Servie 的生命周期将由系统自动管理,你不需要手动启动或者停止服务。这些定义好的抽象方法与上述监听器类似,将在收到数据的时候被自动调用。 下面是一个简单的 Service Demo:

public class ListenerService extends WTListenerService {
    @Override
    public void onMessageReceived(String nodeId, String path, byte[] data, byte[] bothwayId) {
        
    }

    @Override
    public void onDataChanged(String path, DataMap dataMap) {

    }

    @Override
    public void onDataDeleted(String path) {

    }
}

注册 Service

之后记得在 manifest 里注册Service. 值得注意的是,必须指定 <intent-filter> ,里面必须指定 actiondata,否则服务将不会被启动,当中的函数也不会被执行。 有关 <intent-filter> 的详细资料,请参见谷歌文档

注意:所有的 com.google.android.gms.wearable 前缀需要替换为 com.mobvoi.android.wearable.

下面是一个注册了上述几个发送监听的 Demo:

<service android:name="cc.chenhe.lib.weartools.demo.ListenerService">
	<intent-filter>
		<action android:name="com.mobvoi.android.wearable.MESSAGE_RECEIVED" />
		<action android:name="com.mobvoi.android.wearable.DATA_CHANGED" />
		<data
			android:host="*"
			android:path="/image"
			android:scheme="wear" />
		<data
			android:host="*"
			android:path="/data/test"
			android:scheme="wear" />
		<data
			android:host="*"
			android:path="/msg/test"
			 android:scheme="wear" />
	</intent-filter>
</service>

注意: 曾经的 BIND_LISTENER action 已经不再支持,注册 BIND_LISTENER 不会收到任何回调。

Clone this wiki locally