【问题标题】:Why use Intent when we can directly use modified static members?当我们可以直接使用修改后的静态成员时,为什么还要使用 Intent?
【发布时间】:2013-04-14 17:55:06
【问题描述】:

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

在 Main_Activity 中: Step-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);
}

第三步:在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 字符串的值分配给 *message 字符串在显示消息活动中。 我是说, 步骤: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 呢?

【问题讨论】:

    标签: android android-intent static


    【解决方案1】:

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

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

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

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

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

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

    http://developer.android.com/training/articles/perf-tips.html。查看 Use Static Final For Constants 下的主题。

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

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

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

    下的主题

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          猜你喜欢
          • 2020-10-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-10-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-01-06
          相关资源
          最近更新 更多