Java 将数据从服务传递到当前活动

Java 将数据从服务传递到当前活动,java,android,google-cloud-messaging,Java,Android,Google Cloud Messaging,我正在构建一个聊天应用程序,它使用GCM推送消息和通知 在应用程序中,我有一个列出对话线程的活动(ConversationListActivity)和一个显示线程内对话的活动(ConversationActivity) 我在gcminentservice的onMessage方法中捕获新消息。通知起作用,消息按预期记录 public class GCMIntentService extends GCMBaseIntentService { @Override protected void

我正在构建一个聊天应用程序,它使用GCM推送消息和通知

在应用程序中,我有一个列出对话线程的活动(
ConversationListActivity
)和一个显示线程内对话的活动(
ConversationActivity

我在gcminentservice的onMessage方法中捕获新消息。通知起作用,消息按预期记录

public class GCMIntentService extends GCMBaseIntentService {
  @Override
  protected void onMessage(Context context, Intent intent) {
    Bundle extras = intent.getExtras();
    String sender = extras.getString("sender");
    String message = extras.getString("message");

    ConversationModel model = new ConversationModel(context);
    model.open();
    model.createMessage(sender, message.trim(), true, true, ConversationMessage.STATUS_SENT);
    model.close();

    this.createMessageNotification(context, sender, message);
  }
}
问题是,如果GCM在
ConversationActivity
处于活动状态时推送新消息,我不希望它生成通知。相反,我希望直接刷新对话


每次有来自GCM的新消息时,如何让活动的
会话活动
刷新消息列表?

我自己找到了解决方案。我确信这不是最好的方法,但至少对我来说是有效的

创建一个派生
处理程序
的单例类,以存储活动的
会话活动
。 在
handleMessage
方法中,处理将从服务发送的消息,该消息告诉处理程序通知活动刷新会话

public class ActiveMessageHandler extends Handler {

  private static ActiveMessageHandler _instance = new ActiveMessageHandler();
  private Activity _activity = null;

  @Override
  public void handleMessage(Message message) {
    if(message.obj.toString().equals("gcmNewMessage") && _activity != null)
        ((ConversationActivity)_activity).repopulateList();

    super.handleMessage(message);
  }

  public static ActiveMessageHandler instance() {
    return _instance;
  }

  public void setActivity(Activity activity) {
    _activity = activity;
  }

  public Activity getActivity() {
    return _activity;
  }

}
public class GCMIntentService extends GCMBaseIntentService {
    @Override
    protected void onMessage(Context context, Intent intent) {
        Bundle extras = intent.getExtras();
        String sender = extras.getString("sender");
        String message = extras.getString("message");

        ConversationModel model = new ConversationModel(context);
        model.open();
        model.createMessage(sender, message.trim(), true, true, ConversationMessage.STATUS_SENT);
        model.close();

        // if ConversationActivity is active, send a message to handler to refresh the conversation
        if(ActiveMessageHandler.instance().getActivity() != null)
        {
            Message msg = Message.obtain(ActiveMessageHandler.instance());
            msg.obj = "gcmNewMessage";
            ActiveMessageHandler.instance().sendMessage(msg);

            // Optionally, play a notification sound
            Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
            Ringtone r = RingtoneManager.getRingtone(getApplicationContext(), notification);
            r.play();
        }
        else
            createMessageNotification(context, sender, message);
    }
}
然后,在
ConversationActivity
中,在处理程序中设置activity属性

public class ConversationActivity extends Activity {
  @Override
  public void onStart() {
    super.onStart();
    ActiveMessageHandler.instance().setActivity(this);
  }

  @Override
  public void onStop() {
    super.onStop();
    ActiveMessageHandler.instance().setActivity(null);
  }
}
最后,在服务中,检查处理程序中的活动是否为null,并向处理程序发送消息以刷新会话

public class ActiveMessageHandler extends Handler {

  private static ActiveMessageHandler _instance = new ActiveMessageHandler();
  private Activity _activity = null;

  @Override
  public void handleMessage(Message message) {
    if(message.obj.toString().equals("gcmNewMessage") && _activity != null)
        ((ConversationActivity)_activity).repopulateList();

    super.handleMessage(message);
  }

  public static ActiveMessageHandler instance() {
    return _instance;
  }

  public void setActivity(Activity activity) {
    _activity = activity;
  }

  public Activity getActivity() {
    return _activity;
  }

}
public class GCMIntentService extends GCMBaseIntentService {
    @Override
    protected void onMessage(Context context, Intent intent) {
        Bundle extras = intent.getExtras();
        String sender = extras.getString("sender");
        String message = extras.getString("message");

        ConversationModel model = new ConversationModel(context);
        model.open();
        model.createMessage(sender, message.trim(), true, true, ConversationMessage.STATUS_SENT);
        model.close();

        // if ConversationActivity is active, send a message to handler to refresh the conversation
        if(ActiveMessageHandler.instance().getActivity() != null)
        {
            Message msg = Message.obtain(ActiveMessageHandler.instance());
            msg.obj = "gcmNewMessage";
            ActiveMessageHandler.instance().sendMessage(msg);

            // Optionally, play a notification sound
            Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
            Ringtone r = RingtoneManager.getRingtone(getApplicationContext(), notification);
            r.play();
        }
        else
            createMessageNotification(context, sender, message);
    }
}

我自己找到了解决办法。我确信这不是最好的方法,但至少对我来说是有效的

创建一个派生
处理程序
的单例类,以存储活动的
会话活动
。 在
handleMessage
方法中,处理将从服务发送的消息,该消息告诉处理程序通知活动刷新会话

public class ActiveMessageHandler extends Handler {

  private static ActiveMessageHandler _instance = new ActiveMessageHandler();
  private Activity _activity = null;

  @Override
  public void handleMessage(Message message) {
    if(message.obj.toString().equals("gcmNewMessage") && _activity != null)
        ((ConversationActivity)_activity).repopulateList();

    super.handleMessage(message);
  }

  public static ActiveMessageHandler instance() {
    return _instance;
  }

  public void setActivity(Activity activity) {
    _activity = activity;
  }

  public Activity getActivity() {
    return _activity;
  }

}
public class GCMIntentService extends GCMBaseIntentService {
    @Override
    protected void onMessage(Context context, Intent intent) {
        Bundle extras = intent.getExtras();
        String sender = extras.getString("sender");
        String message = extras.getString("message");

        ConversationModel model = new ConversationModel(context);
        model.open();
        model.createMessage(sender, message.trim(), true, true, ConversationMessage.STATUS_SENT);
        model.close();

        // if ConversationActivity is active, send a message to handler to refresh the conversation
        if(ActiveMessageHandler.instance().getActivity() != null)
        {
            Message msg = Message.obtain(ActiveMessageHandler.instance());
            msg.obj = "gcmNewMessage";
            ActiveMessageHandler.instance().sendMessage(msg);

            // Optionally, play a notification sound
            Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
            Ringtone r = RingtoneManager.getRingtone(getApplicationContext(), notification);
            r.play();
        }
        else
            createMessageNotification(context, sender, message);
    }
}
然后,在
ConversationActivity
中,在处理程序中设置activity属性

public class ConversationActivity extends Activity {
  @Override
  public void onStart() {
    super.onStart();
    ActiveMessageHandler.instance().setActivity(this);
  }

  @Override
  public void onStop() {
    super.onStop();
    ActiveMessageHandler.instance().setActivity(null);
  }
}
最后,在服务中,检查处理程序中的活动是否为null,并向处理程序发送消息以刷新会话

public class ActiveMessageHandler extends Handler {

  private static ActiveMessageHandler _instance = new ActiveMessageHandler();
  private Activity _activity = null;

  @Override
  public void handleMessage(Message message) {
    if(message.obj.toString().equals("gcmNewMessage") && _activity != null)
        ((ConversationActivity)_activity).repopulateList();

    super.handleMessage(message);
  }

  public static ActiveMessageHandler instance() {
    return _instance;
  }

  public void setActivity(Activity activity) {
    _activity = activity;
  }

  public Activity getActivity() {
    return _activity;
  }

}
public class GCMIntentService extends GCMBaseIntentService {
    @Override
    protected void onMessage(Context context, Intent intent) {
        Bundle extras = intent.getExtras();
        String sender = extras.getString("sender");
        String message = extras.getString("message");

        ConversationModel model = new ConversationModel(context);
        model.open();
        model.createMessage(sender, message.trim(), true, true, ConversationMessage.STATUS_SENT);
        model.close();

        // if ConversationActivity is active, send a message to handler to refresh the conversation
        if(ActiveMessageHandler.instance().getActivity() != null)
        {
            Message msg = Message.obtain(ActiveMessageHandler.instance());
            msg.obj = "gcmNewMessage";
            ActiveMessageHandler.instance().sendMessage(msg);

            // Optionally, play a notification sound
            Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
            Ringtone r = RingtoneManager.getRingtone(getApplicationContext(), notification);
            r.play();
        }
        else
            createMessageNotification(context, sender, message);
    }
}

您是否将消息会话保存在DB中?是的,
ConversationModel
是一个管理sqlite DB的模型类。您是否将消息会话保存在DB中?是的,
ConversationModel
是一个管理sqlite DB的模型类。谢谢@croweeth。我不知道这有多高效,但它确实帮助了我。正如您所说的“我确信这不是最好的方法”如果你发现比这更好的方法,请更新你的答案。你以这种方式将对活动的引用存储在静态字段中。这会在长时间运行中产生内存泄漏谢谢@croweeath。我不知道这有多高效,但肯定对我有帮助。正如你所说的”我确信这不是最好的方法“如果你发现比这更好的方法,请更新你的答案。你用这种方法在静态字段中存储对活动的引用。从长远来看,这会导致内存泄漏