Java Intent extra和onSaveIntanceState中的捆绑包最大大小

Java Intent extra和onSaveIntanceState中的捆绑包最大大小,java,android,android-intent,ipc,Java,Android,Android Intent,Ipc,我正在研究如何跨配置更改传递和保存大量数据 基本上我有一个活动a(持有片段a)和一个活动b(持有片段b)。目标是将一个非常大的字符串从片段a传递到片段B 我使用以下方法创建字符串: public class StringHelper { public static String generateRandomLongString() { Random rand = new Random(); StringBuilder builder = new Stri

我正在研究如何跨配置更改传递和保存大量数据

基本上我有一个
活动a
(持有片段a)和一个
活动b
(持有
片段b
)。目标是将一个非常大的字符串从
片段a
传递到
片段B

我使用以下方法创建字符串:

public class StringHelper {

    public static String generateRandomLongString() {
        Random rand = new Random();
        StringBuilder builder = new StringBuilder();
        builder.append(rand.nextInt(1000));
        builder.append("_");
        for (int i = 0; i < 10000000; i++) {
            builder.append((char) (rand.nextInt('z' - ' ') + ' '));
        }
        return builder.toString();
    }
}
活动B:

public class ActivityB extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        Log.e("Received "," "+getIntent().getStringExtra("test"));
    }
}
这会导致系统出现故障,因为捆绑包超过了IPC的最大大小

java.lang.RuntimeException: Failure from system
at android.app.Instrumentation.execStartActivity(Instrumentation.java:1514)
at android.app.Activity.startActivityForResult(Activity.java:3917)
at android.app.Activity.startActivityForResult(Activity.java:3877)
at android.support.v4.app.FragmentActivity.startActivityFromFragment(FragmentActivity.java:813)
at android.support.v4.app.FragmentActivity$HostCallbacks.onStartActivityFromFragment(FragmentActivity.java:871)
at android.support.v4.app.Fragment.startActivity(Fragment.java:916)
这应该不是问题,因为还有其他方法可以用来将数据传递给活动、共享内存、单例、静态类等(有关更多信息,请参阅)

2。将数据传递到碎片B:

Intent intent = new Intent(v.getContext(), ActivityB.class);
String fakedData = StringHelper.generateRandomLongString();
Log.e("test", "Launching ActivityB,  data = " + fakedData);
intent.putExtra("test", fakedData);
startActivity(intent);
使用片段参数,我不会崩溃,数据也不会正确到达

public class ActivityA extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (savedInstanceState == null) {
            Fragment fragment;
            //fragment = new MainActivityFragment();
            String fakedData = StringHelper.generateRandomLongString();
            Log.e("TEST", "Activity String=" + fakedData);
            fragment = FragmentB.newInstance(fakedData);

            getSupportFragmentManager().beginTransaction()
               .add(android.R.id.content,fragment, "fragmentTag").commit();
        }
    }

}

public class FragmentB extends Fragment {

    public static FragmentB newInstance(String data) {
        FragmentB result = new FragmentB();
        Bundle args = new Bundle();
        args.putString("data", data);
        result.setArguments(args);
        return result;
    }

    ....

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        Log.e("TEST", "DATA_FROM_ARGS=" + getArguments().getString("data"));
    }

}
3。将实例状态保存到碎片B:

Intent intent = new Intent(v.getContext(), ActivityB.class);
String fakedData = StringHelper.generateRandomLongString();
Log.e("test", "Launching ActivityB,  data = " + fakedData);
intent.putExtra("test", fakedData);
startActivity(intent);
有趣的是,片段B可以修改数据,而您希望保持更新的数据。也似乎工作正常,没有崩溃

public class FragmentB extends Fragment {

    private String myData;

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        if (savedInstanceState == null) {
            myData = getArguments().getString("data");
        } else {
            myData = savedInstanceState.getString("savedData");
        }
        Log.e("TEST", "DATA=" + myData);
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putString("savedData", myData);
    }

}
问题

  • 为什么我只在步骤1中遇到崩溃
  • 在某些情况下,IPC在步骤2或步骤3中进入场景,是否由于捆绑限制而产生崩溃
  • 用共享内存通信替换步骤1是否正确,并让步骤的其余部分保持原样

一般情况下,您不应通过活页夹传递大量数据。活页夹不是用来处理大数据块的,最好是使用原语。那么,在startActivityB案例中使用替代方法就足够了,对吗?一般来说,您不应该通过活页夹传递大数据块。活页夹不是用来处理大数据块的,最好还是使用原语。那么在startActivityB的情况下使用另一种方法就足够了,对吗?