title: How to send data sent by BLE Device in a fragment to a new activity for display and plotting graph in app?
body: <p>I am completely new to Android and just learned Object-oriented programming. My project requires me to build something on open-source code. I am really struggling with this special case. Two fragments are under activity_main, one of them is TerminalFragment. I added a menuItem (R.id.plot) in it and set if the user clicks this Item that will lead him from TerminalFragment to activity_main2. Due to receive(byte data) and TerminalFragment still on active, the data is still printing out by receiveText.append(TextUtil.toCaretString(msg, newline.length() != 0)); in activity_main.</p>
  <p>Now, I want to convert the data to String and send it to activity_main2 for display in recyclerview and plotting graph.  I am trying to use putextra and getextra but not sure how to access data from getextra in activity_main2. In my testing, the recyclerview just showed &quot;John&quot;. Is something missing in my method? Does anyone have a better idea? Much Appreciated.</p>
  <p>TerminalFragment</p>
  <pre><code>package de.kai_morich.simple_bluetooth_le_terminal;
  
  import android.app.Activity;
  import android.app.AlertDialog;
  import android.bluetooth.BluetoothAdapter;
  import android.bluetooth.BluetoothDevice;
  import android.content.ComponentName;
  import android.content.Context;
  import android.content.Intent;
  import android.content.ServiceConnection;
  import android.os.Bundle;
  import android.os.IBinder;
  import android.text.Editable;
  import android.text.Spannable;
  import android.text.SpannableStringBuilder;
  import android.text.method.ScrollingMovementMethod;
  import android.text.style.ForegroundColorSpan;
  import android.view.LayoutInflater;
  import android.view.Menu;
  import android.view.MenuInflater;
  import android.view.MenuItem;
  import android.view.View;
  import android.view.ViewGroup;
  import android.widget.TextView;
  import android.widget.Toast;
  import androidx.appcompat.app.AppCompatActivity;
  import android.widget.EditText;
  
  import androidx.annotation.NonNull;
  import androidx.annotation.Nullable;
  import androidx.fragment.app.Fragment;
  
  public class TerminalFragment extends Fragment implements ServiceConnection, SerialListener {
  
      private MenuItem menuItem;
      private enum Connected { False, Pending, True }
  
      private String deviceAddress;
      private SerialService service;
  
      private TextView receiveText;
      private TextView sendText;
      private TextUtil.HexWatcher hexWatcher;
  
      private Connected connected = Connected.False;
      private boolean initialStart = true;
      private boolean hexEnabled = false;
      private boolean pendingNewline = false;
      private String newline = TextUtil.newline_crlf;
      private String output;
  
      /*
       * Lifecycle
       */
      @Override
      public void onCreate(@Nullable Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setHasOptionsMenu(true);
          //Register with activity
          // You must inform the system that your app bar fragment is participating in the population of the options menu.
          // tells the system that your fragment would like to receive menu-related callbacks.
  
          setRetainInstance(true);
          deviceAddress = getArguments().getString(&quot;device&quot;);
      }
  
      @Override
      public void onDestroy() {
          if (connected != Connected.False)
              disconnect();
          getActivity().stopService(new Intent(getActivity(), SerialService.class));
          super.onDestroy();
      }
  
      @Override
      public void onStart() {
          super.onStart();
          if(service != null)
              service.attach(this);
          else
              getActivity().startService(new Intent(getActivity(), SerialService.class)); // prevents service destroy on unbind from recreated activity caused by orientation change
      }
  
      @Override
      public void onStop() {
          if(service != null &amp;&amp; !getActivity().isChangingConfigurations())
              service.detach();
          super.onStop();
      }
  
      @SuppressWarnings(&quot;deprecation&quot;) // onAttach(context) was added with API 23. onAttach(activity) works for all API versions
      @Override
      public void onAttach(@NonNull Activity activity) {
          super.onAttach(activity);
          getActivity().bindService(new Intent(getActivity(), SerialService.class), this, Context.BIND_AUTO_CREATE);
      }
  
      @Override
      public void onDetach() {
          try { getActivity().unbindService(this); } catch(Exception ignored) {}
          super.onDetach();
      }
  
      @Override
      public void onResume() {
          super.onResume();
          if(initialStart &amp;&amp; service != null) {
              initialStart = false;
              getActivity().runOnUiThread(this::connect);
          }
      }
  
      @Override
      public void onServiceConnected(ComponentName name, IBinder binder) {
          service = ((SerialService.SerialBinder) binder).getService();
          service.attach(this);
          if(initialStart &amp;&amp; isResumed()) {
              initialStart = false;
              getActivity().runOnUiThread(this::connect);
          }
      }
  
      @Override
      public void onServiceDisconnected(ComponentName name) {
          service = null;
      }
  
      /*
       * UI
       */
      @Override
      public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
          View view = inflater.inflate(R.layout.fragment_terminal, container, false);
          receiveText = view.findViewById(R.id.receive_text);                          // TextView performance decreases with number of spans
          receiveText.setTextColor(getResources().getColor(R.color.colorRecieveText)); // set as default color to reduce number of spans
          receiveText.setMovementMethod(ScrollingMovementMethod.getInstance());
  
          sendText = view.findViewById(R.id.send_text);
          hexWatcher = new TextUtil.HexWatcher(sendText);
          hexWatcher.enable(hexEnabled);
          sendText.addTextChangedListener(hexWatcher);
          sendText.setHint(hexEnabled ? &quot;HEX mode&quot; : &quot;&quot;);
  
          View sendBtn = view.findViewById(R.id.send_btn);
          sendBtn.setOnClickListener(v -&gt; send(sendText.getText().toString()));
          return view;
      }
  
      @Override
      public void onCreateOptionsMenu(@NonNull Menu menu, MenuInflater inflater) {
          inflater.inflate(R.menu.menu_terminal, menu);
          menu.findItem(R.id.hex).setChecked(hexEnabled);
      }
  
      @Override
      public boolean onOptionsItemSelected(MenuItem item) {
          int id = item.getItemId();
          if (id == R.id.clear) {
              receiveText.setText(&quot;&quot;);
              return true;
          } if (id == R.id.plot){
              Intent intent = new Intent(getActivity(), MainActivity2.class);
              startActivity(intent);
              //receive.;
              return true;
          }else if (id == R.id.newline) {
              String[] newlineNames = getResources().getStringArray(R.array.newline_names);
              String[] newlineValues = getResources().getStringArray(R.array.newline_values);
              int pos = java.util.Arrays.asList(newlineValues).indexOf(newline);
              AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
              builder.setTitle(&quot;Newline&quot;);
              builder.setSingleChoiceItems(newlineNames, pos, (dialog, item1) -&gt; {
                  newline = newlineValues[item1];
                  dialog.dismiss();
              });
              builder.create().show();
              return true;
          } else if (id == R.id.hex) {
              hexEnabled = !hexEnabled;
              sendText.setText(&quot;&quot;);
              hexWatcher.enable(hexEnabled);
              sendText.setHint(hexEnabled ? &quot;HEX mode&quot; : &quot;&quot;);
              item.setChecked(hexEnabled);
              return true;
          } else {
              return super.onOptionsItemSelected(item);
          }
      }
  
      /*
       * Serial + UI
       */
      private void connect() {
          try {
              BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
              BluetoothDevice device = bluetoothAdapter.getRemoteDevice(deviceAddress);
              status(&quot;connecting...&quot;);
              connected = Connected.Pending;
              SerialSocket socket = new SerialSocket(getActivity().getApplicationContext(), device);
              service.connect(socket);
          } catch (Exception e) {
              onSerialConnectError(e);
          }
      }
  
      private void disconnect() {
          connected = Connected.False;
          service.disconnect();
      }
  
      private void send(String str) {
          if(connected != Connected.True) {
              Toast.makeText(getActivity(), &quot;not connected&quot;, Toast.LENGTH_SHORT).show();
              return;
          }
          try {
              String msg;
              byte[] data;
              if(hexEnabled) {
                  StringBuilder sb = new StringBuilder();
                  TextUtil.toHexString(sb, TextUtil.fromHexString(str));
                  TextUtil.toHexString(sb, newline.getBytes());
                  msg = sb.toString();
                  data = TextUtil.fromHexString(msg);
              } else {
                  msg = str;
                  data = (str + newline).getBytes();
              }
              SpannableStringBuilder spn = new SpannableStringBuilder(msg + '\n');
              spn.setSpan(new ForegroundColorSpan(getResources().getColor(R.color.colorSendText)), 0, spn.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
              receiveText.append(spn);
              service.write(data);
          } catch (Exception e) {
              onSerialIoError(e);
          }
      }
  
      private void receive(byte[] data) {
          if(hexEnabled) {
              receiveText.append(&quot;Hello&quot; + TextUtil.toHexString(data) + '\n');
          } else {
              String msg = new String(data);
              if(newline.equals(TextUtil.newline_crlf) &amp;&amp; msg.length() &gt; 0) {
                  // don't show CR as ^M if directly before LF
                  msg = msg.replace(TextUtil.newline_crlf, TextUtil.newline_lf);
                  // special handling if CR and LF come in separate fragments
                  if (pendingNewline &amp;&amp; msg.charAt(0) == '\n') {
                      Editable edt = receiveText.getEditableText();
                      if (edt != null &amp;&amp; edt.length() &gt; 1)
                          edt.replace(edt.length() - 2, edt.length(), &quot;&quot;);
                  }
                  pendingNewline = msg.charAt(msg.length() - 1) == '\r';
              }
              receiveText.append(TextUtil.toCaretString(msg, newline.length() != 0)); //print out data
              output = receiveText.toString(); // CharSequence to String
              Intent intent = new Intent(getActivity(), MainActivity2.class);
              intent.putExtra(&quot;output&quot;,output); // send data to next activity, MainActivity2
          }
      }
  
      private void status(String str) {
          SpannableStringBuilder spn = new SpannableStringBuilder(str + '\n');
          spn.setSpan(new ForegroundColorSpan(getResources().getColor(R.color.colorStatusText)), 0, spn.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
          receiveText.append(spn);
      }
  
      /*
       * SerialListener
       */
      @Override
      public void onSerialConnect() {
          status(&quot;connected&quot;);
          connected = Connected.True;
      }
  
      @Override
      public void onSerialConnectError(Exception e) {
          status(&quot;connection failed: &quot; + e.getMessage());
          disconnect();
      }
  
      @Override
      public void onSerialRead(byte[] data) {// receive data
          receive(data); // send data to printout
      }
  
      @Override
      public void onSerialIoError(Exception e) {
          status(&quot;connection lost: &quot; + e.getMessage());
          disconnect();
      }
  
  }
  </code></pre>
  <p>MainActivity2.java (new activity)</p>
  <pre><code>package de.kai_morich.simple_bluetooth_le_terminal;
  
  import androidx.appcompat.app.AppCompatActivity;
  import androidx.appcompat.widget.Toolbar;
  import androidx.fragment.app.Fragment;
  import androidx.fragment.app.FragmentManager;
  import androidx.fragment.app.FragmentTransaction;
  import androidx.recyclerview.widget.DefaultItemAnimator;
  import androidx.recyclerview.widget.LinearLayoutManager;
  import androidx.recyclerview.widget.RecyclerView;
  
  import android.os.Bundle;
  import android.view.Menu;
  import android.view.MenuInflater;
  import android.view.MenuItem;
  import android.widget.Toast;
  
  import java.util.ArrayList;
  
  public class MainActivity2 extends AppCompatActivity {
  
      Fragment CustomFragment;
      private ArrayList&lt;Data&gt; dataList;
      private RecyclerView recyclerView;
  
      @Override
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main2);
          Toolbar toolbar = findViewById(R.id.toolbar2);
          setSupportActionBar(toolbar);
          recyclerView = findViewById(R.id.dataflow);
          dataList = new ArrayList&lt;&gt;();
          String data;
          if (savedInstanceState == null) {
              Bundle extra = getIntent().getExtras();
              if (extra == null) {
                  data = null;
                  receiveData(data);
              } else {
                  data = extra.getString(&quot;output&quot;);
                  receiveData(data);
              }
          } else {
              data = (String) savedInstanceState.getSerializable(&quot;output&quot;);
              receiveData(data);
          }
          setAdapter();
      }
  
      private void receiveData(String data){
          String Data = data;
          dataList.add(new Data(&quot;John&quot;));
          dataList.add(new Data(Data));
      }
  
      private void setAdapter() {
          recyclerAdapter adapter = new recyclerAdapter(dataList);
          RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getApplicationContext());
          recyclerView.setLayoutManager(layoutManager);
          recyclerView.setItemAnimator(new DefaultItemAnimator());
          recyclerView.setAdapter(adapter);
      }
  
      @Override
      public boolean onCreateOptionsMenu(Menu menu) {
          MenuInflater inflater = getMenuInflater();
          inflater.inflate(R.menu.menu_plot, menu);
          return true;
      }
  
      @Override
      public boolean onOptionsItemSelected(MenuItem item) {
          switch (item.getItemId()) {
              case R.id.dataplot:
                  Toast.makeText(this, &quot;dataplot&quot;, Toast.LENGTH_SHORT).show();
                  replaceFragment(new DataPlotFragment());
                  return true;
              case R.id.fft:
                  Toast.makeText(this, &quot;FFT&quot;, Toast.LENGTH_SHORT).show();
                  replaceFragment(new FftFragment());
                  return true;
              case R.id.data:
                  Toast.makeText(this, &quot;DATA&quot;, Toast.LENGTH_SHORT).show();
                  finish();
                  return true;
              default:
                  return super.onOptionsItemSelected(item);
          }
      }
      private void replaceFragment(Fragment fragment){
  
          FragmentManager fragmentManager = getSupportFragmentManager();
          FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
          fragmentTransaction.replace(R.id.plotframelayout,fragment);
          fragmentTransaction.commit();
      }
  
  
  }
  </code></pre>