我创建了一个可以很好地执行以下步骤的应用程序 -
SPP
使用蓝牙插座与远程设备 ( ) 连接。然后在单独的线程中侦听来自远程蓝牙设备的流。
然后当数据流到来时,它将数据流传递给处理程序进行解析。
解析数据时,会发送广播并将记录创建到数据库中。
现在我想添加一个新功能 -
当应用程序在后台并“连接”到远程设备时,它需要继续处理数据流并创建记录。
因此,一旦我连接了套接字,我就会将结果“连接”传递给该onPostExecute()
方法。
重要的提示:
1)我所有与socket相关的工作(socket连接、socket数据解析、数据处理程序)都在fragment中。
2)一旦建立连接,片段中的私有类(Thread - ConnectedThread.java)一直在监听InputStream
public class EntryFragment extends Fragment{
//More fragment code here then this
public class ConnectedThread extends Thread {
public ConnectedThread(BluetoothSocket socket) {
//code initialization stuff
}
public void run() {
// Keep listening to the InputStream until an exception occurs
while (true)
{
// Read from the InputStream
if(mmInStream.available() > 0)
{
bytes = mmInStream.read(buffer);
mHandler.obtainMessage(MESSAGE_READ,
bytes, -1, buffer).sendToTarget();
}
}
}
}
3)处理步骤 2 的读取的处理程序
case MESSAGE_READ:
//Call to AsyncTask to do background processing of data
new parseStream(getActivity()).execute();
break;
4)我已经连接,所以从 AsyncTask parseStream 的 onPostExecute() 做一些事情
@Override
protected void onPostExecute(Void result) {
//Database related work here
//Result is connected so listen to data if app goes to background after this state
if(result.equals("connected"))
{
Log.i(TAG, "CONNECTED TO Remote Device!");
Toast.makeText(getActivity(),"CONNECTED TO Remote
Device!",Toast.LENGTH_SHORT).show();
//Do something when connected
setSetting("STATUS", "Connected");
// Start the thread to manage the connection and perform transmissions
mConnectedThread = new ConnectedThread(socket);
mConnectedThread.start();
//Do I need to call Service here to handle data ?????
Intent serviceIntent= new Intent(context, DataProcessService.class);
getActivity().startService(serviceIntent);
}
}
5)我在步骤 4 中调用了服务,目的是在应用程序进入后台并处理数据时执行。但是接下来它将如何与 Fragment 通信,因为我的整个数据处理工作都在 Fragment 中。我真的需要它来处理数据还是应该
在这里调用广播接收器,因为它也可以在后台处理?