Android 融云SDK 集成
16lz
2021-01-23
说到集成sdk 一定是跳官方链接看的,
融云android文档
不过我想直接看demo了。
融云android官方Demo ,上篇博文有说。
demo 里面的东西,一大堆,其他全部 module
package cn.rongcloud.im;import android.app.ActivityManager;import android.content.Context;import android.content.Intent;import android.content.SharedPreferences;import android.net.Uri;import android.support.multidex.MultiDexApplication;import android.text.TextUtils;import android.view.View;import com.facebook.stetho.Stetho;import com.facebook.stetho.dumpapp.DumperPlugin;import com.facebook.stetho.inspector.database.DefaultDatabaseConnectionProvider;import com.facebook.stetho.inspector.protocol.ChromeDevtoolsDomain;import java.util.ArrayList;import java.util.List;import cn.rongcloud.contactcard.ContactCardExtensionModule;import cn.rongcloud.contactcard.IContactCardClickListener;import cn.rongcloud.contactcard.IContactCardInfoProvider;import cn.rongcloud.contactcard.message.ContactMessage;import cn.rongcloud.im.db.Friend;import cn.rongcloud.im.message.TestMessage;import cn.rongcloud.im.message.provider.ContactNotificationMessageProvider;import cn.rongcloud.im.message.provider.TestMessageProvider;import cn.rongcloud.im.server.pinyin.CharacterParser;import cn.rongcloud.im.server.utils.NLog;import cn.rongcloud.im.server.utils.RongGenerate;import cn.rongcloud.im.stetho.RongDatabaseDriver;import cn.rongcloud.im.stetho.RongDatabaseFilesProvider;import cn.rongcloud.im.stetho.RongDbFilesDumperPlugin;import cn.rongcloud.im.ui.activity.UserDetailActivity;import cn.rongcloud.im.utils.SharedPreferencesContext;import io.rong.imageloader.core.DisplayImageOptions;import io.rong.imageloader.core.display.FadeInBitmapDisplayer;import io.rong.imkit.RongExtensionManager;import io.rong.imkit.RongIM;import io.rong.imkit.widget.provider.RealTimeLocationMessageProvider;import io.rong.imlib.ipc.RongExceptionHandler;import io.rong.imlib.model.UserInfo;import io.rong.push.RongPushClient;import io.rong.push.common.RongException;import io.rong.recognizer.RecognizeExtensionModule;public class App extends MultiDexApplication { private static DisplayImageOptions options; @Override public void onCreate() { super.onCreate(); Stetho.initialize(new Stetho.Initializer(this) { @Override protected Iterable getDumperPlugins() { return new Stetho.DefaultDumperPluginsBuilder(App.this) .provide(new RongDbFilesDumperPlugin(App.this, new RongDatabaseFilesProvider(App.this))) .finish(); } @Override protected Iterable getInspectorModules() { Stetho.DefaultInspectorModulesBuilder defaultInspectorModulesBuilder = new Stetho.DefaultInspectorModulesBuilder(App.this); defaultInspectorModulesBuilder.provideDatabaseDriver(new RongDatabaseDriver(App.this, new RongDatabaseFilesProvider(App.this), new DefaultDatabaseConnectionProvider())); return defaultInspectorModulesBuilder.finish(); } }); if (getApplicationInfo().packageName.equals(getCurProcessName(getApplicationContext()))) {// LeakCanary.install(this);//内存泄露检测 RongPushClient.registerHWPush(this); RongPushClient.registerMiPush(this, "2882303761517473625", "5451747338625"); try { RongPushClient.registerFCM(this); } catch (RongException e) { e.printStackTrace(); } /** * 注意: * * IMKit SDK调用第一步 初始化 * * context上下文 * * 只有两个进程需要初始化,主进程和 push 进程 */ RongIM.setServerInfo("nav.cn.ronghub.com", "up.qbox.me"); RongIM.init(this); NLog.setDebug(true);//Seal Module Log 开关 SealAppContext.init(this); SharedPreferencesContext.init(this); Thread.setDefaultUncaughtExceptionHandler(new RongExceptionHandler(this)); try { RongIM.registerMessageTemplate(new ContactNotificationMessageProvider()); RongIM.registerMessageTemplate(new RealTimeLocationMessageProvider()); RongIM.registerMessageType(TestMessage.class); RongIM.registerMessageTemplate(new TestMessageProvider()); } catch (Exception e) { e.printStackTrace(); } openSealDBIfHasCachedToken(); options = new DisplayImageOptions.Builder() .showImageForEmptyUri(cn.rongcloud.im.R.drawable.de_default_portrait) .showImageOnFail(cn.rongcloud.im.R.drawable.de_default_portrait) .showImageOnLoading(cn.rongcloud.im.R.drawable.de_default_portrait) .displayer(new FadeInBitmapDisplayer(300)) .cacheInMemory(true) .cacheOnDisk(true) .build(); //RongExtensionManager.getInstance().registerExtensionModule(new PTTExtensionModule(this, true, 1000 * 60)); RongExtensionManager.getInstance().registerExtensionModule(new ContactCardExtensionModule(new IContactCardInfoProvider() { @Override public void getContactAllInfoProvider(final IContactCardInfoCallback contactInfoCallback) { SealUserInfoManager.getInstance().getFriends(new SealUserInfoManager.ResultCallback>() { @Override public void onSuccess(List friendList) { contactInfoCallback.getContactCardInfoCallback(friendList); } @Override public void onError(String errString) { contactInfoCallback.getContactCardInfoCallback(null); } }); } @Override public void getContactAppointedInfoProvider(String userId, String name, String portrait, final IContactCardInfoCallback contactInfoCallback) { SealUserInfoManager.getInstance().getFriendByID(userId, new SealUserInfoManager.ResultCallback() { @Override public void onSuccess(Friend friend) { List list = new ArrayList<>(); list.add(friend); contactInfoCallback.getContactCardInfoCallback(list); } @Override public void onError(String errString) { contactInfoCallback.getContactCardInfoCallback(null); } }); } }, new IContactCardClickListener() { @Override public void onContactCardClick(View view, ContactMessage content) { Intent intent = new Intent(view.getContext(), UserDetailActivity.class); Friend friend = SealUserInfoManager.getInstance().getFriendByID(content.getId()); if (friend == null) { UserInfo userInfo = new UserInfo(content.getId(), content.getName(), Uri.parse(TextUtils.isEmpty(content.getImgUrl()) ? RongGenerate.generateDefaultAvatar(content.getName(), content.getId()) : content.getImgUrl())); friend = CharacterParser.getInstance().generateFriendFromUserInfo(userInfo); } intent.putExtra("friend", friend); view.getContext().startActivity(intent); } })); RongExtensionManager.getInstance().registerExtensionModule(new RecognizeExtensionModule()); } } public static DisplayImageOptions getOptions() { return options; } private void openSealDBIfHasCachedToken() { SharedPreferences sp = getSharedPreferences("config", MODE_PRIVATE); String cachedToken = sp.getString("loginToken", ""); if (!TextUtils.isEmpty(cachedToken)) { String current = getCurProcessName(this); String mainProcessName = getPackageName(); if (mainProcessName.equals(current)) { SealUserInfoManager.getInstance().openDB(); } } } public static String getCurProcessName(Context context) { int pid = android.os.Process.myPid(); ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); for (ActivityManager.RunningAppProcessInfo appProcess : activityManager.getRunningAppProcesses()) { if (appProcess.pid == pid) { return appProcess.processName; } } return null; }}
这里初始化的东西比较多,开始只要知道需要初始化 融云那个就可以了。
package cn.rongcloud.im.ui.activity;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.content.IntentFilter;import android.content.SharedPreferences;import android.graphics.Color;import android.net.Uri;import android.os.Bundle;import android.support.v4.app.Fragment;import android.support.v4.app.FragmentActivity;import android.support.v4.app.FragmentPagerAdapter;import android.support.v4.view.ViewPager;import android.text.TextUtils;import android.view.KeyEvent;import android.view.MotionEvent;import android.view.View;import android.view.inputmethod.InputMethodManager;import android.widget.ImageView;import android.widget.RelativeLayout;import android.widget.TextView;import java.util.ArrayList;import java.util.List;import cn.rongcloud.im.R;import cn.rongcloud.im.server.HomeWatcherReceiver;import cn.rongcloud.im.server.broadcast.BroadcastManager;import cn.rongcloud.im.server.utils.NToast;import cn.rongcloud.im.server.widget.LoadDialog;import cn.rongcloud.im.ui.adapter.ConversationListAdapterEx;import cn.rongcloud.im.ui.fragment.ContactsFragment;import cn.rongcloud.im.ui.fragment.DiscoverFragment;import cn.rongcloud.im.ui.fragment.MineFragment;import cn.rongcloud.im.ui.widget.DragPointView;import cn.rongcloud.im.ui.widget.MorePopWindow;import io.rong.common.RLog;import io.rong.imkit.RongContext;import io.rong.imkit.RongIM;import io.rong.imkit.fragment.ConversationListFragment;import io.rong.imkit.manager.IUnReadMessageObserver;import io.rong.imlib.RongIMClient;import io.rong.imlib.model.Conversation;import io.rong.message.ContactNotificationMessage;//import io.rong.toolkit.TestActivity;@SuppressWarnings("deprecation")public class MainActivity extends FragmentActivity implements ViewPager.OnPageChangeListener, View.OnClickListener, DragPointView.OnDragListencer, IUnReadMessageObserver { public static ViewPager mViewPager; private ListmFragment = new ArrayList<>(); private ImageView moreImage, mImageChats, mImageContact, mImageFind, mImageMe, mMineRed; private TextView mTextChats, mTextContact, mTextFind, mTextMe; private DragPointView mUnreadNumView; private ImageView mSearchImageView; /** * 会话列表的fragment */ private ConversationListFragment mConversationListFragment = null; private boolean isDebug; private Context mContext; private Conversation.ConversationType[] mConversationsTypes = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mContext = this; isDebug = getSharedPreferences("config", MODE_PRIVATE).getBoolean("isDebug", false); initViews(); changeTextViewColor(); changeSelectedTabState(0); initMainViewPager(); registerHomeKeyReceiver(this); } private void initViews() { RelativeLayout chatRLayout = (RelativeLayout) findViewById(R.id.seal_chat); RelativeLayout contactRLayout = (RelativeLayout) findViewById(R.id.seal_contact_list); RelativeLayout foundRLayout = (RelativeLayout) findViewById(R.id.seal_find); RelativeLayout mineRLayout = (RelativeLayout) findViewById(R.id.seal_me); mImageChats = (ImageView) findViewById(R.id.tab_img_chats); mImageContact = (ImageView) findViewById(R.id.tab_img_contact); mImageFind = (ImageView) findViewById(R.id.tab_img_find); mImageMe = (ImageView) findViewById(R.id.tab_img_me); mTextChats = (TextView) findViewById(R.id.tab_text_chats); mTextContact = (TextView) findViewById(R.id.tab_text_contact); mTextFind = (TextView) findViewById(R.id.tab_text_find); mTextMe = (TextView) findViewById(R.id.tab_text_me); mMineRed = (ImageView) findViewById(R.id.mine_red); moreImage = (ImageView) findViewById(R.id.seal_more); mSearchImageView = (ImageView) findViewById(R.id.ac_iv_search); chatRLayout.setOnClickListener(this); contactRLayout.setOnClickListener(this); foundRLayout.setOnClickListener(this); mineRLayout.setOnClickListener(this); moreImage.setOnClickListener(this); mSearchImageView.setOnClickListener(this); BroadcastManager.getInstance(mContext).addAction(MineFragment.SHOW_RED, new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { mMineRed.setVisibility(View.VISIBLE); } }); } private void initMainViewPager() { Fragment conversationList = initConversationList(); mViewPager = (ViewPager) findViewById(R.id.main_viewpager); mUnreadNumView = (DragPointView) findViewById(R.id.seal_num); mUnreadNumView.setOnClickListener(this); mUnreadNumView.setDragListencer(this); mFragment.add(conversationList); mFragment.add(new ContactsFragment()); mFragment.add(new DiscoverFragment()); mFragment.add(new MineFragment()); FragmentPagerAdapter fragmentPagerAdapter = new FragmentPagerAdapter(getSupportFragmentManager()) { @Override public Fragment getItem(int position) { return mFragment.get(position); } @Override public int getCount() { return mFragment.size(); } }; mViewPager.setAdapter(fragmentPagerAdapter); mViewPager.setOffscreenPageLimit(4); mViewPager.setOnPageChangeListener(this); initData(); } private Fragment initConversationList() { if (mConversationListFragment == null) { ConversationListFragment listFragment = new ConversationListFragment(); listFragment.setAdapter(new ConversationListAdapterEx(RongContext.getInstance())); Uri uri; if (isDebug) { uri = Uri.parse("rong://" + getApplicationInfo().packageName).buildUpon() .appendPath("conversationlist") .appendQueryParameter(Conversation.ConversationType.PRIVATE.getName(), "true") //设置私聊会话是否聚合显示 .appendQueryParameter(Conversation.ConversationType.GROUP.getName(), "true")//群组 .appendQueryParameter(Conversation.ConversationType.PUBLIC_SERVICE.getName(), "false")//公共服务号 .appendQueryParameter(Conversation.ConversationType.APP_PUBLIC_SERVICE.getName(), "false")//订阅号 .appendQueryParameter(Conversation.ConversationType.SYSTEM.getName(), "true")//系统 .appendQueryParameter(Conversation.ConversationType.DISCUSSION.getName(), "true") .build(); mConversationsTypes = new Conversation.ConversationType[]{Conversation.ConversationType.PRIVATE, Conversation.ConversationType.GROUP, Conversation.ConversationType.PUBLIC_SERVICE, Conversation.ConversationType.APP_PUBLIC_SERVICE, Conversation.ConversationType.SYSTEM, Conversation.ConversationType.DISCUSSION }; } else { uri = Uri.parse("rong://" + getApplicationInfo().packageName).buildUpon() .appendPath("conversationlist") .appendQueryParameter(Conversation.ConversationType.PRIVATE.getName(), "false") //设置私聊会话是否聚合显示 .appendQueryParameter(Conversation.ConversationType.GROUP.getName(), "false")//群组 .appendQueryParameter(Conversation.ConversationType.PUBLIC_SERVICE.getName(), "false")//公共服务号 .appendQueryParameter(Conversation.ConversationType.APP_PUBLIC_SERVICE.getName(), "false")//订阅号 .appendQueryParameter(Conversation.ConversationType.SYSTEM.getName(), "true")//系统 .build(); mConversationsTypes = new Conversation.ConversationType[]{Conversation.ConversationType.PRIVATE, Conversation.ConversationType.GROUP, Conversation.ConversationType.PUBLIC_SERVICE, Conversation.ConversationType.APP_PUBLIC_SERVICE, Conversation.ConversationType.SYSTEM }; } listFragment.setUri(uri); mConversationListFragment = listFragment; return listFragment; } else { return mConversationListFragment; } } @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { changeTextViewColor(); changeSelectedTabState(position); } private void changeTextViewColor() { mImageChats.setBackgroundDrawable(getResources().getDrawable(R.drawable.tab_chat)); mImageContact.setBackgroundDrawable(getResources().getDrawable(R.drawable.tab_contacts)); mImageFind.setBackgroundDrawable(getResources().getDrawable(R.drawable.tab_found)); mImageMe.setBackgroundDrawable(getResources().getDrawable(R.drawable.tab_me)); mTextChats.setTextColor(Color.parseColor("#abadbb")); mTextContact.setTextColor(Color.parseColor("#abadbb")); mTextFind.setTextColor(Color.parseColor("#abadbb")); mTextMe.setTextColor(Color.parseColor("#abadbb")); } private void changeSelectedTabState(int position) { switch (position) { case 0: mTextChats.setTextColor(Color.parseColor("#0099ff")); mImageChats.setBackgroundDrawable(getResources().getDrawable(R.drawable.tab_chat_hover)); break; case 1: mTextContact.setTextColor(Color.parseColor("#0099ff")); mImageContact.setBackgroundDrawable(getResources().getDrawable(R.drawable.tab_contacts_hover)); break; case 2: mTextFind.setTextColor(Color.parseColor("#0099ff")); mImageFind.setBackgroundDrawable(getResources().getDrawable(R.drawable.tab_found_hover)); break; case 3: mTextMe.setTextColor(Color.parseColor("#0099ff")); mImageMe.setBackgroundDrawable(getResources().getDrawable(R.drawable.tab_me_hover)); break; } } @Override public void onPageScrollStateChanged(int state) { } long firstClick = 0; long secondClick = 0; @Override public void onClick(View v) { switch (v.getId()) { case R.id.seal_chat: if (mViewPager.getCurrentItem() == 0) { if (firstClick == 0) { firstClick = System.currentTimeMillis(); } else { secondClick = System.currentTimeMillis(); } RLog.i("MainActivity", "time = " + (secondClick - firstClick)); if (secondClick - firstClick > 0 && secondClick - firstClick <= 800) { mConversationListFragment.focusUnreadItem(); firstClick = 0; secondClick = 0; } else if (firstClick != 0 && secondClick != 0) { firstClick = 0; secondClick = 0; } } mViewPager.setCurrentItem(0, false); break; case R.id.seal_contact_list: mViewPager.setCurrentItem(1, false); break; case R.id.seal_find: mViewPager.setCurrentItem(2, false); break; case R.id.seal_me: mViewPager.setCurrentItem(3, false); mMineRed.setVisibility(View.GONE); break; case R.id.seal_more: MorePopWindow morePopWindow = new MorePopWindow(MainActivity.this); morePopWindow.showPopupWindow(moreImage); break; case R.id.ac_iv_search: startActivity(new Intent(MainActivity.this, SealSearchActivity.class)); break; } } @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); if (intent.getBooleanExtra("systemconversation", false)) { mViewPager.setCurrentItem(0, false); } } protected void initData() { final Conversation.ConversationType[] conversationTypes = { Conversation.ConversationType.PRIVATE, Conversation.ConversationType.GROUP, Conversation.ConversationType.SYSTEM, Conversation.ConversationType.PUBLIC_SERVICE, Conversation.ConversationType.APP_PUBLIC_SERVICE }; RongIM.getInstance().addUnReadMessageCountChangedObserver(this, conversationTypes); getConversationPush();// 获取 push 的 id 和 target getPushMessage(); } private void getConversationPush() { if (getIntent() != null && getIntent().hasExtra("PUSH_CONVERSATIONTYPE") && getIntent().hasExtra("PUSH_TARGETID")) { final String conversationType = getIntent().getStringExtra("PUSH_CONVERSATIONTYPE"); final String targetId = getIntent().getStringExtra("PUSH_TARGETID"); RongIM.getInstance().getConversation(Conversation.ConversationType.valueOf(conversationType), targetId, new RongIMClient.ResultCallback () { @Override public void onSuccess(Conversation conversation) { if (conversation != null) { if (conversation.getLatestMessage() instanceof ContactNotificationMessage) { //好友消息的push startActivity(new Intent(MainActivity.this, NewFriendListActivity.class)); } else { Uri uri = Uri.parse("rong://" + getApplicationInfo().packageName).buildUpon().appendPath("conversation") .appendPath(conversationType).appendQueryParameter("targetId", targetId).build(); Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(uri); startActivity(intent); } } } @Override public void onError(RongIMClient.ErrorCode e) { } }); } } /** * 得到不落地 push 消息 */ private void getPushMessage() { Intent intent = getIntent(); if (intent != null && intent.getData() != null && intent.getData().getScheme().equals("rong")) { String path = intent.getData().getPath(); if (path.contains("push_message")) { SharedPreferences sharedPreferences = getSharedPreferences("config", MODE_PRIVATE); String cacheToken = sharedPreferences.getString("loginToken", ""); if (TextUtils.isEmpty(cacheToken)) { startActivity(new Intent(MainActivity.this, LoginActivity.class)); } else { if (!RongIM.getInstance().getCurrentConnectionStatus().equals(RongIMClient.ConnectionStatusListener.ConnectionStatus.CONNECTED)) { LoadDialog.show(mContext); RongIM.connect(cacheToken, new RongIMClient.ConnectCallback() { @Override public void onTokenIncorrect() { LoadDialog.dismiss(mContext); } @Override public void onSuccess(String s) { LoadDialog.dismiss(mContext); } @Override public void onError(RongIMClient.ErrorCode e) { LoadDialog.dismiss(mContext); } }); } } } } } @Override public void onCountChanged(int count) { if (count == 0) { mUnreadNumView.setVisibility(View.GONE); } else if (count > 0 && count < 100) { mUnreadNumView.setVisibility(View.VISIBLE); mUnreadNumView.setText(String.valueOf(count)); } else { mUnreadNumView.setVisibility(View.VISIBLE); mUnreadNumView.setText(R.string.no_read_message); } } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { moveTaskToBack(false); return true; } return super.onKeyDown(keyCode, event); } private void hintKbTwo() { InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); if (imm.isActive() && getCurrentFocus() != null) { if (getCurrentFocus().getWindowToken() != null) { imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); } } } @Override public boolean onTouchEvent(MotionEvent event) { if (null != this.getCurrentFocus() && event.getAction() == MotionEvent.ACTION_UP) { InputMethodManager mInputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE); return mInputMethodManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), 0); } return super.onTouchEvent(event); } @Override protected void onDestroy() { RongIM.getInstance().removeUnReadMessageCountChangedObserver(this); if (mHomeKeyReceiver != null) this.unregisterReceiver(mHomeKeyReceiver); super.onDestroy(); } @Override public void onDragOut() { mUnreadNumView.setVisibility(View.GONE); NToast.shortToast(mContext, getString(R.string.clear_success)); RongIM.getInstance().getConversationList(new RongIMClient.ResultCallback >() { @Override public void onSuccess(List
conversations) { if (conversations != null && conversations.size() > 0) { for (Conversation c : conversations) { RongIM.getInstance().clearMessagesUnreadStatus(c.getConversationType(), c.getTargetId(), null); } } } @Override public void onError(RongIMClient.ErrorCode e) { } }, mConversationsTypes); } private HomeWatcherReceiver mHomeKeyReceiver = null; //如果遇见 Android 7.0 系统切换到后台回来无效的情况 把下面注册广播相关代码注释或者删除即可解决。下面广播重写 home 键是为了解决三星 note3 按 home 键花屏的一个问题 private void registerHomeKeyReceiver(Context context) { if (mHomeKeyReceiver == null) { mHomeKeyReceiver = new HomeWatcherReceiver(); final IntentFilter homeFilter = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); try { context.registerReceiver(mHomeKeyReceiver, homeFilter); } catch (Exception e) { e.printStackTrace(); } } }}
viewpager 控件,加载了4个fragment。
分别对应,会话,通讯录,发现,我的。
全局有对广播的封装。
BroadcastManager.
/* ShengDao Android Client, BroadcastManager Copyright (c) 2015 ShengDao Tech Company Limited*/package cn.rongcloud.im.server.broadcast;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.content.IntentFilter;import java.util.HashMap;import java.util.Map;import cn.rongcloud.im.server.network.async.AsyncTaskManager;import cn.rongcloud.im.server.network.http.HttpException;import cn.rongcloud.im.server.utils.json.JsonMananger;/** * [A brief description] * * //在任何地方发送广播 * BroadcastManager.getInstance(mContext).sendBroadcast(FindOrderActivity.ACTION_RECEIVE_MESSAGE); * * //页面在oncreate中初始化广播 * BroadcastManager.getInstance(mContext).addAction(ACTION_RECEIVE_MESSAGE, new BroadcastReceiver(){ * * @author huxinwu * @version 1.0 * @Override public void onReceive(Context arg0, Intent intent) { * String command = intent.getAction(); * if(!TextUtils.isEmpty(command)){ * if((ACTION_RECEIVE_MESSAGE).equals(command)){ * //获取json结果 * String json = intent.getStringExtra("result"); * //做你该做的事情 * } * } * } * }); * * //页面在ondestory销毁广播 * BroadcastManager.getInstance(mContext).destroy(ACTION_RECEIVE_MESSAGE); * @date 2015-9-17 **/public class BroadcastManager { private Context mContext; private static BroadcastManager instance; private MapreceiverMap; /** * 构造方法 * * @param context */ private BroadcastManager(Context context) { this.mContext = context.getApplicationContext(); receiverMap = new HashMap (); } /** * [获取BroadcastManager实例,单例模式实现] * * @param context * @return */ public static BroadcastManager getInstance(Context context) { if (instance == null) { synchronized (AsyncTaskManager.class) { if (instance == null) { instance = new BroadcastManager(context); } } } return instance; } /** * 添加 * * @param */ public void addAction(String action, BroadcastReceiver receiver) { try { IntentFilter filter = new IntentFilter(); filter.addAction(action); mContext.registerReceiver(receiver, filter); receiverMap.put(action, receiver); } catch (Exception e) { e.printStackTrace(); } } /** * 发送广播 * * @param action 唯一码 */ public void sendBroadcast(String action) { sendBroadcast(action, ""); } /** * 发送广播 * * @param action 唯一码 * @param obj 参数 */ public void sendBroadcast(String action, Object obj) { try { Intent intent = new Intent(); intent.setAction(action); intent.putExtra("result", JsonMananger.beanToJson(obj)); mContext.sendBroadcast(intent); } catch (HttpException e) { e.printStackTrace(); } } /** * 发送参数为 String 的数据广播 * * @param action * @param s */ public void sendBroadcast(String action, String s) { Intent intent = new Intent(); intent.setAction(action); intent.putExtra("String", s); mContext.sendBroadcast(intent); } /** * 销毁广播 * * @param action */ public void destroy(String action) { if (receiverMap != null) { BroadcastReceiver receiver = receiverMap.remove(action); if (receiver != null) { mContext.unregisterReceiver(receiver); } } }}
private MapreceiverMap;
1 单例模式 。
2 desroty 时候移走。
用法就是 先调用 sendBroadcast ,然后处理。比较方便。
然后看第一个fragment
private Fragment initConversationList() { if (mConversationListFragment == null) { ConversationListFragment listFragment = new ConversationListFragment(); listFragment.setAdapter(new ConversationListAdapterEx(RongContext.getInstance())); Uri uri; if (isDebug) { uri = Uri.parse("rong://" + getApplicationInfo().packageName).buildUpon() .appendPath("conversationlist") .appendQueryParameter(Conversation.ConversationType.PRIVATE.getName(), "true") //设置私聊会话是否聚合显示 .appendQueryParameter(Conversation.ConversationType.GROUP.getName(), "true")//群组 .appendQueryParameter(Conversation.ConversationType.PUBLIC_SERVICE.getName(), "false")//公共服务号 .appendQueryParameter(Conversation.ConversationType.APP_PUBLIC_SERVICE.getName(), "false")//订阅号 .appendQueryParameter(Conversation.ConversationType.SYSTEM.getName(), "true")//系统 .appendQueryParameter(Conversation.ConversationType.DISCUSSION.getName(), "true") .build(); mConversationsTypes = new Conversation.ConversationType[]{Conversation.ConversationType.PRIVATE, Conversation.ConversationType.GROUP, Conversation.ConversationType.PUBLIC_SERVICE, Conversation.ConversationType.APP_PUBLIC_SERVICE, Conversation.ConversationType.SYSTEM, Conversation.ConversationType.DISCUSSION }; } else { uri = Uri.parse("rong://" + getApplicationInfo().packageName).buildUpon() .appendPath("conversationlist") .appendQueryParameter(Conversation.ConversationType.PRIVATE.getName(), "false") //设置私聊会话是否聚合显示 .appendQueryParameter(Conversation.ConversationType.GROUP.getName(), "false")//群组 .appendQueryParameter(Conversation.ConversationType.PUBLIC_SERVICE.getName(), "false")//公共服务号 .appendQueryParameter(Conversation.ConversationType.APP_PUBLIC_SERVICE.getName(), "false")//订阅号 .appendQueryParameter(Conversation.ConversationType.SYSTEM.getName(), "true")//系统 .build(); mConversationsTypes = new Conversation.ConversationType[]{Conversation.ConversationType.PRIVATE, Conversation.ConversationType.GROUP, Conversation.ConversationType.PUBLIC_SERVICE, Conversation.ConversationType.APP_PUBLIC_SERVICE, Conversation.ConversationType.SYSTEM }; } listFragment.setUri(uri); mConversationListFragment = listFragment; return listFragment; } else { return mConversationListFragment; }}
会话列表fragment ,有动态创建,和静态创建,静态创建就是用官方的那个
然Demo 里面的是自定义创建的。
会话 有几种不同类型:
true 就是 显示出来,false 就不显示。
这里的会话列表这个,一般用官方的就可以了。
接下来
这里有个未读消息监听,
对应这个东西。
实现这个方法。
目测就是显示小红点。
未读消息监听要移除监听。。。。。 destory 里面有个取消方法。
小红点 阅读了消息后,就是已读消息,调用方法。 MainActivity 基本就是这样了,。。。。。。。
更多相关文章
- Android消息处理系统
- Android有效解决加载大图片时内存溢出的问题
- Android 图片加载图片_OOM异常解决
- android实现服务器图片本地缓存
- 转 Android的消息处理机制
- Android SeekBar自定义使用图片和颜色显示
- RecyclerView item imageview 图片宽高自适应
- Android 微信分享,微信分享图片