是否可以在intent extra中传递的字符串数据有最大限制?下面的String str可以容纳多少数据?
intentI1.putExtra("MyString", str);
答案 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)
答案 2 :(得分:1)
Intent Bundle没有任何固定的大小限制。在类级别上,Intent Bundle
正在增长为Map<String, Object> map
,它将Object保存为Parcelable
,因为Bundle与Binder的较低级实现依赖于特定引用内存大小的字节缓冲区。添加任何条目时,此地图没有任何大小限制检查。但是没有建议在Intent中保留更大的对象,否则就没事了。
代码参考:
答案 3 :(得分:1)
因为startActivity
最终会将整个Intent
数据传递给ActivityManagerService
到Binder
。 Binder
事务缓冲区的固定大小有限,目前为1Mb。 Google Ref