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