2

假设我们通过单击一个按钮将从一个活动 Main_Activity 的文本框接收到的数据发送到另一个活动 Display_Message_Activity。

在 Main_Activity 中:步骤 1:声明最终字符串

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

第 2 步:将点击分配给按钮

public void sendMessage(View view) {
Intent intent = new Intent(this, DisplayMessageActivity.class);
EditText editText = (EditText) findViewById(R.id.edit_message);
String message = editText.getText().toString();
intent.putExtra(EXTRA_MESSAGE, message);
startActivity(intent);
}

第 3 步:在 DisplayMessageActivity 中,

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

// Get the message from the intent
Intent intent = getIntent();
String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);

// Create the text view
TextView textView = new TextView(this);
textView.setTextSize(40);
textView.setText(message);

// Set the text view as the activity layout
setContentView(textView);
}

现在我的问题是我们为什么要使用intent.getStringExtra(MainActivity.EXTRA_MESSAGE); ?? 取而代之的是,我们可以在按钮单击时轻松更新静态字符串MainActivity.EXTRA_MESSAGE的值,然后直接访问它并将 EXTRA_MESSAGE 字符串的值分配给 DisplayMessageActivity 中的 *消息字符串。我的意思是,步骤:1

 public static String EXTRA_MESSAGE="com.example.myfirstapp.MESSAGE";

第2步

 public void sendMessage(View view) {
Intent intent = new Intent(this, DisplayMessageActivity.class);
EditText editText = (EditText) findViewById(R.id.edit_message);
String message = editText.getText().toString();
EXTRA_MESSAGE=message;
startActivity(intent);
}

步骤:3

.
.
.
String message=MainActivity.EXTRA_MESSAGE;
.
.
.

那么为什么在消息传递的情况下首选使用 Intent 呢?

4

3 回答 3

4

如果 Android 为您的应用程序终止并重新启动进程,则静态变量将被分配为其默认值。如果您希望值保持不变,则最好使用 SharedPreferences 而不是静态变量。

不推荐使用静态变量。静态变量存储在堆的 PermGen 部分中。即使类完成了它的工作,静态变量也会留在堆中。垃圾收集器会做标记和清扫。如果您在第二个活动中引用的第一个活动中有一个静态变量,则该引用将保持很长时间。

如果您使用更多静态变量,您可能会出现内存泄漏。也减少使用不必要的物品。

静态变量由 ClassLoader 引用的 Class 对象引用 - 因此,除非 ClassLoader 以某种方式删除 Class 或 ClassLoader 本身符合垃圾收集条件,否则静态变量不会被垃圾收集。因此,如果您使用在许多类中引用的静态变量,除非这些类可用于垃圾收集,否则这些类和声明静态变量的类不能被垃圾收集。所以这会导致堆内存扩展导致内存泄漏。

要在活动之间传递数据(基元类型),我建议使用意图。

在这个视频中,这个人谈到了为什么不应该使用静态变量以及如何避免内存泄漏。http://www.youtube.com/watch?v=_CruQY55HOk

http://developer.android.com/training/articles/perf-tips.html。检查将静态最终用于常量下的主题。

并不是说您不应该使用静态变量。

http://developer.android.com/guide/faq/framework.html#3

查看如何在单个应用程序中的活动/服务之间传递数据下的主题?

于 2013-04-14T18:05:57.837 回答
1

In case when you are using static String to pass data the memory leak is not significant, but there is something more important:

When you press HOME on the second activity and your process is killed by the system, after you go back you will not see the value of a static String what you set before (it will be null or what value you set it as default), but you will get the value from the Intent you passed. This works because system persists this value.

于 2013-04-14T19:46:09.633 回答
1

从安全和设计的角度来看,这是一个坏主意。

首先,如果您的进程被 ActivityManager 透明地重新启动(例如,由于 RAM 压力),它可能是不安全的。在这种情况下,您的所有静力学都将重新初始化。

其次,意图是在进程内和进程间启动组件并可能跨进程边界传递数据的 android 方式。在跨越流程边界的情况下,静态解决方案显然行不通。

在您的示例中,DisplayMessageActivity 是在同一进程中启动的,但是如果明天您决定它应该接受来自其他应用程序的意图怎么办。然后您将不得不返回并以“正确的方式”传递数据。为什么不从“正确的方式”开始,让它成为未来的证明呢?

于 2013-04-14T18:51:39.147 回答