乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      極光 IM 構建聊天功能

       看見就非常 2020-05-08

      前言

      距離上次極光征文不知不覺已經過了將近一年的時間,先感謝上次的征文比賽,通過 《我和 Android 推送的時間簡史》 這篇文章獲獎,這次又厚著臉皮再次參與,因為項目一直很忙,只得利用周末時間準備 demo 素材和寫文章,不好之處,多多見諒。

      上一篇文章主要講述了 我跟 極光推送 的關系,以及簡單的描述了其集成和使用,作為三個項目都在使用極光推送的我,對其了解也是相當多的,當然坑也踩了不少,不得不再次感謝大俠(極光技術人員)對我的幫助,雖然這一年沒有繼續(xù)接觸推送的業(yè)務,但是當我遇到困惑依然有問必答,服務態(tài)度不容置疑!

      在準備參加征文時就在想應該從哪個角度來寫呢,正好之前跟前同事一起寫了一個開源項目 WeaponApp, 現(xiàn)在已經有 800+ 的 star 了。

      里面涉及的技術我就不一一闡述了,感興趣的話可以自行看一下,里面有一個模塊由我單獨負責- IM模塊,因為已經集成了極光推送,考慮到成本和使用,最終選擇了極光IM,畢竟是以極光推送的大規(guī)模、高并發(fā)、穩(wěn)定的推送為技術基礎,并繼承這些特性。那這篇文章就以我集成的經歷和使用做個介紹,快速的實現(xiàn)具有 IM 功能的 APP。

      展示

      這里只對 IM 模塊功能做簡單的演示,感興趣可以點擊 鏈接 進行下載,如下 gif 圖:

      基本的聊天功能已經實現(xiàn),其中包括:

      1. 登錄、注冊、強踢和退登

      2. 個人信息查看和修改

      3. 查找好友并進行聊天

      4. 群聊

      5. 個人中心展示

      6. 刪除會話和清空聊天記錄

      后續(xù)會根據需要添加新的功能。

      集成

      因為前項已經集成了極光推送服務,很多東西已經不需要重復操作,只需要將 JMessage 相關的組件集成到項目中即可,詳情的步驟可直接參考官網。

      1. 導入jmessage jar 包2. 在 AndroidManifest 中添加相應的事件

      沒了。。由此可以看出,由推送到 IM 過渡是多么流暢!

      使用

      其實在使用的過程,無非是根據自己的業(yè)務需求,到 官網 查找 API 來實現(xiàn)自己想要的功能,那我就根據目前項目中有的功能進行介紹。

      注冊、登錄和退登

      這其實是用戶的信息管理,極光 IM 統(tǒng)一用 UserInfo 進行管理,內部包含了用戶的大部分信息:

      1. protected long userID;
      2. protected String userName;
      3. protected String nickname = "";
      4. protected String avatarMediaID;
      5. protected String birthday = "";
      6. protected String signature = "";
      7. protected String gender = "";
      8. protected String region = "";
      9. protected String address = "";
      10. protected String appkey = null;
      11. protected String notename = null;
      12. protected String noteText = null;
      13. protected int mTime;
      14. protected Map<String, String> extras = new ConcurrentHashMap();
      15. 復制代碼

      1. 注冊

      一開始打算自己寫用戶服務器,事實上卻是由另一位開發(fā)者完成了,但是考慮到 IM 的集成,用戶數(shù)據的遷移和轉存過程繁瑣,就干脆直接用極光的用戶接口,其實內部的數(shù)據也確實很詳細,還支持自定義字段,完全滿足日常需求。

      1. JMessageClient.register(userName, password, new JMessageCallBack() {
      2. @Override
      3. public void onSuccess() {
      4. registerSuccess(userName);
      5. }
      6. @Override
      7. public void onFailed(int status, String desc) {
      8. registerFailed(desc);
      9. }
      10. });
      11. 復制代碼

      注冊需要用戶名和密碼,注冊成功后通過 setResult 的方法,將賬戶和密碼傳回登錄頁面。

      2. 登錄

      1. JMessageClient.login(userName, password, new JMessageCallBack() {
      2. @Override
      3. public void onSuccess() {
      4. loginSuccess(userName);
      5. }
      6. @Override
      7. public void onFailed(int status, String desc) {
      8. loginFailed(desc);
      9. }
      10. });
      11. 復制代碼

      同注冊一樣,登錄也需要用戶名和密碼進行登錄,如果格式有誤會直接觸發(fā) onFailed 回調,彈出相應的提示。成功后本地便會保存一個 UserInfo 對象儲存用戶的信息。

      3. 退登

      極光支持主動退出賬號的功能,即:

      1. JMessageClient.logout();
      2. 復制代碼

      直接清除本地保存的用戶信息,同樣他支持多端同時在線:

      如果不打開開關,另一臺設備登錄,會用 EventBus 發(fā)送 LoginStateChangeEvent,告知開發(fā)者改賬號已在另一臺設備登錄,并且會攜帶三種狀態(tài):

      1. case user_password_change:
      2. forcedExit("賬號密碼被修改");
      3. break;
      4. case user_logout:
      5. forcedExit("賬號在另一臺設備登錄");
      6. break;
      7. case user_deleted:
      8. forcedExit("賬號被刪除");
      9. break;
      10. 復制代碼

      根據自己的需要進行處理。

      信息查看和修改

      1. 個人

      自己的用戶信息其實是保存在本地的數(shù)據庫中,通過調用:

      1. mUserInfo = JMessageClient.getMyInfo();
      2. 復制代碼

      獲取用戶信息,之前提過 UserInfo 里面包含了用戶的所有數(shù)據。與之對應的:

      1. JMessageClient.updateMyInfo(UserInfo.Field.gender, mUserInfo, new JMessageCallBack() {
      2. @Override
      3. public void onSuccess() {
      4. }
      5. @Override
      6. public void onFailed(int status, String desc) {
      7. }
      8. });
      9. 復制代碼

      這個就是修改自己信息的方法,通過傳入 UserInfo.Field 來區(qū)分修改屬性值。

      2. 他人

      如果需要查看好友的信息,可通過 userName 進行請求查詢:

      1. JMessageClient.getUserInfo(userName, new GetUserInfoCallback() {
      2. @Override
      3. public void gotResult(int status, String desc, UserInfo userInfo) {
      4. if (status == 0) {
      5. getViewModel().setUserInfo(userInfo);
      6. } else {
      7. getViewModel().setError(desc);
      8. }
      9. }
      10. });
      11. 復制代碼

      具體的結果如下:

      如果是個人信息,直接可以修改和退登,如果是他人只能查看并與其進行聊天。

      聊天

      終于到了核心的聊天功能,其實實現(xiàn)起來并不復雜,極光 IM 已經給了豐富的 API 和使用說明,足夠完成基本的需求。

      1. 發(fā)消息

      發(fā)消息,前提是需要構建 Message 對象,以基礎文本為例:

      1. final Message message = mConversation.createSendTextMessage(sendContent);
      2. message.setOnSendCompleteCallback(new BasicCallback() {
      3. @Override
      4. public void gotResult(int status, String desc) {
      5. if (status == 0) {
      6. // 消息發(fā)送成功
      7. MobclickAgent.onEvent(getContext().getApplicationContext(), "send_message", sendContent);
      8. addSendMessage(message);
      9. ++curCount;
      10. setSendContent("");
      11. getView().scrollToPosition(items.size() - 1);
      12. } else {
      13. // 消息發(fā)送失敗
      14. Toast.makeText(getContext(), desc, Toast.LENGTH_SHORT).show();
      15. }
      16. }
      17. });
      18. JMessageClient.sendMessage(message);
      19. 復制代碼

      最終通過 JmessageClient.sendMessage(message) 將消息發(fā)送出去。

      2. 接收消息

      他這里比較簡單粗暴,直接使用 EventBus 進行消息接收的回調。

      他 jar 里集成了 EventBus,項目中也有了 EventBus,這一點還是蠻坑的。換想一下,這里也是為了方便接收,不然會有很多相互應用,各種耦合,不過使用過 EventBus 的小伙伴,應該知道,如果維護不好 EventBus 會導致邏輯非常的混亂,維護和拓展異常困難。

      1. * 接收消息事件
      2. * 目前只支持文字消息,后面再進行優(yōu)化
      3. *
      4. * @param event 消息事件
      5. */
      6. public void onEventMainThread(MessageEvent event) {
      7. Message message = event.getMessage();
      8. switch (message.getContentType()) {
      9. case text:
      10. // 處理文字消息
      11. String userName = ((UserInfo) message.getTargetInfo()).getUserName();
      12. if (TextUtils.equals(userName, mUserName)) {
      13. // 當收到的消息是官方消息才進行更新UI
      14. getViewModel().receiveMessage(message);
      15. }
      16. default:
      17. LogUtils.i("office", message.getFromType());
      18. break;
      19. }
      20. }
      21. 復制代碼

      根據 contentType 區(qū)分消息實體的類型,并做相應的處理。 在需要接收消息的地方進行事件的注冊和取消注冊。

      1. JMessageClient.registerEventReceiver(this, 200);
      2. JMessageClient.unRegisterEventReceiver(this);
      3. 復制代碼

      3. 單聊

      這里引入一個 Conversation 概念,當你與他人聊天必然會建立會話,那會話的消息和聊天的對象都會存在這個會話中,那單聊則通過傳入 userName 進行聯(lián)系,由此可見 userName 的唯一性和重要性。

      因為剛進去需要獲取歷史信息,所以通過 conversion 獲取所有的消息,并展示在界面上。

      1. mConversation = Conversation.createSingleConversation(userName);
      2. JMessageClient.getUserInfo(userName, this);
      3. if (mConversation == null) {
      4. getView().finish();
      5. }
      6. // 獲取本地所有的消息
      7. msgCount = mConversation.getAllMessage().size();
      8. List<Message> messagesFromNewest = mConversation.getMessagesFromNewest(curCount, LIM_COUNT);
      9. curCount = messagesFromNewest.size();
      10. // 第一條消息是正序的,需要反轉一下
      11. Collections.reverse(messagesFromNewest);
      12. for (Message message : messagesFromNewest) {
      13. MessageDirect direct = message.getDirect();
      14. if (direct == MessageDirect.send) {
      15. addSendMessage(message);
      16. } else {
      17. addReceiverMessage(message);
      18. }
      19. }
      20. 復制代碼

      4. 群聊

      群聊與單聊有點類似,不過建立會話的前提參數(shù)不是 userName, 而是 groupId 群的唯一標識 ID。

      1. mConversation = Conversation.createGroupConversation(groupId);
      2. if (mConversation == null) {
      3. getView().finish();
      4. return;
      5. }
      6. List<Message> messagesFromNewest = mConversation.getMessagesFromNewest(curCount, LIM_COUNT);
      7. curCount = messagesFromNewest.size();
      8. Collections.reverse(messagesFromNewest);
      9. for (Message message : messagesFromNewest) {
      10. MessageDirect direct = message.getDirect();
      11. if (direct == MessageDirect.send) {
      12. addSendMessage(message);
      13. } else {
      14. addReceiverMessage(message);
      15. }
      16. }
      17. 復制代碼

      具體的代碼很相似,只是創(chuàng)建的過程不一樣,不再贅述。

      總結

      前段時間王欣、字節(jié)跳動等都推出社交軟件,不過在微信平臺被封殺,這點還是蠻狠的,不過另一方面反映出社交 聊天在各個行業(yè)應用的廣泛,無論是金融、教育、銷售等軟件都需要一個 IM 作為用戶與用戶、用戶和平臺之間的溝通橋梁,因此作為開發(fā)者,還是要多多學習一下 IM 相關的知識。當然自己能獨立完成最好,如果沒有經歷或者暫時能力不夠,又或者公司急切需要集成 IM 功能,建議你可以考慮極光 IM 服務,其推送服務做得還是蠻不錯的,而且還在不斷的維護迭代中,有時間不妨嘗試一波吧!

      WeaponAppAPK下載

      本文為極光征文參賽文章

        本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內容,請點擊一鍵舉報。
        轉藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多