dro*_*ath 0 java android google-cloud-messaging
我正在构建一个使用GCM来推送消息和通知的聊天应用程序.
在应用程序中,我有一个活动,列出会话线程(ConversationListActivity)和一个活动,显示线程内的对话(ConversationActivity).
我在GCMIntentService的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);
}
}
Run Code Online (Sandbox Code Playgroud)
问题是,如果GCM在ConversationActivity激活时推送新消息,我不希望它生成通知.相反,我希望对话直接刷新.
ConversationActivity每次有来自GCM的新消息时,如何让主动刷新消息列表?
我自己找到了解决方案.我确信这不是最好的方法,但至少它对我有用.
创建一个派生Handler用于存储活动的单例类ConversationActivity.在该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;
}
}
Run Code Online (Sandbox Code Playgroud)
然后,在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);
}
}
Run Code Online (Sandbox Code Playgroud)
最后,在服务中,检查处理程序中的活动是否为空,并向处理程序发送消息以刷新对话.
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);
}
}
Run Code Online (Sandbox Code Playgroud)