3

当我们想要一个意图将一些数据传送到另一个应用程序组件时,我们会使用一个额外的意图。意图只是一个键值对。我们首先将我们的密钥定义为一个公共常量,并给它一个值。例如

public static final String extra_key = "com.example.myapp.MESSAGE";

我们还必须为键分配意图需要携带的数据。例如

String extra_value = editText.getText().toString();

然后我们做一个额外的意图,如:

intent.putExtra(extra_key, extra_value);

我的问题:

  1. 为什么密钥必须是公开的?

  2. 为什么我们首先需要初始化key,为什么我们不能直接声明它,因为它无论如何都会被赋值(intent要携带的数据)。那么为什么我们不能做类似的事情public static final String extra_key;

  3. 我已经读过键值应该包括反向域名,以便它是唯一的,以防其他包进入被意图所承载。

先感谢您。

4

4 回答 4

4

Why does the key have to be public?

它没有。这不是关于意图附加或键值对的问题。这只是一个关于 Java 变量范围和可见性的问题。

在调用类中:

intent.putExtra("KEY_NAME", "Key_Value");

在接收组件中:

intent.getStringExtra("KEY_NAME");

这工作就好了。 好的做法是让public final static发送者和接收者可以使用相同的常量名。

Why do we need to intialize the key in the first place, why can't we just declare it, because it will be assigned a value (the data to be carried by the intent) anyway. So why couldn't we do something like

看上面。键名只不过是一个字符串。键不携带数据,值携带。

I have read that the key value should include the reverse domain name.

这是没有意义的。关键值是发送方想要发送给接收方的任何数据。或者你的意思是键名?接收方必须知道密钥的名称,因此如果此意图是启动外部组件,则您必须使用接收方定义的密钥名称。如果意图是针对内部组件,那么您可以将名称定义为您想要的任何名称。我看不出包含包名的充分理由。它只是使用更多的内存。

于 2013-11-03T11:48:46.967 回答
1

键用于存储和检索值。您可以将其视为 HashMap 的键。

  1. 因为您可能希望在多个位置重用相同的键(例如,将一个值存储在一个活动中并在另一个活动中检索该值)
  2. 当您作为静态成员时,这意味着它不属于对象的特定实例,但该类的所有对象都将共享它。如果删除 static 关键字,则可以在构造函数中初始化变量,但在这种情况下,它属于对象实例,而不是常量

如果您需要澄清,请随时询问

于 2013-11-03T11:46:17.377 回答
0
  1. 为什么密钥必须是公开的?

您可能希望使用不同类中的键来获取值,以便将其设为静态和公共的。

在其他活动中

   String s = getIntent().getStringExtra(MainActivity.extra_value);
   // considering extra_value is static in MainActivity 

你不必那样做。

 intent.putExtra("mykey", extra_value);

然后在其他活动中检索

  String s = getIntent().getStringExtra("mykey");  // keys must match

变量extra_key被声明为字符串并初始化,它是静态的。

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

以这种方式定义的常量不能重新分配,如果您的程序尝试这样做,则会出现编译时错误。

检查主题常量。

public static final String extra_key= "com.example.myapp.MESSAGE";

Java:定义术语初始化、声明和赋值

http://developer.android.com/reference/android/content/Intent.html

于 2013-11-03T11:47:17.797 回答
0

正如我在评论中看到的那样,我只想在关键标识符中添加该包名称,这不是必须的,但它是一个很好的做法。

根据这个https://developer.android.com/training/basics/firstapp/starting-activity.html#BuildIntent

于 2016-12-09T19:43:37.703 回答