利用融云的连接机制来实现App的单点登录

单点登录就是在当前终端登录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); 


注意事项就这么多,到此为止

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章