• 事件处理
    • 概述
      • 事件接收类的注册
      • 事件接收类的解绑
      • 事件接收
        • 子线程模式(默认线程)
        • 主线程模式
      • 用户事件
      • 消息/会话事件
      • 群组事件
      • 聊天室事件
      • 好友事件
      • 命令透传事件
      • 通知栏点击事件
      • 示例代码

    事件处理

    概述

    当sdk收到某些后台下发的数据,或者发生了某些需要上层关注的事件时,sdk会上抛事件对象通知给上层,例如,在线消息事件、会话刷新事件、用户下线事件等。应用上层需要根据实际情况决定是否需要接收并且处理事件。

    事件接收类的注册

    应用层可以在任意类中注册事件接收,sdk会持有这个类的强引用,上层需要注意在合适的地方解绑事件接收。如果要实现全局事件监听,或者在应用的整个生命周期内都需要监听事件的话,建议放在application类里,不要放在类似activity、或者fragmemt、service之类的组件中。

    1. JMessageClient.registerEventReceiver(Object receiver);
    2. JMessageClient.registerEventReceiver(Object receiver, int priority);

    参数说明

    • Object receiver 消息接收类对象
    • int priority 定义事件接收者接收事件的优先级,默认值为0,优先级越高将越先接收到事件。(优先级只对同一个线程模式中的接收者有效)

    事件接收类的解绑

    1. JMessageClient.unRegisterEventReceiver(Object receiver);

    参数说明

    • Object receiver 消息接收类对象,对象解绑之后将不再接收到任何event。

    事件接收

    注册事件接收类之后,需要在消息接收类中实现如下方法来接收对应消息。sdk将根据实现方法的方法名来区分不同的线程模式,常用的线程模式有onEvent(默认线程模式)和onEventMainThread(主线程模式)两种。

    可以通过定义不同类型的参数,来接收不同种类的事件。具体事件类型定义见 “事件类型” 一节

    子线程模式(默认线程)

    1. public void onEvent(EventEntity event){
    2. //do your own business
    3. }

    方法体将在子线程中被调用, 可以用来处理耗时操作。

    参数定义

    • EventEntity event 事件对象。( 指代下文的具体事件类型实体类型,具体用法可以参考“示例代码“。)

    主线程模式

    1. public void onEventMainThread(EventEntity event){
    2. //do your own business
    3. }

    方法体将在主线程中被调用,可以用来刷新UI。参数定义

    • EventEntity event 事件对象。EventEntity指代的是下文的具体事件类型

    用户事件

    当前登录用户信息被更新事件实体类 MyInfoUpdatedEvent

    方法类型说明
    getMyInfo()UserInfo获取更新之后的我的userinfo

    用户下线事件UserLogoutEvent**(已过时,请使用LoginStateChangeEvent代替)**

    方法类型说明
    getMyInfo()UserInfo获取当前被登出账号的信息

    用户被删除事件UserDeletedEvent**(已过时,请使用LoginStateChangeEvent代替)**

    方法类型说明
    getMyInfo()UserInfo获取当前被删除账号的信息

    用户登录状态变更事件LoginStateChangeEvent

    方法类型说明
    getMyInfo()UserInfo获取当前登录状态改变的账号的信息
    getReason()Reason获取登录状态变更原因。

    消息/会话事件

    在线消息事件实体类 MessageEvent

    方法类型说明
    getMessage()Message获取消息对象

    离线消息事件实体类 OfflineMessageEvent**Since 2.1.0**

    方法类型说明
    getConversation()Conversation获取收到离线消息的会话对象
    getNewMessageList()List获取收到的离线消息列表,包含了该会话此次离线收到的所有离线消息列表。其中也有可能包含自己发出去的消息。
    getOfflineMsgCnt()int获取此次事件中该会话的离线消息总数。

    会话刷新事件实体类 ConversationRefreshEvent

    方法类型说明
    getConversation()Conversation获取需要被刷新的会话对象
    getReason()Reason获取事件发生的原因,包括消息漫游完成、会话信息更新等

    消息被对方撤回通知事件MessageRetractEvent**Since 2.2.0**

    方法类型说明
    getConversation()Conversation获取被撤回消息所属的会话对象
    getRetractedMessage()Message获取被撤回的message对象. (注意!此时获取到的Message的MessageContent对象已经从撤回前的真正的消息内容变为了PromptContent类型的提示文字)

    消息未回执人数变更事件MessageReceiptStatusChangeEvent**Since 2.3.0**

    方法类型说明
    getConversation()Conversation获取未回执数变更的消息所属的会话对象
    getMessageReceiptMetas()List<MessageReceiptMeta>获取未回执数发生变化的消息的MessageReceiptMeta。其中包括了消息的serverMsg Id、当前的未回执人数、以及未回执人数更新的时间

    群组事件

    群成员变化相关事件群组成员变化相关事件因为sdk需要入库,所以sdk会将相关事件以消息事件的方式上抛,用户可以将群组中产生的成员变化事件理解成一条特殊的消息,其消息类型为eventNotification,例如:

    1. //用户在线期间,如果群组中发生了成员变化事件,sdk也会通过上抛MessageEvent的方式来通知上层
    2. public void onEvent(MessageEvent event) {
    3. Message msg = event.getMessage();
    4. //获取消息类型,如text voice image eventNotification等。
    5. switch (msg.getContentType()) {
    6. //处理事件提醒消息,此处message的contentType类型为eventNotification。
    7. case eventNotification:
    8. //获取事件发生的群的群信息
    9. GroupInfo groupInfo = (GroupInfo) msg.getTargetInfo();
    10. //获取事件具体的内容对象
    11. EventNotificationContent eventNotificationContent = (EventNotificationContent)msg.getContent();
    12. //获取事件具体类型
    13. switch (eventNotificationContent.getEventNotificationType()){
    14. case group_member_added:
    15. //群成员加群事件
    16. break;
    17. case group_member_removed:
    18. //群成员被踢事件
    19. break;
    20. case group_member_exit:
    21. //群成员退群事件
    22. break;
    23. case group_info_updated://since 2.2.1
    24. //群信息变更事件
    25. break;
    26. ...
    27. }
    28. break;
    29. }
    30. }
    31. //用户离线期间,如果群组中发生了成员变化事件,sdk也会通过上抛OfflineMessageEvent
    32. //的方式来通知上层,处理方式类似上面的MessageEvent
    33. public void onEvent(OfflineMessageEvent event) {
    34. List<Message> msgs = event.getOfflineMessageList();
    35. for (Message msg:msgs) {
    36. //...
    37. }
    38. }

    群成员审批事件GroupApprovalEvent**Since 2.4.0**

    方法类型说明
    getType()Type获取群成员审批通知事件类型,主动申请入群是Type.apply_join_group,邀请入群是Type.invited_into_group
    getFromUserInfo()UserInfo获取群成员审批事件发起方UserInfo,主动申请入群时是申请人UserInfo,邀请入群时是邀请人UserInfo
    getApprovalUserInfoList()List<UserInfo>获取需要审批入群的用户UserInfo
    getApprovalUserCount()int获取需要审批入群的用户的人数
    getReason()String获取事件发生的理由,主动申请入群时是申请理由(可为null),邀请入群时是null
    acceptGroupApproval()void入群审批同意,需要指定usernameappKey
    refuseGroupApproval()void入群审批拒绝,需要指定usernameappKeyreason(可为null)

    群成员审批拒绝事件GroupApprovalRefuseEvent**Since 2.4.0**

    方法类型说明
    getFromUserInfo()UserInfo获取事件发起方userInfo,在本事件中为群主信息
    getToUserInfoList()List<UserInfo>获取事件对象用户信息列表,在本事件中为被拒绝入群的用户UserInfo列表
    getReason()String获取事件发生的理由, 在本事件中为群主审批拒绝的理由
    getGid()long返回实际群组Gid

    已审批事件通知GroupApprovedNotificationEvent**Since 2.5.0**

    方法类型说明
    getApprovalEventID()long获取对应的入群审批事件ID
    getApprovalResult()boolean获取入群审批结果
    getGroupID()long获取入群审批事件对应的群组ID
    getOperator()UserInfo获取该次入群审批的操作者用户信息
    getApprovedUserInfoList()List<UserInfo>获取已被审批过的用户信息,这些用户的入群审批已经被审批

    群成员昵称修改事件GroupMemNicknameChangedEvent**Since 2.7.0**

    方法类型说明
    getGroupID()long获取群组id
    getChangeEntities()List<ChangeEntity>获取昵称修改事件列表,按照时间升序排列

    群公告变更事件GroupAnnouncementChangedEvent**Since 2.8.0**

    方法类型说明
    getGroupID()long获取群组id
    getChangeEntities()List<ChangeEntity>获取公告变更事件列表,按照时间升序排列

    群黑名单变更事件GroupBlackListChangedEvent**Since 2.8.0**

    方法类型说明
    getGroupID()long获取群组id
    getChangeEntities()List<ChangeEntity>获取黑名单变更事件列表,按照时间升序排列

    聊天室事件

    聊天室消息事件ChatRoomMessageEvent**Since 2.4.0**聊天室消息因为sdk不会入库,所以没有走正常的消息事件,而是单独的聊天室消息事件。注意和消息事件做区分

    方法类型说明
    getMessages()List<Message>获取聊天室消息事件中包含的消息列表

    聊天室通知事件ChatRoomNotificationEvent**Since 2.8.0**

    方法类型说明
    getEventID()long获取事件ID
    getRoomID()long获取事件对应聊天室的房间ID
    getType()Type获取事件类型
    getOperator(GetUserInfoCallback callback)void获取事件操作者用户信息
    getTargetUserInfoList(GetUserInfoListCallback callback)void获取目标用户信息列表
    getCtime()long取事件发生时间,单位-毫秒

    好友事件

    好友相关事件通知实体类ContactNotifyEvent**Since 1.4.0**

    方法类型说明
    getType()Type获取好友通知事件的具体类型。
    getReason()String获取事件发生的理由,该字段由对方发起请求时所填。
    getFromUsername()String获取事件发起者用户的username
    getfromUserAppKey()String获取事件发起者用户所属应用的appKey

    命令透传事件

    命令透传事件实体类CommandNotificationEvent**Since 2.3.0**

    方法类型说明
    getSenderUserInfo()UserInfo获取命令透传消息发送者的UserInfo
    getType()Type获取命令透传消息对象的类型,单聊是Type.single,群聊则是Type.group,如果是自己已登录设备间的命令透传则是Type.self
    getTargetInfo()Objcet获取命令透传消息发送对象的Info。若对象是单聊用户则是UserInfo,对象是群组则是GroupInfo,使用时强制转型
    getMsg()String获取命令透传消息的实际内容

    通知栏点击事件

    通知栏点击事件实体类NotificationClickEvent

    方法类型说明
    getMessage()Message获取点击的通知所对应的消息对象

    示例代码

    接收消息事件

    1. class MessageEventReceiver extends Activity {
    2. @Override
    3. protected void onCreate() {
    4. super.onCreate(savedInstanceState);
    5. //这里只是为了展示注册事件接受者接口的用法,实际上开发者可以在任意类中注册事件接收者
    6. //,而不仅仅在Activity中。 下同
    7. JMessageClient.registerEventReceiver(this);
    8. }
    9. @Override
    10. protected void onDestroy() {
    11. JMessageClient.unRegisterEventReceiver(this);
    12. super.onDestroy();
    13. }
    14. //用户在线期间收到的消息都会以MessageEvent的方式上抛
    15. public void onEvent(MessageEvent event) {
    16. Message msg = event.getMessage();
    17. switch (msg.getContentType()) {
    18. case text:
    19. //处理文字消息
    20. TextContent textContent = (TextContent) msg.getContent();
    21. textContent.getText();
    22. break;
    23. case image:
    24. //处理图片消息
    25. ImageContent imageContent = (ImageContent) msg.getContent();
    26. imageContent.getLocalPath();//图片本地地址
    27. imageContent.getLocalThumbnailPath();//图片对应缩略图的本地地址
    28. break;
    29. case voice:
    30. //处理语音消息
    31. VoiceContent voiceContent = (VoiceContent) msg.getContent();
    32. voiceContent.getLocalPath();//语音文件本地地址
    33. voiceContent.getDuration();//语音文件时长
    34. break;
    35. case custom:
    36. //处理自定义消息
    37. CustomContent customContent = (CustomContent) msg.getContent();
    38. customContent.getNumberValue("custom_num"); //获取自定义的值
    39. customContent.getBooleanValue("custom_boolean");
    40. customContent.getStringValue("custom_string");
    41. break;
    42. case eventNotification:
    43. //处理事件提醒消息
    44. EventNotificationContent eventNotificationContent = (EventNotificationContent)msg.getContent();
    45. switch (eventNotificationContent.getEventNotificationType()){
    46. case group_member_added:
    47. //群成员加群事件
    48. break;
    49. case group_member_removed:
    50. //群成员被踢事件
    51. break;
    52. case group_member_exit:
    53. //群成员退群事件
    54. break;
    55. case group_info_updated://since 2.2.1
    56. //群信息变更事件
    57. break;
    58. }
    59. break;
    60. case unknown:
    61. // 处理未知消息,未知消息的Content为PromptContent 默认提示文本为“当前版本不支持此类型消息,请更新sdk版本”,上层可选择不处理
    62. PromptContent promptContent = (PromptContent) msg.getContent();
    63. promptContent.getPromptType();//未知消息的type是unknown_msg_type
    64. promptContent.getPromptText();//提示文本,“当前版本不支持此类型消息,请更新sdk版本”
    65. break;
    66. }
    67. }
    68. //用户离线期间收到的消息会以OfflineMessageEvent的方式上抛,处理方式类似上面的
    69. //MessageEvent
    70. public void onEvent(OfflineMessageEvent event) {
    71. List<Message> msgs = event.getOfflineMessageList();
    72. for (Message msg:msgs) {
    73. //...
    74. }
    75. }
    76. }

    接收通知栏点击事件

    1. class NotificationClickEvent extends Activity{
    2. @Override
    3. protected void onCreate() {
    4. super.onCreate(savedInstanceState);
    5. JMessageClient.registerEventReceiver(this);
    6. }
    7. @Override
    8. protected void onDestroy() {
    9. JMessageClient.unRegisterEventReceiver(this);
    10. super.onDestroy();
    11. }
    12. public void onEvent(NotificationClickEvent event){
    13. Intent notificationIntent = new Intent(mContext, ChatActivity.class);
    14. mContext.startActivity(notificationIntent);//自定义跳转到指定页面
    15. }
    16. }

    用户登录状态变更事件

    1. class UserLogoutEventReceiver extends Activity{
    2. @Override
    3. protected void onCreate() {
    4. super.onCreate(savedInstanceState);
    5. JMessageClient.registerEventReceiver(this);
    6. }
    7. @Override
    8. protected void onDestroy() {
    9. JMessageClient.unRegisterEventReceiver(this);
    10. super.onDestroy();``
    11. }
    12. public void onEvent(LoginStateChangeEvent event){
    13. LoginStateChangeEvent.Reason reason = event.getReason();//获取变更的原因
    14. UserInfo myInfo = event.getMyInfo();//获取当前被登出账号的信息
    15. switch (reason) {
    16. case user_password_change:
    17. //用户密码在服务器端被修改
    18. break;
    19. case user_logout:
    20. //用户换设备登录
    21. break;
    22. case user_deleted:
    23. //用户被删除
    24. break;
    25. }
    26. }
    27. }