Сервис, JobScheduler или что-то еще? - PullRequest
0 голосов
/ 19 февраля 2020

Я должен установить процесс получения данных Bluetooth в фоновом режиме, чтобы мне не приходилось находиться в приложении, а данные по-прежнему принимаются. Было бы неплохо иметь уведомление, чтобы вы знали, когда данные получают, и не забудьте отключить их, когда они вам больше не нужны. Каков наилучший способ сделать это? Простой передний приемник? Как отправить серийные данные в Acitvity? JobScheduler? Что-то другое? Вот код, который должен быть установлен в фоновом режиме.

    public class MainActivity extends Activity {

    Handler bluetoothIn;

    final int handlerState = 0;                
    private BluetoothAdapter btAdapter = null;
    private BluetoothSocket btSocket = null;
    private StringBuilder recDataString = new StringBuilder();

    private ConnectedThread mConnectedThread;

    private static final UUID BTMODULEUUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");

    private static String address;

    public static String EXTRA_DEVICE_ADDRESS = "device_address";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

          bluetoothIn = new Handler() {
            public void handleMessage(android.os.Message msg) {
                if (msg.what == handlerState) {                                     
                    String readMessage = (String) msg.obj;                                                                
                    recDataString.append(readMessage);                                     
                    int endOfLineIndex = recDataString.indexOf("~");                   
                    if (endOfLineIndex > 0) {                                          
                        String dataInPrint =recDataString.substring
(0,endOfLineIndex);    
                       int dataLength = dataInPrint.length();                         
                        if (dataLength==13)
                        {
                            //something

                            if (
                                //something
                        )                            
                        {
                            String sensor0 = recDataString.substring(1, 3);             

                            sendDataMethod(sensor0);

                        }
                    }
                        recDataString.delete(0, recDataString.length());      
                    }
                }
            }
        };

        btAdapter = BluetoothAdapter.getDefaultAdapter();      
        checkBTState();
    }

    private void sendDataMethod(String sensor0) {
          //some math
        Log.e("TAG0",Struja1);

    }
    private BluetoothSocket createBluetoothSocket(BluetoothDevice device) throws IOException {

        return  device.createRfcommSocketToServiceRecord(BTMODULEUUID);
          }

    @Override
    public void onResume() {
        super.onResume();

        Intent intent = getIntent();

        address = intent.getStringExtra("EXTRA_DEVICE_ADDRESS");

        int pos = address.indexOf("\n");
        int pos1 = address.indexOf(" ", pos);

        String second = address.substring(pos+1, pos1);

        BluetoothDevice device = btAdapter.getRemoteDevice(second);

        try {
            btSocket = createBluetoothSocket(device);
        } catch (IOException e) {
            Toast.makeText(getBaseContext(), "Socket creation failed", Toast.LENGTH_LONG).show();
        }
        try
        {
            btSocket.connect();
        } catch (IOException e) {
            try
            {
                btSocket.close();
            } catch (IOException e2)
            {
           }
        }
        mConnectedThread = new ConnectedThread(btSocket);
        mConnectedThread.start();

    }

    @Override
    public void onPause()
    {
        super.onPause();
        try
        {
            btSocket.close();
        } catch (IOException e2) {
        }
    }

    private void checkBTState() {
        //code to check
    }

    private class ConnectedThread extends Thread {
        private final InputStream mmInStream;
        private final OutputStream mmOutStream;

        public ConnectedThread(BluetoothSocket socket) {
            InputStream tmpIn = null;
            OutputStream tmpOut = null;

            try {
                tmpIn = socket.getInputStream();
                tmpOut = socket.getOutputStream();
            } catch (IOException e) { }

            mmInStream = tmpIn;
            mmOutStream = tmpOut;
        }
        public void run() {
            byte[] buffer = new byte[1024];
            int bytes;

            while (true) {
                try {
                    bytes = mmInStream.read(buffer);            
                    String readMessage = new String(buffer, 0, bytes);
                    bluetoothIn.obtainMessage(handlerState, bytes, -1, readMessage).sendToTarget();
                } catch (IOException e) {
                    break;
                }
            }
        }

        public void write(String input) {
            byte[] msgBuffer = input.getBytes();          
            try {
                mmOutStream.write(msgBuffer);              
            } catch (IOException e) {
                Toast.makeText(getBaseContext(), "Connection Failure", Toast.LENGTH_LONG).show();
                finish();

            }
        }
    }
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...