Intent putExtra(String,String) inside of AsyncTask - java

I'm simply trying to carry a string onto the next activity without having to define an entire object for the task. I've seen similar solutions and gotten them to work BUT without using AsyncTask to create the intent.
protected void onPostExecute(Boolean result) {
if (loggedIn && hasPin) {
Intent intent = new Intent(UniteActivity.this,
WebViewActivity.class);
intent.putExtra(PASSED_USERNAME, passUser);
startActivity(intent);
}
if (loggedIn && !hasPin) {
Intent intent = new Intent(UniteActivity.this,
CreatePinActivity.class);
intent.putExtra(PASSED_USERNAME, passUser);
startActivity(intent);
PASSED_USERNAME is a public static constant to hold the package name, just as the putExtra() method requires. I then try to pull the value out in the next activity.
Intent extras = getIntent();
String username = extras.getStringExtra(UniteActivity.PASSED_USERNAME);
// carry username to next activity
Intent intent = new Intent(CreatePinActivity.this,WebViewActivity.class);
intent.putExtra(PASSED_USERNAME, username);
startActivity(intent);
There is never a String to pull out, the value of username is always null. I've gone through the debugger and found that the Eclipse IDE debugger shows different intent ID's between the activities, they are never consistant. Is it possible that AsyncTask is interfereing somehow because it splits into a seperate thread?

I don't know if this applies to your problem, because I can't see from your code snippet if the intermediary activity is freshly created or not.
BUT: the getIntent()-method always returns the first Intent that started the activity. If the activity remains in the background and receives a new Intent this value does not get updated automatically. You have to override onNewIntent(...) and manually call setIntent(...) for this to work (or do all your stuff directly there).
So just for the case that you do not run your posted code in the onCreate() method please check if you did not miss to fetch the real intent you are interested in.

Not sure of the exact answer for you solution.
You calling startActivity on the UI since it's in postExecute().
If all else fails you can just save that value to a sharedpreference.

The way you have handled the variable PASSED_USERNAME seems incorrect. You have used it in some palaces as simple PASSED_USERNAME whereas in some other places you have used it with the class named prefixed UniteActivity.PASSED_USERNAME. Since it is a Public Static Constant always use it prefixed with the class name.

Related

how can forward data form i activity to 3 activity via 2 activity

I am making my own project but I am stuck.
Getting the information from the user in the first activity is working just fine.
But when I try to get those numbers, ints, in the third activity via a second activity, it is showing me the default value.
I am trying it using an Intent, but it is not working.
Intent intent = new Intent(this, active.class);
Intent intent2 = new Intent(this, BMR_Active.class);
intent.putExtra(EXTRA_TEXT_height,height );
intent.putExtra(EXTRA_TEXT_weight,weight);
intent.putExtra(EXTRA_TEXT_age,age);
startActivity(intent);
It is giving me a default value i.e. 0(I have given) in BMR activity then i am going via active activity.
Your putExtra method via intent would work fine, but are you also running putExtra BEFORE starting the third activiy?
The data is first passed from first activity to second activity, then from second activity is passed to third activity using the same method.
Additional Note:
In cases like this, I would usually use fragments instead, I would store the data in the activity and fragments will obtain the datas via getActivity(). This will eliminate the needs of multiple passing of data around.
Based on what you said in your comment about passing data straight from Activity 1 to Activity 3, then what you can do is the following:
Page1.class:
Intent toPage3 = new Intent(Page1.this, Page3.class);
int myNum = 5;
toPage3.putExtra("Number", myNum);
startActivity(toPage3);
Page3.class:
Intent receiveIntent = getIntent();
int numFromPage1 = receiveIntent.getIntExtra("Number");
I believe that this should answer your question. numFromPage1 will be an int containing the value from Page1.

Passing class in universal intent

So, right now in my App I'm sending data from actual class, to other, special class prepared to show informations from it, like here:
Intent intent = new Intent(ActualFluidsBernoullisEquationMenuActivity.this, DetailSubjectActivity.class);
Of course I'm also passing some info, on which I first need to create database reference, so there is like 15 lines of code.I have like 15 of those activities, which is creating a lot of boilerplate (the only changing line is which .this class I'm passing)
So I wanted to create universal method for intent like this:
Intent engineeringTheoryIntent(String callingActivity, String subjectKey) throws ClassNotFoundException {
Intent intent = new Intent(Class.forName(callingActivity).getClass().this, DetailSubjectActivity.class);
}
(This doesn't work, just in case)
I just cannoot find the way how to properly pass first class. I tried Class.forName, I tried passing whole class, but not any of those works for me. I also didn't find any info if this is even possible (I'm kind of beginner in matter of android). So is there way to do it?
I'm posting the solution in the comments as an answer, so that it helps people who encounter similar problems in future.
So, instead of passing the activity class name (as String) you can simply pass the Activity itself as the argument to your universal function, like this :
Intent engineeringTheoryIntent(Activity callingActivity, String subjectKey) throws ClassNotFoundException {
and then you can create your Intent using it like this :
Intent intent = new Intent(callingActivity, DetailSubjectActivity.class);
So, your function will look something like this:
Intent engineeringTheoryIntent(Activity callingActivity, String subjectKey) throws ClassNotFoundException {
Intent intent = new Intent(callingActivity, DetailSubjectActivity.class);
}

ClassCastException on custom object with child objects which is parcelable

Good day,
I was assigned to an android project inside my company and I'm having a little bit of a struggle. I have not touched Android in a few years. Figured you might be able to help me find what i am missing.
I have a project that calls an external libratry for reading a barcode, then the code does a parsing of the byte array and converts it into an object. The problem I am having is of comunication between my MainActivity and the activity that scans the barcode.
This is the piece of code that calls my barcode reader activity:
setContentView(R.layout.activity_main);
MyObjectActivity.setParentActivity(this);
Intent intent = new Intent(this, MyObjectActivity.class);
startActivityForResult(intent, 0);
This one should escalate the scanned data from MyObjectActivity object into my MainActivity (so i can actually do something with the data).
try
{
//MyObject objet contains child objects
MyObject content = MyObjectParser.retrieveContentData(data /*contains the byte array*/);
Intent data_toreturn = new Intent();
data_toreturn.putExtra("data_sent", true);
data_toreturn.putExtra(BARCODE_DATA_EXTRA_TAG, content);
if (getParent() == null)
{
setResult(RESULT_OK, data_toreturn);
} else
getParent().setResult(RESULT_OK, data_toreturn);
} catch(final RuntimeException e)
{
parentActivity.runOnUiThread(new Runnable()
{
#Override
public void run()
{
Toast.makeText(parentActivity, e.getMessage(), Toast.LENGTH_LONG).show();
}
});
}
// stop the Activity
finish();
While debugging i manage to run all the code up until the finish(). Then i get the exception
Failure delivering result ResultInfo{who=null, request=0, result=-1, data=Intent { (has extras) }} to activity {MyObjectActivity}: java.lang.ClassCastException: java.lang.Object[] cannot be cast to ChildObject[]
According to what I remember from developping in android, in order to be able to pass Objects between Activities you need intents and Objects that are Parcelable or Serializable (not sure about this one). I've reviewed the code and the sub objects DO implement this.
I really don't know how to continue. It is either a thing of configuration, or I am doing something very wrong and I am not seeing it.
Thank you for your response.
So I see you are using
startActivityForResult(intent, Yournumber) //I would not use 0, use 1001 or something more custom.
so that you make yourself the parent of the launched activity.
So why are you doing the setParentActivity call? I assume just for doing your Toast? Seems like a unhealthy way to handle that, but that is a different issue.
Then override onActivityResult in that parent activity to handle the intent data returned. As I'm sure you have already done.
But I'm not certain of your "content" object if it is parcable or not. You can check by simply commenting out "adding that to the intent" and seeing if it gets delivered when that object is not inside the intent.
If it is delivered then you should ensure that your object implements Parceable so that it can be put in the intents. If it still does not get delivered then it would appear you are having an issue with your parent not pointing to the correct class somehow and we would need to see more code to help out on that.
I see you are passing the raw bytes, which should work fine, but you could try a wrapper object that implements parceable as well that holds the bytes as a member and pass back that object as a last ditch effort as well.
Let's assume you're sending an Object X via an explicit Intent from Activity A to Activity B.
Step 1 - make sure your class X implements Serializable interface (which you said you already have). Also make sure that all other objects inside your Object X do implement Serializable interface.
Step 2 - Somewhere inside your Activity A you'd have similar code:
X objectX = new X();
Intent intent = new Intent(A.this, B.class);
intent.putExtra("myObject", objectX);
startActivity(intent);
Step 3 - Inside your Activity B you will get the Object reference and typecast it to X:
Intent intent = getIntent();
X objectX = (X)intent.getSerializableExtra("myObject");
Hope this helps. This is the basic pattern of passing objects between Activities and there is nothing more to it.

Confirmation on my Understanding of Beginning Android Concept (Using Multiple Activities)

I am a beginner at android development, and have reached the end of Building your First App. Before I move on, I would like to confirm and validate my understanding of using multiple activities and communicating from one activity to another.
/** Called when the user clicks the Send button */
public void sendMessage(View view) {
Intent intent = new Intent(this, DisplayMessageActivity.class);
EditText editText = (EditText) findViewById(R.id.edit_message);
String message = editText.getText().toString();
intent.putExtra(EXTRA_MESSAGE, message);
startActivity(intent);
}
1) Is my understanding correct that the second paramater in the constructor for Intent (Intent intent = new Intent(this, DisplayMessageActivity.class)) serves as a reference for startActivity(...) and reflection is used to call the method onCreate() in the class DisplayMessageActivity since the class DisplayMessageActivity was given as a class object?
2) What is the use of the first paramater (the context one in the constructor)? (Basically how does Android use the first parameter, a brief description please, to start the activity)?
3) As seen in the tutorial, last part of building your first app, it advises me to declare a variable as such: (public final static String EXTRA_MESSAGE = "me.marshac.myfirstapp.MESSAGE";). I know the purpose of this declaration and initialization, but why don't I have to specify the full package name (me.marshac.myfirstapp. (...) .MESSAGE) and where is the MESSAGE variable coming from? The only two variables similar to that are both local variables in sendMessage() and the other activity's onCreate(), but they are different case and local?
I am sorry for the very in-depth inquiries, I want to establish a firm understanding of the beginner concepts before I move on to intermediate/advanced ones.
1) Yes. I think that's what is happening behind the scenes. If you want to know exactly how they did it, you can go to read the Android OS source code. It is open source, you know. Just Google it!
2) Android uses a stack for storing activities. When you first started your app, it's like this:
MyActivity
Then when you start another activity, a new activity object is pushed onto the stack
DisplayMessageActivity
MyActivity
When you tap the back button, an activity from the stack is popped.
If you didn't give this as the parameter, how would the OS know where to push the new activity onto?
3) I think this is just a convention of some kind. I usually use simple names like message, and it works! It's similar to asking why should I name a class in PascalCase and a local variable in camelCase?

android remove data from getintent

I have an activity for handling deeplink which is a browsable activity
suppose user clicks a link on another app and my browsable activity handles that intent
and start the app, , then user minimise the app by pressing back button
class code for handling intent data
Uri link = getIntent().getData();
if user reopen app from running tasks getIntent() still have data
onDestroy method of browsable activity
#Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
setIntent(null);
}
setIntent(null) not working
so my question is how can i remove data from intent permanently
I am a little late on the answer here but I was dealing with a similar issue and found a solution. The reason you are still seeing data in the intent is because your app was originally started with an intent that contained data. That original intent is stored somewhere in Androids' ActivityManager and is immutable, to my understanding. When user reopens the app from "recent tasks", Android uses that original intent to recreate the application.
There is a workaround to this, however. In your apps onCreate() method, you can check to see if the Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY is set, which would allow your app to distinguish if it is being started from "recent tasks" or not, and therefore, you can avoid using the data contained in the intent.
Putting the following snippet in your onCreate() method would return true if the app is being opened from "recent tasks"
(getIntent().getFlags() & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) != 0)
you have to remove data one by one key. i think you can't remove all data with one line.
if you want to remove specific key than you should use ==> getIntent().removeExtra("key"); or
getIntent().setAction("");
it will remove your data.
for more ==> Clearing intent
To remove the content it works best for me with the following lines of code.
//Clear DATA intent
intent.setData(null);
intent.replaceExtras(new Bundle());
intent.setFlags(0);
After that they can verify that the intent does not contain data

Categories

Resources