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是否正确,并让步骤的其余部分保持原样