2

私は自分のアプリを構築しており、socket.io を使用して Web サーバーと通信しています。アクティビティではなく、バックグラウンドで実行されるものを処理する Java ファイルがあります。それらを開始するには、アクティビティでインスタンス化され、ソケットが実行されます。これで、Web サーバーがメッセージをトリガーし、それをコールバックで処理して、データをアクティビティに渡します。現在、実行中の非アクティビティ クラスから現在実行中のアクティビティにデータを渡す最良の方法を探しています。

以前に行ったことは、現在実行中のアクティビティにデータを送信する非アクティビティ クラスによって作成されたインテントを使用することでした。アクティビティがそれ自体で再起動し続けるのを避けるために、アクティビティを singleinstance または singletop に変更する必要がありました。問題は、場合によってはアクティビティ自体を更新する必要があるため、メインのアクティビティからシングルトップ起動モードを使用できないことです。

そのため、メイン アクティビティをアプリにとって理想的ではないシングルトップに変更した場合にのみデータを受信できるため、ソケットをメイン アクティビティで適切に動作させることができません。私は最初に、非アクティビティ クラスによって呼び出されるアクティビティ内の関数に名前を付けようとしましたが、それは違法であるように思われるため、ここでかなり立ち往生しています。

@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));

}

}

これは、メイン アクティビティでインテントがキャッチされる場所です。理想的ではありません。

4

2 に答える 2

1

私が質問を理解している限り、アクティビティを開始し、そこから CommunicationHandler インスタンスを開始しますか?

次に、アクティビティに任意の種類の CallBack インターフェイスを実装させ、CallBack (つまり、アクティビティ) を使用して Handler をインスタンス化し、CallBacks 呼び出しメソッドを呼び出します。

この質問を参照してください。コールバックの使用方法の詳細については、回答です。

私がそれを間違って理解した場合は申し訳ありません:-)

編集:

MainActivity (SocketConnector を開始してメッセージを受信するもの) は、コールバック インターフェイスの実装を提供する必要があります。インターフェイスは次のようになります。

public interface IMessageReceiver {
  public void onMessageReceived(Message m);
}

Message クラスは次のようになります。

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 を最終メンバーとして定義し、receiver.onMessageReceived(m)-を呼び出します。

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);
    }
}
于 2013-07-22T19:37:46.213 に答える