是否有其他意图发送类(非活动)数据?

时间:2019-06-30 12:48:24

标签: android

以前,我在项目中使用活动,并且使用 Intent 将数据从一个活动发送到另一个活动,这非常正常。

现在需求更改了,我必须在Dialogs上显示所有内容,而不是活动,因此将3-4个对话框类和单个活动分开。

现在我也希望对话框上具有相同的流程,但是暂时无法准确传递意图的数据!

我尝试过使用Singleton,但是问题是直到整个生命周期它都会保留数据,但是我不想要那样。

我也不能使用该界面,因为有很多事情要传递。

此外,我不能在所有这些中都使用捆绑基金,因为这全部取决于运行时,我的意思是这取决于用户是否填写输入

问题:如何将数据从一个班级传递到另一个班级或活动?并且不应该在整个生命周期中都保存价值。

2 个答案:

答案 0 :(得分:0)

静态发送数据是一种选择,但不是一种好方法,因为静态变量的内存是在应用程序级别分配的,可以在需要内存时清除。最好的方法是使用

面向对象的方法

例如,如果您有一个类,则可以在类构造函数中发送数据,也可以通过函数调用发送数据

class class1 
{

  public class1(Object data) { // constructor
      // you can use this data
  }

   //// Or through function call

   public void func(Object data) { // this method can be called by other classes which has its object
       // you can use this data
   }
}

现在让我们假设您还有另一堂课

class class2
{
    class1 obj = new class1(your_data_object); // if you want to send through constructor

    void someMethod() {

         obj.func(your_data_object); // send data whatever you want to send
    }
}

很明显,您的案例不会像我的示例那样简单,但是要处理复杂的案例,您可以实现接口。

接口示例

定义接口

interface myListener {
  public void listen(Object data);
}
现在

可以说您要从class1调用class2方法。那么class2必须实现此接口。

public class class2 implements myListener {
@override
public void listen(Object data)
{
   /// you got data here, do whatever you want to do that with that data.
}
}

现在在class1中,如果您有接口对​​象,则可以调用class2方法

interfaceRef.listen(your_data);

答案 1 :(得分:0)

尝试使用EventBus或BroadCastReceivers在本地变量中相应地传递数据。

EventBus是用于Android和Java的发布/订阅事件总线。 EventBus ...简化了组件之间的通信。解耦事件发送者和接收者。在“活动”,“片段”和后台线程中表现良好。

http://greenrobot.org/eventbus

首先在您的活动中注册到EventBus

  @Override
    public void onStart() {
        super.onStart();
        EventBus.getDefault().register(this);
    }

    @Override
    public void onStop() {
        EventBus.getDefault().unregister(this);
        super.onStop();
}

现在可以从任何地方传递数据,无论它是活动/碎片/后台服务等,诸如此类:

 EventBus.getDefault().postSticky(new MessageEvent("your data here");

现在您的活动中收到如下消息:

  @Subscribe(sticky = true,threadMode = ThreadMode.MAIN)
        public void onMessageEvent(MessageEvent event) {
            Log.e("TAG","Event Received");
            Log.e("TAG",event.getData);
    }