当前位置: 代码迷 >> java >> 如何在Android的所有活动中维护变量?
  详细解决方案

如何在Android的所有活动中维护变量?

热度:64   发布时间:2023-08-02 11:19:49.0

我有一个包含3个活动的应用程序。

  • 活动1
  • 活动2
  • 活动3

当用户打开应用程序时,我正在获取用户的位置并将其存储在Helper类的静态变量中。 可以说该变量是latlng。 现在,我需要在Activity2中访问latlng变量的值。 所以我只是在Activity2中使用Helper.latlng。 大多数情况下,它都能正常工作。

但是,如果我按下主页按钮并打开其他应用程序,然后返回到我的应用程序,我的应用程序将关闭。 调试后,我发现latlng变量在Activity2中变为空。

因此,在浏览了各种文档之后,我发现如果许多应用程序正在运行,那么Android OS可能会杀死某些应用程序。 因此,基本上,如果我打开其他应用程序,操作系统将破坏我当前的活动。 因此,我所有的静态变量都自动消失了。

解决此问题的一种方法是继续使用带有onSavedInstanceState方法的静态变量,该方法将在活动被销毁时调用。

   public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        LatLng latLng  = Helper.latlng;
        outState.putParcelable("latlng",latLng);
    }

并使用

 if( savedInstanceState != null ) {
            Helper.latlng = savedInstanceState.getParcelable("latlng");
        }

我真的很困惑是否应该采用上述方法。 还有其他方法可以在Android中的不同活动之间使用变量。 根据我的经验,我可以说使用静态变量不是一个安全的选择。

只是为了避开最重要的部分:除非您确切知道自己在做什么,否则绝对不要在Android中使用静态变量。 否则,您将造成内存泄漏和一系列其他问题。

如果要将数据传递到另一个活动,则应使用Intent。

方法调用总是有额外的开销。 直接访问字段总是会更快。 但这并不意味着您应该一起放弃吸气剂和吸气剂。

例如,查看此类示例:

public class Example { 

private String text;

public String getText() {
    return text;
} 

public void setText(String text) {
    this.text = text;
} 

public void doSomething() { 
    ... 
} } 

在doSomething()内部,您应该直接使用该字段。 调用getter和setter方法是没有办法的,因为每次调用一个方法都需要额外的开销。

如果在另一个类似下面的类中使用Example类,则应使用getter和setter方法: Example instance = new Example(); instance.setText("some text"); ... String text = instance.getText(); Example instance = new Example(); instance.setText("some text"); ... String text = instance.getText();

将该字段公开并像instance.text一样直接访问它会很糟糕。

但是任何现代设备都具有如此大的计算能力,以至于方法调用所产生的开销可以完全忽略不计。 确实指出,您应该避免在性能至关重要的地方使用吸气剂和吸气剂,但这是从大多数Android手机具有128 MB RAM的时间开始的。 您应该遵守我上面解释的规则的主要原因仅仅是一件事:编码样式。

您首先要关心的是编写干净,可读和可维护的代码。

做到这一点的方法之一是使用android中的SharedPreferences存储。

SharedPreferences pref =
getApplicationContext().getSharedPreferences("LocationPrefs", MODE_PRIVATE); 

Editor editor = pref.edit();
// Save latLang as a string variable
editor.putString("latLang", "string value of latLang");  

// Save the changes
editor.commit();

您可以通过这种方式检索结果,

String latLang = pref.getString("latLang", null); 

在活动之间传递数据的方法很少。

  1. 保存到文件
  2. 使用putExtra的

在Android环境中,用户始终可以删除应用数据,因此无论如何您都需要为此做好准备

  相关解决方案