在App的oncreate方法中
//必須首先執行這部分代碼, 如果在":TCMSSevice"進程中,無需進行雲旺(OpenIM)和app業務的初始化,以節省內存;
SysUtil.setApplication(this);
if(SysUtil.isTCMSServiceProcess(this)){
return;
}
//第一個參數是Application Context
//這裏的APP_KEY即應用創建時申請的APP_KEY,同時初始化必須是在主進程中
if(SysUtil.isMainProcess()){
YWAPI.init(this, YWIMKit_APP_KEY);
}
//雲旺自定義類初始化
CustomSampleHelper.initCustom();
雲旺進程初始化完畢後,就要初始化雲旺的SDK對象了,因爲我們涉及到頁面的所有內容都是雲旺的SDK對象來操作的,並且每個用戶對應唯一的SDK對象,更換用戶就要重新獲取,
這個SDK對象可以建一個幫助類去維護,
// openIM UI解決方案提供的相關API,創建成功後,保存爲全局變量使用
private YWIMKit mIMKit;
public YWIMKit getIMKit() {
return mIMKit;
}
public void setIMKit(YWIMKit imkit) {
mIMKit = imkit;
}
public void initIMKit(String userId, String appKey) {
//初始化SDK對象
mIMKit = YWAPI.getIMKitInstance(userId, appKey);
addPushMessageListener();
}
所以在我們項目中做登錄的時候我們就要根據用戶來進行初始化了,並且要進行雲旺的登錄操作
String uid = GlobalInfo.getInstance(LoginActivity.this).getUid();
if (!TextUtils.isEmpty(GlobalInfo.getInstance(LoginActivity.this).getUid())){
//登錄成功後SDK對象重新初始化
LoginHelper.getsInstance().initIMKit(uid,App.YWIMKit_APP_KEY);
LoginHelper.getsInstance().login_im(uid, GlobalInfo.getInstance(LoginActivity.this).getImPassword(), new IWxCallback() {
@Override
public void onSuccess(Object... objects) {
Toast.makeText(LoginActivity.this, "Success", Toast.LENGTH_SHORT).show();
}
@Override
public void onError(int i, String s) {
}
@Override
public void onProgress(int i) {
}
});
}
雲旺登錄後界面的展示,這裏只涉及最近聯繫人界面和用戶之間的單聊界面
在這裏是在單獨的Activity頁面中將聊天列表已fragment的方式進行嵌套進來,核心代碼如下
private void initView() {
FragmentTransaction fragmentTransaction = getSupportFragmentManager()
.beginTransaction();
if (LoginHelper.getsInstance().getIMKit()!=null){
mIMKit = LoginHelper.getsInstance().getIMKit();
mConversationService = mIMKit.getConversationService();
conversationListFragment = mIMKit.getConversationFragment();
}
fragmentTransaction.add(R.id.fragment, conversationListFragment,
"conversationListFragment");
fragmentTransaction.commit();
}
這樣我們最近聯繫人列表就出來了
單聊的話就比較簡單了,拿到對方的id就可以了
Intent intent = LoginHelper.getsInstance().getIMKit().getChattingActivityIntent(userid);
startActivity(intent);
接下來就是一些重要的監聽
未讀消息的監聽,在MainActivity中,
實現的接口的分別是IYWConversationUnreadChangeListener,IYWConnectionListener,後一個是連接狀態的監聽
private void initListener() {
mConversationService.addTotalUnreadChangeListener(this);
mIMKit.getIMCore().addConnectionListener(this);
}
@Override
public void onUnreadChange() {
mHandler.post(new Runnable() {
@Override
public void run() {
//獲取當前登錄用戶的所有未讀數
int unReadCount = mConversationService.getAllUnreadCount();
//設置桌面角標的未讀數
mIMKit.setShortcutBadger(unReadCount);
// sendBadgeNumber(unReadCount);
if (unReadCount > 0) {
messageCountTv.setVisibility(View.VISIBLE);
if (unReadCount < 100) {
messageCountTv.setText(unReadCount + "");
} else {
messageCountTv.setText("99+");
}
} else {
messageCountTv.setVisibility(View.GONE);
}
}
});
}
對於連接狀態的監聽,實現方法如下
@Override
public void onDisconnect(int i, String s) {
if (i == YWLoginCode.LOGON_FAIL_KICKOFF) {
//在其它終端登錄,當前用戶被踢下線,
final AlertDialogUtil adl = new AlertDialogUtil(this,false,null);
adl.setPositiveClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
adl.dismiss();
App.getInstance().logout();
//登出雲旺
LoginHelper.getsInstance().loginOut(new IWxCallback() {
@Override
public void onSuccess(Object... objects) {
Toast.makeText(MainActivity.this, "Exist Success", Toast.LENGTH_SHORT).show();
}
@Override
public void onError(int i, String s) {
Toast.makeText(MainActivity.this, "Exist Error", Toast.LENGTH_SHORT).show();
}
@Override
public void onProgress(int i) {
Toast.makeText(MainActivity.this, "Existing", Toast.LENGTH_SHORT).show();
}
});
Intent i = getBaseContext().getPackageManager().getLaunchIntentForPackage(getBaseContext().getPackageName());
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(i);
finish();
}
});
//作爲系統彈出框 可覆蓋在任意界面
adl.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
adl.show();
}else {
//不是在其他端登錄的話進行重新登錄連接的操作
String uid = GlobalInfo.getInstance(MainActivity.this).getUid();
if (!TextUtils.isEmpty(GlobalInfo.getInstance(MainActivity.this).getUid())){
//登錄成功後SDK對象重新初始化
LoginHelper.getsInstance().initIMKit(uid,App.YWIMKit_APP_KEY);
LoginHelper.getsInstance().login_im(uid, GlobalInfo.getInstance(MainActivity.this).getImPassword(), new IWxCallback() {
@Override
public void onSuccess(Object... objects) {
mIMKit = LoginHelper.getsInstance().getIMKit();
mConversationService = mIMKit.getConversationService();
initListener();
Toast.makeText(MainActivity.this, "Success", Toast.LENGTH_SHORT).show();
}
@Override
public void onError(int i, String s) {
}
@Override
public void onProgress(int i) {
}
});
}
}
}
@Override
public void onReConnecting() {
Toast.makeText(this, "onReconnecting", Toast.LENGTH_SHORT).show();
}
@Override
public void onReConnected() {
Toast.makeText(this, "onReconnected", Toast.LENGTH_SHORT).show();
}
基本的操作就介紹這些,接下來是自定義的一些類