Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在android中,如何将数据从非活动类传递到活动?_Java_Android_Android Intent - Fatal编程技术网

Java 在android中,如何将数据从非活动类传递到活动?

Java 在android中,如何将数据从非活动类传递到活动?,java,android,android-intent,Java,Android,Android Intent,我正在构建我的应用程序,并使用socket.io与Web服务器通信。我有java文件来处理那些不是活动的文件,它们在后台运行。因此,要启动它们,它将在活动中实例化,套接字将运行。现在,Web服务器触发我在回调中处理的消息,并将数据传递给活动。现在,我正在寻找将数据从正在运行的非活动类传递到当前正在运行的活动的最佳方法 我之前所做的是使用非活动类创建的意图,该类将数据发送到当前正在运行的活动。activity必须更改为singleinstance或singletop,以避免活动继续自行重新启动。

我正在构建我的应用程序,并使用socket.io与Web服务器通信。我有java文件来处理那些不是活动的文件,它们在后台运行。因此,要启动它们,它将在活动中实例化,套接字将运行。现在,Web服务器触发我在回调中处理的消息,并将数据传递给活动。现在,我正在寻找将数据从正在运行的非活动类传递到当前正在运行的活动的最佳方法

我之前所做的是使用非活动类创建的意图,该类将数据发送到当前正在运行的活动。activity必须更改为singleinstance或singletop,以避免活动继续自行重新启动。 问题是,在我的主活动中,我不能使用单顶启动模式,因为在某些情况下,我需要活动本身进行刷新

因此,我无法让套接字在主活动上正常工作,因为我只能在将主活动更改为singletop时接收数据,这对于应用程序来说并不理想。我第一次尝试在acivity中命名一个函数,该函数将由非活动类调用,但这似乎是非法的,所以我被困在这里

@Override
    public void on(String event, IOAcknowledge ack, Object... data) {

        System.out.println("Server may have triggered event '" + event + "'");

        if (event.equals("message")) {
        System.out.println(data[2]);

        Intent newIntent = new Intent(Chat.mContent, Chat.class);
        Bundle extras=new Bundle();
        extras.putString("name", (String)data[1]);
        extras.putString("MSG", (String)data[2]);
        newIntent.putExtras(extras);


        Chat.mContent.startActivity(newIntent);

        }
        if (event.equals("ready")) {
            System.out.println("Received the ready callback");
            try{
            Intent newIntent = new Intent(TabExercise.mContext, TabExercise.class);
            newIntent.putExtra("ready", event);
            TabExercise.mContext.startActivity(newIntent);
            }catch(Exception e){
                System.out.println("Caught an error");
            }


        }
    }
这是发送数据的非活动类中的方法

@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
Bundle extras=intent.getExtras();

if (intent.hasExtra("ready")) {
    // Retrieve the message and call getMsg(String)
   connect.starter(SaveSharedPreference.getName(TabExercise.this), SaveSharedPreference.getUserId(TabExercise.this));

}
}


这是在main活动中捕获意图的地方。不理想

就我所理解的问题而言,你开始你的活动,从那里开始你的CommunicationHandler实例

然后,您将让您的活动实现任何类型的回调接口,用回调(意味着活动)实例化您的处理程序,并调用回调调用方法

有关如何使用回调的更多详细信息,请参阅

对不起,如果我理解错了:-)

编辑:

main活动(启动SocketConnector并接收消息的活动)应该提供回调接口的实现。界面可以是这样的:

public interface IMessageReceiver {
  public void onMessageReceived(Message m);
}
您的消息类如下所示:

public class Message {
  String name;
  String msg;
  //add getter/setter and constructor to fit your needs
}
那么您的主要活动应该如下所示:

public class MainActivity extends Activity implements IMessageReceiver {
  //... main activity code here.
    SocketConnector mySC = new SocketConnector(this);
  //... more main activity code here.
  public void onMessageReceived(Message m) {
    //do something with the message, e.g. display to edit texts, lists etc.
  }
}
在SocketConnector中,您将IMessageReceiver定义为最终成员,并调用
接收器

IMessageReceiver receiver

public SocketConnector(IMessageReceiver receiver) {
  this.receiver = receiver;
}

@Override
public void on(String event, IOAcknowledge ack, Object... data) {
  if (event.equals("message")) {
      System.out.println(data[2]);

      //Intent newIntent = new Intent(Chat.mContent, Chat.class);
      //Bundle extras=new Bundle();
      //extras.putString("name", (String)data[1]);
      //extras.putString("MSG", (String)data[2]);
      //newIntent.putExtras(extras);


      //Chat.mContent.startActivity(newIntent);
      Message m = new Message();
      m.name = (String)data[0];
      m.msg = (String)data[1];
      this.receiver.onMessageReceived(m);
    }
}

我认为您可能会发现使用
单例
或非UI
片段
很有帮助。如果你还没有为你的用户界面使用片段,那你肯定应该这么做,因为它是现代安卓应用程序的法律标准。更重要的是,Android支持库提供了一路返回到Android 1.6的片段,这是向后兼容的理想选择

您可以使用
处理程序在线程之间均匀地传递数据和消息。这些基本上提供了一个管道,您可以
将消息发布到
handleMessage
。您可能会在
应用程序
onCreate
中启动网络,并可能将线程存储为
单线程
。然后,您会将对UI
处理程序的引用传递给该线程,该线程可以通过发布
可运行文件来直接与您的UI通信

一个有趣的答案是“更好”,可以在这里找到:


嗯,我看不出这会有什么效果,因为它需要实时工作。嗯,不是真的。Activity会启动通信处理程序,而通信处理程序又会依次启动socketconnector和callbackinterface。回调已被处理和接收,现在的问题是如何从正在运行的活动的回调中获取值。是否使用参数声明了接口的调用方法?让我为这个添加一些代码是的。上的公共void(字符串事件、JSONObject数据);这就是回调在接口中的设置方式。您声明的回调仅用于接收socketConnector和callbackinterface之间的数据,而不是活动和socketConnector之间的数据。否:声明你的活动singleton并不好。为了帮助你,如果你想在整个应用程序期间(包括活动之间)在后台进行交流/倾听,那么你应该考虑扩展
应用程序
类,然后在那里初始化你的
singleton
。要重写的方法是
onCreate
,该方法在应用程序首次启动时调用一次且仅调用一次。但是,如果进程被android终止(例如,由于内存紧张),当用户返回时,它将再次被调用。非常感谢。无论启动模式如何,我都能让您的概念发挥作用,它极大地简化了我的代码。不过,我还将阅读更多关于片段和处理程序的内容。