package com.avoscloud.beijing.push.demo.keepalive; import java.util.HashMap; import java.util.List; import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.graphics.BitmapFactory; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.avos.avoscloud.AVMessage; import com.avos.avoscloud.AVMessageReceiver; import com.avos.avoscloud.LogUtil; import com.avos.avoscloud.Session; import com.avos.avospush.notification.NotificationCompat; import com.avoscloud.beijing.push.demo.keepalive.data.ChatDemoMessage; public class ChatDemoMessageReceiver extends AVMessageReceiver { @Override public void onSessionOpen(Context context, Session session) { this.sendOpenIntent(context); } @Override public void onSessionPaused(Context context, Session session) { LogUtil.avlog.d("这里掉线了"); } @Override public void onSessionResumed(Context context, Session session) { LogUtil.avlog.d("重新连接上了"); } @Override public void onMessage(Context context, Session session, AVMessage msg) { JSONObject j = JSONObject.parseObject(msg.getMessage()); ChatDemoMessage message = new ChatDemoMessage(); MessageListener listener = sessionMessageDispatchers.get(msg.getFromPeerId()); /* * 这里是demo中自定义的数据格式,在你自己的实现中,可以完全自由的通过json来定义属于你自己的消息格式 * * 用户发送的消息 {"msg":"这是一个消息","dn":"这是消息来源者的名字"} * * 用户的状态消息 {"st":"用户触发的状态信息","dn":"这是消息来源者的名字"} */ if (j.containsKey("content")) { message.fromAVMessage(msg); // 如果Activity在屏幕上不是active的时候就选择发送 通知 if (listener == null) { LogUtil.avlog.d("Activity inactive, about to send notification."); NotificationManager nm = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); String ctnt = message.getMessageFrom() + ":" + message.getMessageContent(); Intent resultIntent = new Intent(context, PrivateConversationActivity.class); resultIntent.putExtra(PrivateConversationActivity.DATA_EXTRA_SINGLE_DIALOG_TARGET, msg.getFromPeerId()); resultIntent.putExtra(Session.AV_SESSION_INTENT_DATA_KEY, JSON.toJSONString(message)); resultIntent.addFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT); PendingIntent pi = PendingIntent.getActivity(context, -1, resultIntent, PendingIntent.FLAG_ONE_SHOT); Notification notification = new NotificationCompat.Builder(context) .setContentTitle(context.getString(R.string.notif_title)) .setContentText(ctnt) .setContentIntent(pi) .setSmallIcon(R.drawable.ic_launcher) .setLargeIcon( BitmapFactory.decodeResource(context.getResources(), R.drawable.ic_launcher)) .setAutoCancel(true).build(); nm.notify(233, notification); LogUtil.avlog.d("notification sent"); } else { listener.onMessage(JSON.toJSONString(message)); } } } @Override public void onMessageSent(Context context, Session session, AVMessage msg) { LogUtil.avlog.d("message sent :" + msg); } @Override public void onMessageFailure(Context context, Session session, AVMessage msg) { LogUtil.avlog.d("message failed :" + msg.getMessage()); } @Override public void onStatusOnline(Context context, Session session, List<String> peerIds) { LogUtil.avlog.d("status online :" + peerIds.toString()); } @Override public void onStatusOffline(Context context, Session session, List<String> peerIds) { LogUtil.avlog.d("status offline :" + peerIds.toString()); } @Override public void onError(Context context, Session session, Throwable e) { LogUtil.log.e("session error", (Exception) e); } private void sendOpenIntent(Context context) { Intent intent = new Intent(context, ChatTargetActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); context.startActivity(intent); } public static void registerSessionListener(String peerId, MessageListener listener) { sessionMessageDispatchers.put(peerId, listener); } public static void unregisterSessionListener(String peerId) { sessionMessageDispatchers.remove(peerId); } static HashMap<String, MessageListener> sessionMessageDispatchers = new HashMap<String, MessageListener>(); }