Я создали приложение, которое делает следующие шаги очень хорошо -процесса и создавать записи в фоновом режиме
соединяется с удаленным устройством (
SPP
), используя разъем Bluetooth.Затем прослушивает поток, поступающий с удаленного устройства Bluetooth в отдельной теме.
Затем, когда поступает поток данных, он передает поток данных обработчику для его анализа.
Когда данные обрабатываются, то широковещательный посылается и создаются записи в базу данных.
Теперь я хочу, чтобы добавить новую функциональность -
Когда приложение находится в заднем месте и «подключен» к удаленному устройству, он должен продолжать обрабатывать поток данных и создавать записи.
Итак, как только я подключу сокет, я передаю результат «подключен» к методу onPostExecute()
.
ВАЖНО:
1) Мои все гнезда соответствующей работы (подключение гнездо, гнездо синтаксического анализа данных, обработчик данных) в фрагменте.
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) Я подключен так что-то из onPostExecute() из AsyncTask parseStre Я
@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, с намерением, что он будет выполнять, когда приложение будет идти фоновые и данные процесса. Но тогда как он будет взаимодействовать с Фрагментом, потому что вся моя работа обработки данных находится во фрагменте. Я действительно нуждаюсь в этом для обработки данных. Или я должен позвонить
вещательный приемник здесь, поскольку он также может обрабатываться в фоновом режиме?
Нужно ли нам звонить службе через определенные промежутки времени, чтобы получить данные из сокета? Я уже реализовал логику подключения и обработки данных в фрагменте, поэтому мне нужно перенести его в класс BluetoothManager, как в коде выше? Предполагается, что служба запускается после подключения сокета из этого фрагмента, поэтому я думаю, что класс BluetoothManager должен быть повторно реализован. Посмотрите мое обновление! –
@VedPrakash, вам не нужно будет звонить в службу через определенные промежутки времени. Служба уведомляет (путем отправки нового сообщения) основную тему каждый раз, когда появляются новые данные. – bmartins
@VedPrakash, я также добавлю, что вы действительно должны учитывать последствия работы вашего bluetooth-процесса в фрагменте. Вы подвергаетесь управлению жизненным циклом Android и не можете должным образом повторно использовать свой рабочий процесс bluetooth вне области вашего фрагмента. – bmartins