Android 更改其他活动/服务中的活动变量

Android 更改其他活动/服务中的活动变量,android,parameter-passing,Android,Parameter Passing,为此,建议采用以下解决方案: 使用类似意图的 使用类处理程序 使用SharedReferenceslike 问题 定义公共方法来设置变量的问题是什么: public class Activity1 { private int var1; public void setVar1(int val){ var1=val; } } 在活动2中: public class Activity2 { Activity1.setVar1(4); } 它似乎

为此,建议采用以下解决方案:

  • 使用类似意图的
  • 使用类处理程序
  • 使用
    SharedReferences
    like
问题

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

public class Activity1 {
   private int var1;
   public void setVar1(int val){
           var1=val;
   }
}
在活动2中:

public class Activity2 {
    Activity1.setVar1(4);
}
它似乎适用于静态和非静态变量

EDIT1:

这是我当前项目的一个简单案例。在最初的情况下,
活动2
连接到蓝牙集线器并接收多个传感器的数据。如果值发生更改,则应将更改后的值(以及偏离航线的传感器ID)传递给负责更新UI的Activity1。传感器的数量可以超过100个,更新周期在100毫秒范围内,这意味着runnable每100毫秒读取一次输入的BT消息并检查更改

EDIT2:

BroadcastReceiver
也是解决方案。但问题是:定义一个set方法来更改/更新变量有什么错。这种方法在内存方面效率低吗?它会使应用程序变慢吗?这是一个不合适的代码吗


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

请记住,
活动
实例本身就是一个
上下文
,就它们占用的内存量而言,它们可能非常沉重,因为它们保留了对活动的视图层次结构及其所有相关资源的引用。保留对活动实例的长期引用是内存泄漏的常见原因

请记住,在此特定设置中:

public class Activity1 {
   private int var1;
   public void setVar1(int val){
           var1=val;
   }
}
…调用
activity1.setVar1(…)
意味着
Activity2
的运行实例引用了
activity1
的实例,这意味着不允许系统对其进行垃圾收集。这种模式最终可能导致应用程序耗尽堆并崩溃

您还询问了将这些方法公开为静态方法的可能性。虽然您可以避免前面提到的问题,但这里的一个潜在陷阱是,如果用户切换到另一个应用程序,并且系统内存不足,那么您的应用程序进程可能会被系统终止。由于静态变量绑定到正在运行的流程实例,当用户返回到应用程序并且系统恢复其状态时,
var1
将重置为其默认值(零)。(您可以通过挂接生命周期方法将值保存到Bundle实例等来缓解这一问题)


这些是我可以想到的避免将getter/setter写入活动接口的一些原因。

请记住,
活动
实例本身就是一个
上下文
,就它们占用的内存量而言,它们可能非常沉重,因为它们保留了对活动的视图层次结构及其所有相关资源的引用。保留对活动实例的长期引用是内存泄漏的常见原因

请记住,在此特定设置中:

public class Activity1 {
   private int var1;
   public void setVar1(int val){
           var1=val;
   }
}
…调用
activity1.setVar1(…)
意味着
Activity2
的运行实例引用了
activity1
的实例,这意味着不允许系统对其进行垃圾收集。这种模式最终可能导致应用程序耗尽堆并崩溃

您还询问了将这些方法公开为静态方法的可能性。虽然您可以避免前面提到的问题,但这里的一个潜在陷阱是,如果用户切换到另一个应用程序,并且系统内存不足,那么您的应用程序进程可能会被系统终止。由于静态变量绑定到正在运行的流程实例,当用户返回到应用程序并且系统恢复其状态时,
var1
将重置为其默认值(零)。(您可以通过挂接生命周期方法将值保存到Bundle实例等来缓解这一问题)


这些是我可以想到的避免将getter/setter写入活动接口的一些原因。

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


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

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


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

可能有类似的问题,但我还不满意。为什么需要更改该值?尝试使用广播接收器。@Sumant:请查看Edit1as@Sumant说您可以使用广播接收器(BroadcastReceiver,LocalBroadcastManager类)@ondermerol:ja绝对正确,BroadcastReceiver是一个解决方案。但问题是:定义一个集合方法来更改/更新变量有什么错,这种方法在内存方面效率低吗?慢吗?这是不合适的代码吗?我只是想知道,如果我定义一套方法来改变活动变量,我会面临什么样的问题/效率低下这些问题可能很相似,但我还不满意。为什么你需要改变这个值?尝试使用广播接收器。@Sumant:请看Edit1as@Sumant说您可以使用广播接收器(BroadcastReceiver,LocalBroadcastManager类)@ondermerol:j