2

(我知道final无法更改。但是如果您阅读了我输入的示例,您就会明白我为什么要问这个问题!)

我正在阅读示例 hello world Android 应用程序:

MainActivity.java

public final static String EXTRA_MESSAGE = "com.example.helloworld.MESSAGE";
....
....
intent.putExtra(EXTRA_MESSAGE, message);

它是如何工作的?我们是否将消息值存储在 EXTRA_MESSAGE 中?

此外,我可以有多少 SharedPreferences 来存储数据?假设我的应用需要存储关卡和高分,我该怎么做?

public final static String HIGH_SCORE = "com.example.helloworld.HIGH_SCORE";
public final static String LEVELS = "com.example.helloworld.LEVELS";

SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
editor.putInt(getString(R.string.saved_high_score), newHighScore);
editor.commit();

如何更改以上行以保存级别和分数?

4

6 回答 6

3

如有疑问,请查看文档

static 修饰符与 final 修饰符一起用于定义常量。final修饰符表示该字段的值不能改变。

这里定义了什么:

public final static String EXTRA_MESSAGE = "com.example.helloworld.MESSAGE";

是一个保持不变的常数,否则,您会看到这里出现的错误:

intent.putExtra(EXTRA_MESSAGE, message);

如果Extra_MESSAGE要更改,Entry具有其先前值作为键的 最终可能会“丢失”(更准确地说,无法访问,因为您没有将该值保存在其他地方)。

为了保存更多信息,您需要更多地图键。这意味着您在此处正确定义的字段:

public final static String HIGH_SCORE = "com.example.helloworld.HIGH_SCORE";
public final static String LEVELS = "com.example.helloworld.LEVELS";

可用于将这些值存储在给定的映射中,或者您想将它们用作标识符的任何位置(基于键值结构)。这里的概念是您必须定义一个可通过游戏访问的常量,以便能够存储和检索数据。

于 2013-09-05T15:22:50.250 回答
0
  1. 我可以更改最终变量吗?

正如您所说,并且您也知道这一点,我们无法final正常更改值,但使用反射 API 这可能是可能的,请参阅Stack Overflow 问题Change private static final field using Java reflection的答案。

  1. 这是如何存储的 intent.putExtra(EXTRA_MESSAGE, message);

正如许多答案所说,putExtra 以 WAP 的方式工作,其中特定键映射到字符串、整数等类型的特定值。因此,在这种情况下EXTRA_MESSAGE充当键,而message充当值。

  1. 我可以向 SharedPreferences 添加多少值?

AFAIK,您可以添加多少个 SharedPreferences 没有限制,这取决于您,但由于 SharedPreferences 主要与应用程序设置相关,虽然没有明确要求,但我们可以选择将大型或个人应用程序数据存储到 XML 文件中或数据库。

  1. 如何保存我的代码以存储特定值

    editor.putInt(getString(R.string.saved_high_score), newHighScore);
    

    假设 newHighScore 是您要存储的值,您可以选择更改 getString(R.string.saved_high_score)为更具体的键,例如 Level Number,以便下次更新时,分数将自动被覆盖。

于 2013-09-05T16:19:22.313 回答
0

不,一旦分配,您将无法更改该值。这就是为什么它被称为final。您可以根据需要拥有许多首选项,因为它们只是文件。

intent.putExtra(EXTRA_MESSAGE, message);

想一张地图。这只是一个键值关系。EXTRA_MESSAGE 是,消息是

总而言之,你做——

preferences.edit().putString("name", "adam");

要获得,您可以使用您使用的密钥-

preferences.getString("name", "none"); 

教程和参考资料:

共享偏好

沃杰拉

于 2013-09-05T15:15:37.483 回答
0

编辑1:

您的问题与原始问题相差太大。这是因为你只是误解了它。

MainActivity.java

public final static String EXTRA_MESSAGE = "com.example.helloworld.MESSAGE";
....
....
intent.putExtra(EXTRA_MESSAGE, message);

这段代码并不意味着EXTRA_MESSAGE现在正在存储消息。它类似于键/值对。

它的意思是:

Intent 使用名为 value 的 EXTRA_MESSAGE 键存储消息的值,因此如果您将 EXTRA_MESSAGE 的值传递给意图,它将给消息一个值。

final是固定的。它永远不会改变它的值,所以它被称为FINAL

而且你也不能改变它。它始终被视为一个常数

有关更多帮助,请参阅Wikipedia 上的 final (Java) 。

于 2013-09-05T15:18:28.063 回答
0

这一行:

intent.putExtra(EXTRA_MESSAGE, message)

意味着您将消息的值存储在键Intent's下的内部映射中EXTRA_MESSAGE。它不会以任何方式改变EXTRA_MESSAGE变量的内容。

于 2013-09-05T15:19:58.603 回答
0

Intent 中有一个 Bundle,其中包含要传递的参数。把它想象成一个映射,所以当你写

intent.putExtra(EXTRA_MESSAGE, message);

它将消息保存到一个名为 EXTRA_MESSAGE 的字段中。

因此,如果您想存储高分和级别,请使用:

public final static String HIGH_SCORE = "com.example.helloworld.HIGH_SCORE";
public final static String LEVELS = "com.example.helloworld.LEVELS";

SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
editor.putInt(HIGH_SCORE, newHighScore);
editor.putInt(LEVELS, level);
editor.commit();

请注意,如果您再次写入 HIGH_SCORE 或 LEVELS,它将覆盖当前值!

于 2013-09-05T15:21:17.197 回答