实现成员变量免费活动有什么缺点吗?

时间:2013-10-22 23:21:13

标签: android design-patterns android-activity android-lifecycle

我开始学习android框架,我最大的问题是围绕活动生命周期的地狱。因此,当用户旋转屏幕时,我的应用程序就会崩溃。据我所知,除了正常的活动生命周期之外,Android还为我攻击了一个强制实例删除和部分恢复服务,这不是一个bug而是一个功能。

所以我只想让我的成员变量保持安全,所以我想开始将它存储在Application类中。

所以我想以下列方式重构我的程序:

我创建了一个自己的应用程序

public class MainApp extends Application {
   LoginActivityData loginActivityData; // create data "segment" for every activity
   FirstActivityData firstActivityData;
   ...

   public static MainApp getInstance(final Context context) {
       if (context == null) return null;
       final Context app = context.getApplicationContext();
       return app instanceof MainApp ? (MainApp) app : null;
   }

}

在活动和片段中,我停止使用除MainApp类中的成员变量之外的成员变量。

public class LoginActivity extends Activity {
   LoginActivityData loginActivityData;

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    loginActivityData = MainApp.getInstance(this).loginActivityData;
}

这种设计有什么缺点吗?

1 个答案:

答案 0 :(得分:2)

是的,有一个缺点。当应用程序对象需要恢复内存时,系统可以销毁它,并且应用程序对象没有可用于保存状态的回调方法。有关更全面的解释,请参阅here

有很多方法可以保留数据/状态,但是如果你使用以下方法,通常不会出错:

  • 使用onPause()将长期数据保存到SQLite DB / SharedPreferences / cloud等。在适当的地方(onCreate()onResume(),...)恢复它。
  • 使用onSaveInstanceState()将临时数据保存到Bundle。在onCreate() / onRestoreInstanceState()中恢复它。捆绑包由系统自动传递给适当的方法。请注意,无法保证将调用onSaveInstanceState(),因此请勿将其用于关键数据。