需求提出
效果展示
审阅源码并进行总结了解如何实现的。
解析代码
- 源码附上:
package com.tencent.qcloud.tim.demo;
import android.content.Intent;
import android.graphics.Color;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.view.WindowManager;
import com.tencent.imsdk.v2.V2TIMCallback;
import com.tencent.qcloud.tim.demo.bean.UserInfo;
import com.tencent.qcloud.tim.demo.login.LoginForDevActivity;
import com.tencent.qcloud.tim.demo.main.MainActivity;
import com.tencent.qcloud.tim.demo.utils.DemoLog;
import com.tencent.qcloud.tim.demo.utils.TUIUtils;
import com.tencent.qcloud.tuicore.component.activities.BaseLightActivity;
import com.tencent.qcloud.tuicore.util.ToastUtil;
/**
* 这个是Demo中的前置Activity主要是充当前置画面的初展示
*/
public class SplashActivity extends BaseLightActivity {
private static final String TAG = SplashActivity.class.getSimpleName();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
if (Build.VERSION.SDK_INT >= 21) {
View decorView = getWindow().getDecorView();
decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
getWindow().setStatusBarColor(Color.TRANSPARENT);
getWindow().setNavigationBarColor(Color.TRANSPARENT);
}
handleData();
}
private void handleData() {
//数据处理,全局单例模式
UserInfo userInfo = UserInfo.getInstance();
if (userInfo != null && userInfo.isAutoLogin()) {
DemoApplication.instance().init(0);
login();
} else {
startLogin();
}
}
private void login() {
//SDK 进行登录,依据用户的权限
UserInfo userInfo = UserInfo.getInstance();
TUIUtils.login(userInfo.getUserId(), userInfo.getUserSig(), new V2TIMCallback() {
@Override
public void onError(final int code, final String desc) {
runOnUiThread(new Runnable() {
public void run() {
ToastUtil.toastLongMessage(getString(R.string.failed_login_tip) + ", errCode = " + code + ", errInfo = " + desc);
startLogin();
}
});
DemoLog.i(TAG, "imLogin errorCode = " + code + ", errorInfo = " + desc);
}
@Override
public void onSuccess() {
startMain();
}
});
}
private void startLogin() {
//无登录用户信息就需要进行初始化登录
Intent intent = new Intent(SplashActivity.this, LoginForDevActivity.class);
intent.putExtras(getIntent());
startActivity(intent);
finish();
}
private void startMain() {
DemoLog.i(TAG, "MainActivity" );
Intent intent = new Intent(SplashActivity.this, MainActivity.class);
intent.putExtras(getIntent());
intent.setData(getIntent().getData());
startActivity(intent);
finish();
}
}
细节划分
- 这个就是一个Activity具有UI相关界面,只是作为一个交互的作用并对后台进行一个屏蔽性的沟通交互。
- 生命周期中的
OnCreate
,这一点基本在该Demo中所有的Activity的功能,对ui进行一个统一的样式处理(当然,也可以根据实际效果进行自定义处理)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
if (Build.VERSION.SDK_INT >= 21) {
View decorView = getWindow().getDecorView();
decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
getWindow().setStatusBarColor(Color.TRANSPARENT);
getWindow().setNavigationBarColor(Color.TRANSPARENT);
}
handleData();
}
- 在构建Create的时候就对数据进行handle处理,主要是对每一个用户的数据进行处理。判断是否SDK服务中有这个ID的存在,唯一标识,很重要。
//数据处理,全局单例模式
UserInfo userInfo = UserInfo.getInstance();
if (userInfo != null && userInfo.isAutoLogin()) {
DemoApplication.instance().init(0);
login();
} else {
startLogin();
}
以上的核心是UserInfo
对象,这个对象就是存放IM中的用户信息的对象。采用单例模式
。
- 在进行登录的时候操作是要跟TIM 的SDK 交互,该处我发现TIM的SDK可以将每个功能封装得很好,直接对每个api进行透明色,使用的时候方便。
private void login() {
//SDK 进行登录,依据用户的权限
UserInfo userInfo = UserInfo.getInstance();
TUIUtils.login(userInfo.getUserId(), userInfo.getUserSig(), new V2TIMCallback() {
@Override
public void onError(final int code, final String desc) {
runOnUiThread(new Runnable() {
public void run() {
ToastUtil.toastLongMessage(getString(R.string.failed_login_tip) + ", errCode = " + code + ", errInfo = " + desc);
startLogin();
}
});
DemoLog.i(TAG, "imLogin errorCode = " + code + ", errorInfo = " + desc);
}
@Override
public void onSuccess() {
//直接跳转到Demo的主要界面
startMain();
}
});
}
TUIUtils
是该封装的core类!
- 余下的方法主要是方法缝合,对Activity之间跳转交互进行一个操作。
private void startLogin() {
//无登录用户信息就需要进行初始化登录
Intent intent = new Intent(SplashActivity.this, LoginForDevActivity.class);
intent.putExtras(getIntent());
startActivity(intent);
finish();
}
private void startMain() {
DemoLog.i(TAG, "MainActivity" );
Intent intent = new Intent(SplashActivity.this, MainActivity.class);
intent.putExtras(getIntent());
intent.setData(getIntent().getData());
startActivity(intent);
finish();
}