为什么在我们可以直接使用修改后的静态成员时使用Intent?

时间:2013-04-14 17:55:07

标签: android android-intent static

假设我们通过单击按钮将活动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?

3 个答案:

答案 0 :(得分:4)

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

建议不要使用静态变量。静态变量存储在堆的PermGen部分中。即使类完成它,静态变量也会保留在堆中。垃圾收集器会进行标记和扫描。如果第2个活动中引用的第1个活动中有静态变量,则引用将保持较长时间。

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

静态变量由ClassLoaders引用的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

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

下的主题

答案 1 :(得分:1)

出于安全和设计两个方面的原因,这是一个坏主意。

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

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

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

答案 2 :(得分:1)

如果您使用static String传递数据,内存泄漏并不重要,但有一些更重要的事情:

当您在第二个活动上按HOME并且您的流程被系统杀死时,在您返回之后,您将看不到之前设置的static String的值(它将是null或者您将其设置为默认值,但您将从通过的Intent获得值。这是有效的,因为系统会保留此值。