单点登录就是在当前终端登录APP,但在另一终端又重新登录的时候,当前登录的APP会退出并给出提示。
由于项目集成了融云IM,并且融云也给出判断连接的机制,所以就利用融云来实现整个App的单点登录的监听。
做法如下:
首先创建一个类,并实现ConnectionStatusListener接口(融云给出的接口,具体请看官方文档,在这就不多说),然后设置相应的弹出框即可,代码如下:
@Override
public void onChanged(ConnectionStatus connectionStatus) {
switch (connectionStatus){
case CONNECTED://连接成功。
break;
case DISCONNECTED://断开连接。
break;
case CONNECTING://连接中。
break;
case NETWORK_UNAVAILABLE://网络不可用。
break;
case KICKED_OFFLINE_BY_OTHER_CLIENT://用户账户在其他设备登录,本机会被踢掉线
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
Intent intent=new Intent(context,ConnectStatusDialog.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
context.startActivity(intent);
}
});
break;
}
}
值得注意的是,这里需要在主线程中弹出对话框,我这是使用Activity作为一个对话框来显示UI,所以跳转到另一Activity里去执行相应操作。
new Handler(Looper.getMainLooper()).post(new Runnable() 这段代码是切换到主线程中显示,必须是在主线程。
还需注意的是:
从一个Activity中要通过intent调出另一个Activity的话,需要使用 FLAG_ACTIVITY_NEW_TASK
否则的话,会有force close:
E/AndroidRuntime( 2706): FATAL EXCEPTION: main
E/AndroidRuntime( 2706): android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS:
如果调出的Activtivity只是一个功能片段,并没有实际的意义,也没有必要出现在长按Home键调出最近使用过的程序类表中,那么使用FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
Intent intent = new Intent(this, 目的.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
startActivity(intent);
注意事项就这么多,到此为止