I\'ve got an strange issue. I was looking around the web but didn\'t find an answer. I\'m still a beginner in android programming. So let\'s go:
All I want to do is
I have no idea why it doesn't work with large data, but if you don't find any way to fix it, I suggest you to use a custom global application, like here. (Also check the correct answer to make it works)
You are probably getting TransactionTooLargeException
As suggested by google android guide, you could use static fields or singletons to share data between activities.
They recommend it "For sharing complex non-persistent user-defined objects for short duration"
From your code it seems that's exactly what you need.
So your code in ActivitySearch.class could look something like this:
ActivityResults.data = searchList;
Intent intent = new Intent(ActivitySearch.this,ActivityResults.class);
startActivity(intent);
Then you can access ActivityResults.data from anywhere in ActivityResults activity after it starts.
For data that need to be shared between user sessions, it's not advisable to use static fields, since application process could be killed and restarted by android framework while app is running in background (if framework need to free resources). In such case all static fields will be reinitialized.
Issue: Passing large data to second Activity, As suggested by google android guide, you could use static fields or singletons to share data between activities. You can pass data between activities in application in 3 ways. Intent; SharedPreferences; Application; passing data in intent have some limit. For large amount of data you can use Application level data sharing and by storing it in SharedPreference makes your app size increase
How to pass large data between activities in Android?, This example demonstrate about How to pass large data between activities in AndroidStep 1 − Create a new project in Android Studio, go to Sending Data Between Activities in Android Android Intents are objects used to trigger actions from other Android Activities. One of the most common uses of Intents is to open a new Activity in your app. Often, you will want to pass information to the new Activity.
How do you pass large data between activities and safeguard , +1, use an ORM android database lib. Like Realm or DBFlow or another ORM. Where do the images come from? Passing images by intent means holding them in Pass data between fragments Starting with Fragment 1.3.0-alpha04 , each FragmentManager implements FragmentResultOwner . This means that a FragmentManager can act as a central store for fragment results.
The way I prefer passing large data is through using enums. Some advantages of this approach:
Here is an example:
package com.jyvee.arguments;
import java.util.List;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
public class SomeActivity extends Activity {
// Names for the arguments we pass to the
// activity when we create it
private final static String ARG_STRING = "ARG_STRING";
private final static String ARG_INT = "ARG_INT";
private String stringField;
private int intField;
private List<Object> arrayField;
private enum DataHolder {
INSTANCE;
private List<Object> mObjectList;
public static boolean hasData() {
return INSTANCE.mObjectList != null;
}
public static void setData(final List<Object> objectList) {
INSTANCE.mObjectList = objectList;
}
public static List<Object> getData() {
final List<Object> retList = INSTANCE.mObjectList;
INSTANCE.mObjectList = null;
return retList;
}
}
@Override
protected void onCreate(final Bundle savedState) {
super.onCreate(savedState);
// Get the activity intent if there is a one
final Intent intent = getIntent();
// And retrieve arguments if there are any
if (intent.hasExtra(ARG_STRING)) {
stringField = intent.getExtras().getString(ARG_STRING);
}
if (intent.hasExtra(ARG_INT)) {
intField = intent.getExtras().getInt(ARG_INT);
}
// And we retrieve large data from enum
if (DataHolder.hasData()) {
arrayField = DataHolder.getData();
}
// Now stringField, intField fields are available
// within the class and can be accessed directly
}
/**
* /** A static method for starting activity with supplied arguments
*
* @param contextA
* context that starts this activity
* @param stringArg
* A string argument to pass to the new activity
* @param intArg
* An int argument to pass to the new activity
* @param objectList
* An object list argument to pass to the new activity
*/
public static void startActivity(final Context context, final String stringArg,
final int intArg, final List<Object> objectList) {
// Initialize a new intent
final Intent intent = new Intent(context, SomeActivity.class);
// To speed things up :)
intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
// And add arguments to the Intent
intent.putExtra(ARG_STRING, stringArg);
intent.putExtra(ARG_INT, intArg);
// Now we put the large data into our enum instead of using Intent extras
DataHolder.setData(objectList);
context.startActivity(intent);
}
}
More info here.
If you pass a Large Information from one to other Activity then may be it make App Slower
but use Global Class to store variables with using that you can Easily Get or Set Any values
that declared in Global file
see this link :
http://androidresearch.wordpress.com/2012/03/22/defining-global-variables-in-android/
As far as i remembered, up till API-8 (Froyo), there were some limitations (like 1MB) when passing parcelable objects through intents. However, you may simply write down your parcelable data into a file and send the file path to your next activity through bundle. Later, code your second activity to read the data from file and delete it afterwards.