Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to pass values from a Class to Activity - Android

Tags:

java

android

I have a newbie question about Class/Task/Activity. I'm coming from C so I don't know if it's a good approach to do what I need.

I've created a class:

public class UDPServer {

    private MyDatagramReceiver myDatagramReceiver = null;

    private static int MAX_UDP_DATAGRAM_LEN = 1024;
    private static int UDP_SERVER_PORT = 5000;

    public void start() {
        myDatagramReceiver = new MyDatagramReceiver();
        myDatagramReceiver.start();
    }

    public void kill() {
        myDatagramReceiver.kill();
    }

    private class MyDatagramReceiver extends Thread {
        private boolean bKeepRunning = true;
        private String lastMessage = "";

        public void run() {
            String message;
            byte[] lmessage = new byte[MAX_UDP_DATAGRAM_LEN];
            DatagramPacket packet = new DatagramPacket(lmessage, lmessage.length);
            DatagramSocket socket = null;

            try
            {
                socket = new DatagramSocket(UDP_SERVER_PORT);

                while(bKeepRunning)
                {
                    socket.receive(packet);
                    message = new String(lmessage, 0, packet.getLength());
                    lastMessage = message;

                    //Here should call activity method

                });
                }

            }
            catch (Throwable e)
            {
                e.printStackTrace();
            }
            finally
            {
                if (socket != null)
                {
                    socket.close();
                }
            }
        }

        public void kill() {
            bKeepRunning = false;
        }
    }
}

Inside my Activity I've:

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

    mUDPServer = new UDPServer();
    mUDPServer.start();
}

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

    mUDPServer.kill();
}

Now, every time I received a packet I want that this thread/class pass received packet to an Activity method that elaborate(do some calculation or update some UI ecc..) this incoming data. But I can't figure how to do this, maybe my approach is not correct. I can place thread code inside Activity but it seems to make code less readable.

Suggestion how to do this?

@Anshul Jain CODE UPDATE:

    public class Main_activity extends Activity implements Interface_UDPServer{
    TextView recived_message;

    UDPServer mUDPServer;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        recived_message = (TextView)findViewById(R.id.recived_message);
    }

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

        mUDPServer = new UDPServer(this);
        mUDPServer.start();
    }

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

        mUDPServer.kill();
    }

    public void sendData(final String str){
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                recived_message.setText(str);
            }
        });
    }

}

XML file

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:layout_below="@+id/linearLayout"
        android:layout_alignLeft="@+id/linearLayout"
        android:layout_alignStart="@+id/linearLayout">
    <TextView
        android:id="@+id/recived_message"
        android:layout_width="200dp"
        android:layout_height="35dp"
        android:textColor="#444444"
        android:textSize="20dp" />
    </LinearLayout>
</RelativeLayout>
like image 936
Singee Avatar asked Jan 25 '16 14:01

Singee


People also ask

How do you pass an object in an intent?

One way to pass objects in Intents is for the object's class to implement Serializable. This interface doesn't require you to implement any methods; simply adding implements Serializable should be enough. To get the object back from the Intent, just call intent. getSerializableExtra .

How do I transfer data from one Android app to another?

Android uses the action ACTION_SEND to send data from one activity to another, even across process boundaries. You need to specify the data and its type. The system automatically identifies the compatible activities that can receive the data and displays them to the user.

What is the use of bundle in Android?

An Android App Bundle is a publishing format that includes all your app's compiled code and resources, and defers APK generation and signing to Google Play.


3 Answers

You can use Callback for this purpose.

Define some interface like

public interface MyCustomInterface(){
    public void sendData(String str);
}

Now let your Activity implement this interface.

public class MyActivity implements MyCustomInterface {

@Override
public void sendData(String str){

Handler handler = new Handler(Looper.getMainLooper());
handler.post(new Runnable() {
  @Override
  public void run() {
    recived_message.setText(str);
  }
});
}
}

Now in UDPServer.java, write the following code

public class UDPServer {

private MyCustomInterface interface;

UDPServer(MyCustomInterface interface){
 this.interface = interface; 
}

}

Now whenever you have some data available lets say a string, you can send it like this

interface.sendData(str);
like image 155
thedarkpassenger Avatar answered Sep 30 '22 02:09

thedarkpassenger


You have an A activity and B one, when you finish actions on B activity side you need it to effect A side when you come back.

  1. Create an Instance Class and a method that u type u need, let's say;

    public interface SelectedBirthday {
    
        void onSelectedData(String date);
    }
    
  2. Now we are on B side, Create an instance of your Interface Class

    private SelectedBirthday mCallback;
    
  3. Override

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
    
        try {
            mCallback = (SelectedBirthday) activity;
        } catch (ClassCastException e) {
            Log.d("MyDialog", "Activity doesn't implement the ISelectedData interface");
        }
    }
    
  4. Now upload the value you needed

    String userBirth = (day + " " + month + " " + year);
    
    mCallback.onSelectedData(userBirth);
    
  5. Ok let's go to A side

Implement our Interface Class

implements SelectedBirthday

it will warn you for its method and you implemented it

     @Override
        public void onSelectedData(String date) {
            if (!date.equals("")) {
                txt_poup_age.setText(date);
//now you are free to do what you want with the value you received automaticaly
            }
        }
like image 20
Samir Avatar answered Sep 30 '22 03:09

Samir


In android 4 option to do this

  • In android you can send data through Intent or Intent followed by Bundle.Like Intent i = new Intent(current_class.this, linked_class.class); i.putextra("Key", value);

And get the value(suppose string value) in another class like:

 String value = getIntent.getExtra("String key which you used when send value");
  • option 2

    class A{

    public static String _utfValue = "";

    void sendValue(){ _utfValue = "some value"; } }

And fetch this value in your java class like:

String value = A._utfValue ;
  • You can use SharedPreference to save the value and get it from other class.
  • You can use a static method with some return value and fetch the method in your java class through class name.
like image 36
AndroidChamp Avatar answered Sep 30 '22 04:09

AndroidChamp