長文のお詫び:
バックグラウンドジョブで近くの「ハブ」(私が制御する)にペアリングせずにデータをワイヤレスで送信する必要があるAndroid SDKを実装しています。Wi-Fi Direct P2P サービス ディスカバリを使用し、ハブが取得して処理する DNS レコードのエントリとしてデータを保存しています。発行する必要がある値は、スケジュールに従って実行される 2 つのサービスによって変更されるため、共有設定インスタンスに格納されます。
現在、私はローカルサービスを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);
}
そして、このサービスがフレームワークに追加されます (ハブでレコードを受信できるので、これが機能することはわかっています)。
問題は、値が変化したときに発生します。元のチャネルがまだ最初のチャネルで開いているため、このサービスの別のインスタンスを単純に開始することはできず、ハブによって 2 つのレコードが検出されます (各デバイスは、サービスの 1 つのインスタンスを 1 つのレコードでアドバタイズする必要があります)。mChannel
最初のものIntentService
はすでに終了/死亡しているため、クリアできません。サービスが存在した後もチャネルは存続します (p2p フレームワークは引き続き広告を表示します)。
私が試した/考えたいくつかのこと:
BroadcastReceiver
値が更新されたときに通知を受け取る各インスタンスに を追加してIntentService
、それ自体を適切に強制終了し ( を呼び出しmChannel.clearLocalServices()
)、新しいサービスを開始するか、同じチャネルでサービスをクリアして再広告することにより、元のインスタンスの値を更新します。- の後にサービスが終了し
discoverServices()
、レシーバーが呼び出されないため、機能しません
- の後にサービスが終了し
- フォアグラウンド サービス - UI とは無関係にバックグラウンドで実行する必要があり、ユーザーには知られていません。メインスレッドをハングアップしたくありません。
要するに、バックグラウンドでサービスの寿命を無期限に延ばし、ブロードキャストに応答できる効率的な方法が必要です(うまくいくかどうかはわかりません)。次に値が変更されたときにピックアップできる場所Thread.sleep
に保存しますmChannel
、または別のデザイン (サービス以外) を完全に使用します。