长篇道歉:
我正在实现一个需要无线发送数据的android SDK,而无需在后台作业中与附近的" hubs" (我控制)。我正在使用Wi-Fi Direct P2P服务发现并将我的数据存储为集线器接收和处理的DNS记录中的条目。我需要将它发出的值存储在共享首选项实例中,因为它是由按计划运行的两个服务更改的。
目前,我有一个在IntentService
中宣传本地服务的流程。它获得了它应该从其意图做出宣传的价值:
protected void onHandleIntent(Intent intent) {
val = intent.getStringExtra(AppConstants.EXTRA_VALUE);
mManager = (WifiP2pManager) getSystemService(Context.WIFI_P2P_SERVICE);
mChannel = mManager.initialize(this, getMainLooper(), null);
mRecord = new HashMap<String, String>();
mRecord.put(AppConstants.RECORD_KEY, val);
mService = WifiP2pDnsSdServiceInfo.newInstance(
AppConstants.SERVICE_INSTANCE, AppConstants.SERVICE_REG_TYPE, mRecord);
mManager.addLocalService(mChannel, mService, addServiceListener);
mManager.setDnsSdResponseListeners(mChannel, dnsSdServiceResponseListener,
dnsSdTxtRecordListener);
mManager.addServiceRequest(mChannel, mRequest, addServiceRequestListener);
mManager.discoverServices(mChannel, serviceDiscoveryListener);
}
此服务已添加到框架中(我知道这样可行,因为我可以在我的集线器上接收记录)。
价值变化时出现问题。我不能简单地启动此服务的另一个实例,因为原始通道仍然在第一个打开,因此我的集线器将找到两个记录(每个设备应该通过一个记录通告我的一个服务实例)。我无法再清除mChannel
,因为第一个IntentService
已经退出/死亡。服务存在后,频道仍然存在(p2p框架仍然看到广告)。
我尝试/考虑的一些事情:
BroadcastReceiver
实例添加IntentService
,以便在更新值时收到通知,以便自行适当地终止(调用mChannel.clearLocalServices()
)并启动新服务,或者只是更新通过同一频道上的清除和广告服务在原始实例中的值
discoverServices()
之后死亡,而接收方未被称为简而言之,我需要一种有效的方法来无限期地在后台延长服务的生命,并且仍然能够响应广播(因此不确定Thread.sleep
是否有效),存储{{1}某个地方可以在下次更改值时获取,或者完全使用不同的设计(服务除外)。