从IntentService中创建的Wi-Fi Direct Channel清除本地服务

时间:2014-09-11 17:46:28

标签: android android-service wifi-direct service-discovery wifip2p

长篇道歉:

我正在实现一个需要无线发送数据的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}某个地方可以在下次更改值时获取,或者完全使用不同的设计(服务除外)。

0 个答案:

没有答案