从另一个活动/服务更改活动变量

时间:2016-01-07 12:28:56

标签: android parameter-passing

以下解决方案主要建议这样做:

  • 使用像here
  • 这样的Intent
  • 使用像here
  • 这样的处理程序
  • 使用SharedPreferences
  • public class Activity1 { private int var1; public void setVar1(int val){ var1=val; } }

问题

定义设置变量的公共方法有什么问题:

public class Activity2 {
    Activity1.setVar1(4);
}

并在Activity2中:

Activity2

它似乎适用于静态和非静态变量

EDIT1:

这是我当前项目的一个简单案例。在原始情况下,Activity1连接到蓝牙集线器并接收多个传感器的数据。如果值已更改,则应将更改后的值(以及当然传感器ID')传递给负责更新UI的BroadcastReceiver。传感器的数量可以超过100并且更新周期在100毫秒的范围内,这意味着可运行的每100毫秒读取收到的BT消息并检查变化。

EDIT2:

def self.search(query) where("title like ?", "%#{query}%") end 也是解决方案。但问题是:定义一个更改/更新变量的set方法是错误的。这种方法在内存方面效率低吗?它会使应用程序变慢吗?这是不合适的代码吗?

我只想知道如果我定义set方法来更改活动变量,我会遇到什么样的问题/效率低下。

2 个答案:

答案 0 :(得分:2)

请记住,Activity实例本身就是Context,并且就它们占用的内存量而言,这些实例可能非常繁重,因为它们保留了对Activity的视图层次结构的引用,所有相关资源。保留对Activity实例的长期引用是内存泄漏的常见原因。

在这个特定的设置中牢记这一点:

public class Activity1 {
   private int var1;
   public void setVar1(int val){
           var1=val;
   }
}

...调用activity1.setVar1(...)意味着正在运行的Activity2实例具有对Activity1实例的引用,这意味着系统不允许对其进行垃圾回收。这种模式可能最终导致应用程序耗尽其堆并崩溃。

您还询问了将这些方法暴露为静态方法的可能性。虽然你可以避免上述问题,但一个潜在的缺陷是,如果用户切换到另一个应用程序,并且系统内存不足,您的应用程序进程可能被系统杀死。由于静态变量与正在运行的流程实例相关联,当用户返回到您的应用程序并且系统恢复其状态时,var1将重置为其默认值(零)。 (您可以通过挂钩生命周期方法将值保存到Bundle实例等来缓解这种情况。)

这些是我可以想到的一些原因,以避免将getter / setter写入Activity的界面。

答案 1 :(得分:1)

参考另一个活动并不是一个好方法,因为每个活动都有自己的生命周期。您引用的活动可能会被破坏,或者系统可能已经启动该活动的新实例,而您仍然引用旧活动。

或者,您可以使用事件总线(例如Otto)将对象/事件发布到另一个活动。