How to peek into Intent Extras in Android - android

I have an application that starts Activity with extras. I would like to see what extras are inside Intent. Both applications (calling and called) are not written by me.

Send the data first:
Intent i = new Intent(YourActivity.class);
i.putExtra("parameter", yourData)
startActivity(i);
To get the data :
Intent i = getIntent();
String data = i.getStringExtra("parameter"); //you can do for integer, etc

Related

My question is about intents in android studio. How can i send data between activities through intents

Is it possible to send data of multiple Edit texts to 2nd activity and show that data on single Text View? If possible than how?
You have to write this code where you call new activity
Intent intent = new Intent(this, yourActivity.class);
intent.putExtra("textOfEditText1",editText1.getText().toString());
intent.putExtra("textOfEditText2",editText2.getText().toString());
startActivity(intent);
And This code in your second activity's onCreate() method
Bundle b = getIntent().getExtras();
String s= b.get("textOfEditText1");
String s2=b.get("textOfEditText2");
textView.setText(s+s2);

Android Passing data to intents

I have three activities in my android application, and i am trying to get user input data from the first activity and pass it to the third activity while at the same time I launch the second activity which also gets the user input data and will also pass the data to the third activity. any ideas on how i should go about this?
The Way of passing data from Intent is shown below, try passing data same way from ActivityOne -> ActvityTwo -> ActivityThree.
Intent intent = new Intent(ActivityOne.this, ActivityTwo.class);
intent.putExtra("some_key_from_one", some_value_from_one);
startActivity(intent);
Then in the new Activity, retrieve those values:
Bundle extras = getIntent().getExtras();
if (extras != null) {
String value = extras.getString("some_key_from_one");
//The key argument here must match that used in the other activity
}

How to send object of calling activity to called activity

From activity
Intent intent = new Intent(lamps.this,light_control.class).putExtra("variable",lamps.this);
startActivity(intent);
To Activity
Intent intent = getIntent();
lampvaiable = (lamps)intent.getSerializableExtra("variable");
I have to use object of lamp.this activity in light_control.class activity but startActivity(intent) is not getting called .
I am getting java.io.NotSerializableException
First of all make class Serializable, the object of which your are sending the
Intent i = new Intent();
i.putExtra("variable", (Serializable) Object);
Then receive as
Intent intent = getIntent();
lamps lamp = (Lamps) intent.getExtras().getSerializable("variable");
Use Gson library for this purpose. Convert a object to string by Gson then send it to another activity. Get that string from intent and convert it to Object
Be aware that bundle can holds onto a max size of arguments (1MB, If I'm not mistaken). If this is a huge object you will get a TransactionTooLargeExceptionexception. So please be advise to consider other methods (Local Storage, DataManager that would hold the object, etc.)

How to send string from one activity to another?

I have a string in activity2
String message = String.format(
"Current Location \n Longitude: %1$s \n Latitude: %2$s", lat, lng);
I want to insert this string into text field in activity1. How can I do that?
You can use intents, which are messages sent between activities. In a intent you can put all sort of data, String, int, etc.
In your case, in activity2, before going to activity1, you will store a String message this way :
Intent intent = new Intent(activity2.this, activity1.class);
intent.putExtra("message", message);
startActivity(intent);
In activity1, in onCreate(), you can get the String message by retrieving a Bundle (which contains all the messages sent by the calling activity) and call getString() on it :
Bundle bundle = getIntent().getExtras();
String message = bundle.getString("message");
Then you can set the text in the TextView:
TextView txtView = (TextView) findViewById(R.id.your_resource_textview);
txtView.setText(message);
You can send data from one actvity to another with an Intent
Intent sendStuff = new Intent(this, TargetActivity.class);
sendStuff.putExtra(key, stringvalue);
startActivity(sendStuff);
You then can retrieve this information in the second activity by getting the intent and extracting the string extra. Do this in your onCreate() method.
Intent startingIntent = getIntent();
String whatYouSent = startingIntent.getStringExtra(key, value);
Then all you have to do is call setText on your TextView and use that string.
TWO CASES
There are two situations possible when we talk about passing data between activities.
Let's say there are two activities A and B and there is a String X. and you are in Activity A.
Now let's see the two cases
A-------->B
A<--------B
CASE 1:
String X is in A and you want to get it in Activity B.
It is very straightforward.
In Activity A.
1) Create Intent
2) Put Extra value
3) startActivity
Intent i = new Intent(A.this, B.class);
i.putExtra("Your_KEY",X);
startActivity(i)
In Activity B
Inside onCreate() method retrieve string X using the key which you used while storing X (Your_KEY).
Intent i = getIntent();
String s = i.getStringExtra("Your_KEY");
Case 2:
This case is little tricky if u are new to Android
development Because you are in Activity A, you move to Activity B,
collect the string, move back to Activity A and retrieve the
collected String or data. Let's see how to deal with this situation.
In Activity A
1) Create Intent
2) start an activity with a request code.
Intent i = new Intent(A.this, B.class);
startActivityForResult(i,your_req_code);
In Activity B
1) Put string X in intent
2) Set result
3) Finish activity
Intent returnIntent = new Intent();
returnIntent .putString("KEY",X);
setResult(resCode,returnIntent); // for the first argument, you could set Activity.RESULT_OK or your custom rescode too
finish();
Again in Activity A
1) Override onActivityResult method
onActivityResult(int req_code, int res_code, Intent data)
{
if(req_code==your_req_code)
{
String X = data.getStringExtra("KEY")
}
}
Further understanding of Case 2
You might wonder what is the reqCode, resCode in the onActivityResult(int reqCode, resCode, Intent data)
reqCode is useful when you have to identify from which activity you are getting the result from.
Let's say you have two buttons, one button starts Camera (you click a photo and get the bitmap of that image in your Activity as a result), another button starts GoogleMap( you get back the current coordinates of your location as a result). So to distinguish between the results of both activities you start CameraActivty and MapActivity with different request codes.
resCode: is useful when you have to distinguish between how results are coming back to requesting activity.
For eg: You start Camera Activity. When the camera activity starts, you could either take a photo or just move back to requesting activity without taking a photo with the back button press. So in these two situations, your camera activity sends result with different resCode ACTIVITY.RESULT_OK and ACTIVITY.RESULT_CANCEL respectively.
Relevant Links
Read more on Getting result
Say there is EditText et1 in ur MainActivity and u wanna pass this to SecondActivity
String s=et1.getText().toString();
Bundle basket= new Bundle();
basket.putString("abc", s);
Intent a=new Intent(MainActivity.this,SecondActivity.class);
a.putExtras(basket);
startActivity(a);
now in Second Activity, say u wanna put the string passed from EditText et1 to TextView txt1 of SecondActivity
Bundle gt=getIntent().getExtras();
str=gt.getString("abc");
txt1.setText(str);
Intent intent = new Intent(activity1.this, activity2.class);
intent.putExtra("message", message);
startActivity(intent);
In activity2, in onCreate(), you can get the String message by retrieving a Bundle (which contains all the messages sent by the calling activity) and call getString() on it :
Bundle bundle = getIntent().getExtras();
String message = bundle.getString("message");
Intents are intense.
Intents are useful for passing data around the android framework. You can communicate with your own Activities and even other processes. Check the developer guide and if you have specific questions (it's a lot to digest up front) come back.
You can use the GNLauncher, which is part of a utility library I wrote in cases where a lot of interaction with the Activity is required. With the library, it is almost as simple as calling a function on the Activity object with the required parameters. https://github.com/noxiouswinter/gnlib_android/wiki#gnlauncher
In order to insert the text from activity2 to activity1, you first need to create a visit function in activity2.
public void visitactivity1()
{
Intent i = new Intent(this, activity1.class);
i.putExtra("key", message);
startActivity(i);
}
After creating this function, you need to call it from your onCreate() function of activity2:
visitactivity1();
Next, go on to the activity1 Java file. In its onCreate() function, create a Bundle object, fetch the earlier message via its key through this object, and store it in a String.
Bundle b = getIntent().getExtras();
String message = b.getString("key", ""); // the blank String in the second parameter is the default value of this variable. In case the value from previous activity fails to be obtained, the app won't crash: instead, it'll go with the default value of an empty string
Now put this element in a TextView or EditText, or whichever layout element you prefer using the setText() function.
For those people who use Kotlin do this instead:
Create a method with a parameter containing String Object.
Navigate to another Activity
For Example,
// * The Method I Mentioned Above
private fun parseTheValue(#NonNull valueYouWantToParse: String)
{
val intent = Intent(this, AnotherActivity::class.java)
intent.putExtra("value", valueYouWantToParse)
intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivity(intent)
this.finish()
}
Then just call parseTheValue("the String that you want to parse")
e.g,
val theValue: String
parseTheValue(theValue)
then in the other activity,
val value: Bundle = intent.extras!!
// * enter the `name` from the `#param`
val str: String = value.getString("value").toString()
// * For testing
println(str)
Hope This Help, Happy Coding!
~ Kotlin Code Added By John Melody~
So I was doing this but my output is weird ,
this is the 1st activity
up = findViewById(R.id.button);
up.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, updatestudents.class);
intent.putExtra("updating",updating);
startActivity(intent);
}
});
this is the 2nd activity
Bundle extras = getIntent().getExtras();
if (extras != null) {
Current_Value = getIntent().getStringExtra("updating");
}
u = findViewById(R.id.text);
u.setText("updating " + Current_Value);
Here I am retrieving String in 2nd Activity
And this is my output
enter image description here

Android: Who start Activity

I have 3 activity: Activity1, Activity2, Activity3. Activity1 and Activity3 can start Activity2:
startActivity (new Intent(this,Activity2));
How in Activity2 I can check which class start Activity2 ? Is there any way to take information from Intent ? Thanks...
I dont whant to put anything in Intent. I think I dont need that. When I start intent I already saying from what context I do that (new Intent(*this*,Activity2)). And this "this" I want to recognize in Activity2 !!! Is that possible ?
You can pass that information in the "extra" Bundle of your Intent:
In Activity1:
Intent intent = new Intent(this, Activity2.class);
intent.putExtra("caller", "activity1");
startActivity(intent);
In Activity2:
String caller = getIntent().getStringExtra("caller");
There's also get/put extra methods for other data types like boolean, int, etc.
As for why you cannot access the Context you supplied when creating the Intent on the other side:
The only thing that Android does with the supplied Context (i.e. your this) is to create a ComponentName from it. That class only keeps the package of the supplied Context and discards anything else.
So you theoretically could put your activities into different packages and then go getIntent().getComponentName().getPackageName() on it at the receiving end -- but please don't. Intent extras is the way to go.
To send:
Intent intent = new Intent(this,Activity2)
intent.putExtra("activityNumber", 1);
startActivity(intent);
To receive:
Bundle extras = getIntent().getExtras();
if (extras != null) {
activitySource = extras.getInt("activityNumber");
}
You can pass along information between Activities using an Intents "Extras":
Intent newIntent = new Intent(this, Activity2.class);
newIntent.putExtra("CalledFrom", Activity1.class.getSimpleName())
startActivity(newIntent);
Then in the receiving Activity you can call:
String fromActivity = getIntent().getStringExtra("CalledFrom");
You can pass basic types as well as Object's which implement the Parcelable interface
You can do this by adding information to your Intent.
for example:
public Intent putExtra (name, value)
In the newly started service you can then look up this information.
Or you can use the addFlags method like in the other answer.
in the intent that starts activity you can always pus flag as
Intent i=new Intent();
i.putExtra("startedBy","A1");
//or
//i.putExtra("startedBy","A2");
//...
and than in the receiving activity use
in the on activityresult method
Intent intent=getIntent();
if(intent.getStringExtra("startedBy").equals("a1"){
//do somth
}
Use Intent data members to pass parameters to your activities. There's an extras data member that is a Bundle of anything you want - a general-purpose name/value collection.
Intent i = new Intent(this, Activity2);
i.putExtra("From", "Activity1");
startActivity(i);
Then in Activity2 you can examine the starting intent for extra data and find this out.
Alternatively, you can use intent data, settable with setData(). Data member has the format of the URI, somewhat unfriendly to passing structured information. It's slightly less typing though.
I found the solutions that use the simple name of the class cause ClassNotFoundExceptions. The solution I use is similar, but uses the canonical name:
Intent newIntent = new Intent(this, Activity2.class);
newIntent.putExtra("caller", Activity1.class.getCanonicalName())
startActivity(newIntent);
Then in the other activity
String caller = getIntent().getStringExtra("caller");
Class callingClass = Class.forName(caller);

Categories

Resources