可以在意图中传递的字符串数据的最大大小

时间:2015-02-25 21:27:59

标签: android

是否可以在intent extra中传递的字符串数据有最大限制?下面的String str可以容纳多少数据?

intentI1.putExtra("MyString", str);

4 个答案:

答案 0 :(得分:9)

我在Android API Level 24上的测试:

            Intent intent = new Intent(MainActivity.this, DetailActivity.class);
//            intent.putExtra("extra", new byte[1024 * 1024]); // 1024 KB = 1048576 B, android.os.TransactionTooLargeException
//            intent.putExtra("extra", new byte[1024 * 512]); // 512 KB = 524288 B, android.os.TransactionTooLargeException
//            intent.putExtra("extra", new byte[1024 * 506]); // 506 KB = 518144 B, android.os.TransactionTooLargeException
//            intent.putExtra("extra", new byte[1024 * 505]); // 505 KB = 517120 B, android.os.TransactionTooLargeException
            intent.putExtra("extra", new byte[1024 * 504]); // 504 KB = 516096 B, OK
            startActivity(intent);

android.os.TransactionTooLargeException https://developer.android.com/reference/android/os/TransactionTooLargeException.html

因为我需要向活动发送大量数据,所以我使用以下解决方案(我知道,它不完美,但它可以提供帮助):

public class ExtendedDataHolder {

    private static ExtendedDataHolder ourInstance = new ExtendedDataHolder();

    private final Map<String, Object> extras = new HashMap<>();

    private ExtendedDataHolder() {
    }

    public static ExtendedDataHolder getInstance() {
        return ourInstance;
    }

    public void putExtra(String name, Object object) {
        extras.put(name, object);
    }

    public Object getExtra(String name) {
        return extras.get(name);
    }

    public boolean hasExtra(String name) {
        return extras.containsKey(name);
    }

    public void clear() {
        extras.clear();
    }

}

然后在MainActivity中

ExtendedDataHolder extras = ExtendedDataHolder.getInstance();
extras.putExtra("extra", new byte[1024 * 1024]);
extras.putExtra("other", "hello world");

startActivity(new Intent(MainActivity.this, DetailActivity.class));

并在DetailActivity中

ExtendedDataHolder extras = ExtendedDataHolder.getInstance();
if (extras.hasExtra("other")) {
    String other = (String) extras.getExtra("other");
}

答案 1 :(得分:4)

Checkout this post,表示1MB是一个限制。结帐this one

还有report on issues site

真正的问题是:为什么在活动之间传递1M数据?也许更好的方法来实现你想要的是坚持这些数据并传递一个标识符。

答案 2 :(得分:1)

Intent Bundle没有任何固定的大小限制。在类级别上,Intent Bundle正在增长为Map<String, Object> map,它将Object保存为Parcelable,因为Bundle与Binder的较低级实现依赖于特定引用内存大小的字节缓冲区。添加任何条目时,此地图没有任何大小限制检查。但是没有建议在Intent中保留更大的对象,否则就没事了。

代码参考:

http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.3.6_r1/android/os/Bundle.java

http://grepcode.com/file/repo1.maven.org/maven2/org.robolectric/android-all/5.0.0_r2-robolectric-0/android/os/BaseBundle.java#BaseBundle

答案 3 :(得分:1)

因为startActivity最终会将整个Intent数据传递给ActivityManagerServiceBinderBinder事务缓冲区的固定大小有限,目前为1Mb。 Google Ref