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

Android 可在意图中传递的字符串数据的最大大小,android,Android,是否对可以传入的字符串数据有最大限制?下面的字符串str可以容纳多少数据 intentI1.putExtra("MyString", str); 签出时显示1MB是一个限制。还有结帐 还有一个问题 真正的问题是:为什么要在活动之间传递100万个数据?也许实现您想要的更好的方法是保留此数据并传递标识符。根据Android参考: 通过intent发送数据时,应小心限制 数据大小为几KB。发送太多数据可能会导致系统崩溃 引发TransactionTooLargeException异常 另外,建议使

是否对可以传入的字符串数据有最大限制?下面的字符串str可以容纳多少数据

intentI1.putExtra("MyString", str);
签出时显示1MB是一个限制。还有结帐

还有一个问题


真正的问题是:为什么要在活动之间传递100万个数据?也许实现您想要的更好的方法是保留此数据并传递标识符。

根据Android参考:

通过intent发送数据时,应小心限制 数据大小为几KB。发送太多数据可能会导致系统崩溃 引发TransactionTooLargeException异常

另外,建议使用Bundle类在Intent对象上设置操作系统已知的原语

以及跨活动发送复合或复杂对象。在这种情况下,自定义类应该实现Parcelable

活页夹事务缓冲区具有有限的固定大小,当前为1MB, 由流程的所有正在进行的事务共享。自从 此限制在流程级别,而不是每个活动级别 级别,这些事务包括应用程序中的所有活页夹事务 例如onSaveInstanceState、startActivity以及与 系统。当超过大小限制时,将显示一个 TransactionTooLargeException被抛出

对于savedInstanceState的特定情况,数据量应保持较小,因为只要用户能够导航回该活动,系统进程就需要保留提供的数据(即使活动的进程被终止)。我们建议您将保存的数据状态保持在小于50k


注意:在Android 7.0(API级别24)及更高版本中,系统将TransactionTooLargeException作为运行时异常抛出。

我对Android API级别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

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

并在活动中详细说明

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

因为
startActivity
最终将通过
Binder
将整个
Intent
数据传递给
ActivityManager服务
。而
Binder
事务缓冲区的固定大小有限,目前为1Mb

签出[这篇帖子][1],上面说1MB是一个限制。也请签出[这一个][2]。[1] :[2]:这能回答你的问题吗?这对我帮助很大。谢谢
ExtendedDataHolder extras = ExtendedDataHolder.getInstance();
extras.putExtra("extra", new byte[1024 * 1024]);
extras.putExtra("other", "hello world");

startActivity(new Intent(MainActivity.this, DetailActivity.class));
ExtendedDataHolder extras = ExtendedDataHolder.getInstance();
if (extras.hasExtra("other")) {
    String other = (String) extras.getExtra("other");
}