您可能还需要考虑保留对要跨活动共享的模型数据的静态引用,以便在活动之间切换时不必继续对模型进行序列化/反序列化。如果您的模型很小,您可以使用 Parcelable,但在某些时候,性能可能会成为问题。
我正在做一个项目,我们将模型保存在一个可以在整个应用程序中访问的单例中,尽管我通常讨厌单例,因为它们会使单元测试变得更加困难,但我发现这种方法表现得更好使用更大的模型而不是尝试依赖 Android 的序列化机制。
这是我的意思的一个非常粗略的例子(免责声明:我没有实际运行测试过这段代码,但我希望这能说明这个概念):
你可能有一个单例类,我把它叫做 Models
public class Models {
private static Models instance;
private boolean isInitialized = false;
private User user;
private OtherInterestingModel otherInterestingModel;
private Models() {
}
public static synchronized Models getInstance() {
if (instance == null) {
instance = new Models();
}
return instance;
}
public void loadModels() {
if (!isInitialized) {
/*
* One-time model initialization here.
*/
isInitialized = true;
}
}
public User getUser() {
return user;
}
public OtherInterestingModel getOtherInterestingModel() {
return otherInterestingModel;
}
}
在你的 LoginActivity 中,你可以初始化 Models 类,比如在你的 onCreate() 中:
public class LoginActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Models.getInstance().loadModels();
User user = Models.getInstance().getUser();
OtherInterestingModelData otherData = Models.getInstance().getOtherInterestingModel();
// Do something with the model data...
}
/*
* This might be called after the user enters data and clicks a login button...
*/
private void login() {
startActivity(new Intent(this, AwesomeLoggedInActivity.class));
}
}
一旦用户成功登录到您的应用,您的主要活动中就可以拥有基本相同的代码:
public class AwesomeLoggedInActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Models.getInstance().loadModels();
User user = Models.getInstance().getUser();
OtherInterestingModelData otherData = Models.getInstance().getOtherInterestingModel();
// Do something with the model data...
}
}
请注意,通过使用 Singleton,您避免了通过将模型数据传递给启动主要活动的意图来序列化模型数据。