环信UI开源Demo情景分析十一、聊天界面(三)

前面两章已经了解了大部分功能,不过还有一些东西没有讲到,接下来咱们就继续将剩下的部分讲完。

	@Override
	protected void onDestroy() {
		super.onDestroy();
		activityInstance = null;
		EMGroupManager.getInstance().removeGroupChangeListener(groupListener);
	}

在结束聊天界面时候清除当前实例,并且结束群组监听,

/**
	 * 监测群组解散或者被T事件
	 *
	 */
	class GroupListener extends GroupReomveListener {

		@Override
		public void onUserRemoved(final String groupId, String groupName) {
			runOnUiThread(new Runnable() {
				String st13 = getResources().getString(R.string.you_are_group);

				public void run() {
					if (toChatUsername.equals(groupId)) {
						Toast.makeText(ChatActivity.this, st13, 1).show();
						if (GroupDetailsActivity.instance != null)
							GroupDetailsActivity.instance.finish();
						finish();
					}
				}
			});
		}

		@Override
		public void onGroupDestroy(final String groupId, String groupName) {
			// 群组解散正好在此页面,提示群组被解散,并finish此页面
			runOnUiThread(new Runnable() {
				String st14 = getResources().getString(R.string.the_current_group);

				public void run() {
					if (toChatUsername.equals(groupId)) {
						Toast.makeText(ChatActivity.this, st14, 1).show();
						if (GroupDetailsActivity.instance != null)
							GroupDetailsActivity.instance.finish();
						finish();
					}
				}
			});
		}
	}

声明一个类,继承GroupReomveListener类。其中有实现两个方法,一个是用户移出,一个是群组销毁。用户移除的时候结束群组界面,当群组解散的时候,如果正处于群组界面,提示一下然后结束群组界面。跳出当前界面。

	@Override
	protected void onResume() {
		Log.i("ChatActivity", "onResume");
		super.onResume();
		if (group != null)
			((TextView) findViewById(R.id.name)).setText(group.getGroupName());
		adapter.refresh();
		DemoHXSDKHelper sdkHelper = (DemoHXSDKHelper) DemoHXSDKHelper.getInstance();
		sdkHelper.pushActivity(this);
		// register the event listener when enter the foreground
		EMChatManager.getInstance().registerEventListener(this, new EMNotifierEvent.Event[] { EMNotifierEvent.Event.EventNewMessage, EMNotifierEvent.Event.EventDeliveryAck, EMNotifierEvent.Event.EventReadAck });
	}

当界面重新可见的时候,先刷新界面,然后记录当前界面到Activity数组中。并且重新监听SDK中的一些消息事件。

	@Override
	protected void onStop() {
		Log.i("ChatActivity", "onStop");
		// unregister this event listener when this activity enters the
		// background
		EMChatManager.getInstance().unregisterEventListener(this);
		DemoHXSDKHelper sdkHelper = (DemoHXSDKHelper) DemoHXSDKHelper.getInstance();
		// 把此activity 从foreground activity 列表里移除
		sdkHelper.popActivity(this);
		super.onStop();
	}

当界面可不见的时候,解除监听,并且将Activity移出数组。

	@Override
	protected void onPause() {
		super.onPause();
		if (wakeLock.isHeld())
			wakeLock.release();
		if (VoicePlayClickListener.isPlaying && VoicePlayClickListener.currentPlayListener != null) {
			// 停止语音播放
			VoicePlayClickListener.currentPlayListener.stopPlayVoice();
		}

		try {
			// 停止录音
			if (voiceRecorder.isRecording()) {
				voiceRecorder.discardRecording();
				recordingContainer.setVisibility(View.INVISIBLE);
			}
		} catch (Exception e) {
		}
	}

当界面失去焦点的时候,而且屏幕有唤醒锁的时候,先释放唤醒锁。如果正在播放语音,则停止播放,录音也一样停止。

	/**
	 * 隐藏软键盘
	 */
	private void hideKeyboard() {
		if (getWindow().getAttributes().softInputMode != WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN) {
			if (getCurrentFocus() != null)
				manager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
		}
	}
/**
	 * 加入到黑名单
	 *
	 * @param username
	 */
	private void addUserToBlacklist(final String username) {
		final ProgressDialog pd = new ProgressDialog(this);
		pd.setMessage(getString(R.string.Is_moved_into_blacklist));
		pd.setCanceledOnTouchOutside(false);
		pd.show();
		new Thread(new Runnable() {
			public void run() {
				try {
					EMContactManager.getInstance().addUserToBlackList(username, false);
					runOnUiThread(new Runnable() {
						public void run() {
							pd.dismiss();
							Toast.makeText(getApplicationContext(), R.string.Move_into_blacklist_success, 0).show();
						}
					});
				} catch (EaseMobException e) {
					e.printStackTrace();
					runOnUiThread(new Runnable() {
						public void run() {
							pd.dismiss();
							Toast.makeText(getApplicationContext(), R.string.Move_into_blacklist_failure, 0).show();
						}
					});
				}
			}
		}).start();
	}

当加入黑名单的时候,先启动一个进度条,开启一个线程调用SDK方法将联系人加到黑名单,并在主线程中显示结果。

	/**
	 * 覆盖手机返回键
	 */
	@Override
	public void onBackPressed() {
		if (more.getVisibility() == View.VISIBLE) {
			more.setVisibility(View.GONE);
			iv_emoticons_normal.setVisibility(View.VISIBLE);
			iv_emoticons_checked.setVisibility(View.INVISIBLE);
		} else {
			super.onBackPressed();
		}
	}

当按下手机返回建的时候,关闭图标。

/**
     * listview滑动监听listener
     *
     */
    private class ListScrollListener implements OnScrollListener {

        @Override
        public void onScrollStateChanged(AbsListView view, int scrollState) {
            switch (scrollState) {
            case OnScrollListener.SCROLL_STATE_IDLE:
                //当第一项显示在屏幕上,并且没有再继续加载
                if (view.getFirstVisiblePosition() == 0 && !isloading && haveMoreData) {
                    isloading = true;
                    loadmorePB.setVisibility(View.VISIBLE);
                    // sdk初始化加载的聊天记录为20条,到顶时去db里获取更多
                    List<EMMessage> messages;
                    EMMessage firstMsg = conversation.getAllMessages().get(0);
                    try {
                        // 获取更多messges,调用此方法的时候从db获取的messages
                        // sdk会自动存入到此conversation中
                        if (chatType == CHATTYPE_SINGLE)
                            messages = conversation.loadMoreMsgFromDB(firstMsg.getMsgId(), pagesize);
                        else
                            messages = conversation.loadMoreGroupMsgFromDB(firstMsg.getMsgId(), pagesize);
                    } catch (Exception e1) {
                        loadmorePB.setVisibility(View.GONE);
                        return;
                    }
                    try {
                        Thread.sleep(300);
                    } catch (InterruptedException e) {
                    }
                    if (messages.size() != 0) {
                        // 刷新ui
                        if (messages.size() > 0) {
                            adapter.refreshSeekTo(messages.size() - 1);
                        }
                        if (messages.size() != pagesize)
                            haveMoreData = false;
                    } else {
                        haveMoreData = false;
                    }
                    loadmorePB.setVisibility(View.GONE);
                    isloading = false;
                }
                break;
            }
        }
        @Override
        public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {

        }
    }

其中还有一个比较重要的监听,就是对屏幕滚动的处理。其中只处理了一个状态,停止滚动。然后处理加载更多的消息数,完成数据集的改变后刷新界面。

	@Override
	protected void onNewIntent(Intent intent) {
		// 点击notification bar进入聊天页面,保证只有一个聊天页面
		String username = intent.getStringExtra("userId");
		if (toChatUsername.equals(username))
			super.onNewIntent(intent);
		else {
			finish();
			startActivity(intent);
		}
	}

当有通知来到时候,如果没有跟这个用户聊天,则结束存在的连天界面,中心开启一个。确保只有一个聊天页面。

最后,还有一个聊天界面的UI模式,通过ListView来显示消息,由于内容比较多。所以下一章再将啦。

时间: 2024-10-14 07:42:07

环信UI开源Demo情景分析十一、聊天界面(三)的相关文章

环信UI开源Demo情景分析十二、聊天界面(四)

在这一章咱们来分析一下聊天界面中消息的显示,MessageAdapter. public MessageAdapter(Context context, String username, int chatType) { this.username = username; this.context = context; inflater = LayoutInflater.from(context); activity = (Activity) context; this.conversation

环信UI开源Demo情景分析七、会话界面

在会话界面中,主要是对会话记录的操作.就跟QQ上面的一样,最左边的一个Tab.管理会话历史,并动态显示消息数量. 因为整个会话界面是由Fragment所组成,所以没有清单文件.接下来咱们先来看看布局文件的构成. <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

UI基础之UITableView案例QQ聊天界面

数据模型: #import <Foundation/Foundation.h> typedef enum{ LLMessageTypeMe, LLMessageTypeOther }LLMessageType; @interface LLMessage : NSObject /** * time */ @property (nonatomic, copy) NSString *time; /** * text */ @property (nonatomic, copy) NSString *t

Android 即时音视频解决方案1——环信

需求 即时音视频通话 解决方案 环信,官方地址http://www.easemob.com/ SDK下载 http://downloads.easemob.com/downloads/easemob-sdk-2.2.2.zip SDK集成 解压下载的文件,将libs下的easemobchat_2.2.2.jar拷到Android Studio项目中的libs中,并在main目录下新建jniLibs目录,将so文件拷到其中.如图 代码抽取 我们只需要即时音视频的功能,因此环信提供的Demo中有多余

iOS环信视频聊天

这是我自己利用环信写的一个单纯的视频聊天功能demo 首先需要去环信官网申请一个appkey,并将sdk集成到项目中 然后加入类库 APPDelegate.m // // AppDelegate.m // VideoChat // // Created by 小灰灰的pro on 16/8/31. // Copyright © 2016年 小灰灰. All rights reserved. // #import "AppDelegate.h" #import "EMSDK.h

环信开源计划开启即时通讯云开源平台时代

12月22日,在"首届移动社交创新价值峰会"上,环信即时通讯云(http://www.easemob.com)发布了被称为"4X100计划"的<环信开源平台计划>,此计划将推动即时通讯云行业进入开源平台时代.而一个中国IT界崭新的开放共赢的生态体系也将随之逐步建立起来. 图注:环信CEO刘俊彦在峰会上解读环信开源平台计划 "2014年,即时通讯云获得了很好的发展,环信也帮助了很多合作伙伴实现了移动社交的创新.那么2015年,如何驱动移动社交创新

环信Demo 导入错误

今天想导入环信的Demo 去看一看环信学习一下 谁知道导入出现这么个问题 Error:(1, 0) Minimum supported Gradle version is 3.3. Current version is 2.14.1. If using the gradle wrapper, try editing the distributionUrl in H:\Git-Work\PointOfCare\gradle\wrapper\gradle-wrapper.properties to

环信Android客户端集成文档

一.Android SDK简介 环信SDK为用户开发IM相关的应用提供的一套完善的开发框架. 包括以下几个部分: SDK_Core为核心的消息同步协议实现,完成与服务器之间的信息交换. SDK是基于核心协议实现的完整的IM功能,实现了不同类型消息的收发.会话管理.群组.好友.聊天室等功能. EaseUI是一组IM相关的UI控件,旨在帮助开发者快速集成环信SDK. SDK采用模块化设计,每一模块的功能相对独立和完善,用户可以根据自己的需求选择使用下面的模块: EMClient: SDK的入口,主要

iOS 环信集成问题(连文档都不说明的坑。。)

首先,关于环信SDK的下载和一些依赖库的添加,在此我就不做详细介绍,(http://www.easemob.com/download/im)附上环信官网文档,可以看一下,上面都可以下载,也有相关配置介绍. 今天主要说一下,环信集成遇到的各种坑,各种问题,有的连文档都不说明的坑..(主要是讲解完全集成环信,UI的聊天界面,单聊功能也是环信的这种情况) 各位可能刚在官网下载下来ChatDemo-UI3.0这个版本,会发现HyphenateFullSDK和官网文档有个不一样的地方,少了个文件(libH