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

冀望
2023-12-01

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

	@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来显示消息,由于内容比较多。所以下一章再将啦。



 类似资料: