Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 实现无成员变量的活动有什么缺点吗?_Android_Design Patterns_Android Activity_Android Lifecycle - Fatal编程技术网

Android 实现无成员变量的活动有什么缺点吗?

Android 实现无成员变量的活动有什么缺点吗?,android,design-patterns,android-activity,android-lifecycle,Android,Design Patterns,Android Activity,Android Lifecycle,我开始学习android框架,我最大的问题是活动生命周期的地狱。因此,当用户旋转屏幕时,我的应用程序就会崩溃。据我所知,除了正常的活动生命周期之外,Android还为我入侵了一个强制实例删除和部分恢复服务,这不是一个bug,而是一个特性 所以我只希望我的成员变量保持安全,所以我想开始将它存储在应用程序类中 因此,我想用以下方式重构我的程序: 我创建了一个自己的应用程序 public class MainApp extends Application { LoginActivityData

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

所以我只希望我的成员变量保持安全,所以我想开始将它存储在应用程序类中

因此,我想用以下方式重构我的程序:

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

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;
   }

}
在activities和fragments中,我停止使用成员变量,MainApp类中的变量除外

public class LoginActivity extends Activity {
   LoginActivityData loginActivityData;

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

这种设计有缺点吗?

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

有许多方法可以持久化数据/状态,但如果使用以下方法,通常不会出现太大的错误:

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