3

长篇大论致歉:

我正在实现一个 android SDK,它需要无线发送数据,而无需在后台作业中与附近的“集线器”(我控制)配对。我正在使用 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(),接收者没有被调用
  • 前台服务 - 需要在后台运行,独立于 UI,并且用户不知道。不想挂断主线程。

简而言之,我需要一种有效的方法来无限期地延长后台服务的生命周期,并且仍然能够响应广播(所以不确定是否Thread.sleep可行),存储mChannel下次值更改时可以拾取的地方,或完全使用不同的设计(服务除外)。

4

0 回答 0