私は自分のアプリを構築しており、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));
}
}
これは、メイン アクティビティでインテントがキャッチされる場所です。理想的ではありません。