实施Facebook登录与UiLifecycleHelper [英] Implementing Facebook login with UiLifecycleHelper

查看:400
本文介绍了实施Facebook登录与UiLifecycleHelper的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有 MainActivity LoginActivity 。我创建了一个超类 FacebookActivity 保留 UiLifecycleHelper 对象和所有的重载方法:

I have MainActivity and a LoginActivity. I created a super class FacebookActivity to keep the UiLifecycleHelper object and all of the overriding methods:

MainActivity

public class MainActivity extends FacebookActivity  {

    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_activity);
    }
}

LoginActivity (基本上是一个闪屏与Facebook的登录按钮):

LoginActivity (basically a splash screen with facebook login button):

public class LoginActivity extends FacebookActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.login_activity);
    }

}

FacebookActivity ,以实现所有的UiLifecycle方法:

FacebookActivity to implement all of the UiLifecycle methods :

public class FacebookActivity extends SherlockFragmentActivity {

    private UiLifecycleHelper uiHelper;
    private Session.StatusCallback statusCallback = new Session.StatusCallback() {
        @Override
        public void call(Session session, SessionState state,
                Exception exception) {
            onSessionStateChange(session, state, exception);
        }
    };

    public FacebookActivity() {
        Settings.addLoggingBehavior(LoggingBehavior.INCLUDE_ACCESS_TOKENS);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        uiHelper = new UiLifecycleHelper(this, statusCallback);
        uiHelper.onCreate(savedInstanceState);
    }

    @Override
    protected void onResume() {
        super.onResume();
        // For scenarios where the main activity is launched and user
        // session is not null, the session state change notification
        // may not be triggered. Trigger it if it's open/closed.
        Session session = Session.getActiveSession();
        if (session != null && (session.isOpened() || session.isClosed())) {
            onSessionStateChange(session, session.getState(), null);
        }
        uiHelper.onResume();
    }

    @Override
    protected void onPause() {
        super.onPause();
        uiHelper.onPause();
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        uiHelper.onActivityResult(requestCode, resultCode, data);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        uiHelper.onDestroy();
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        Session session = Session.getActiveSession();
        Session.saveSession(session, outState);
        uiHelper.onSaveInstanceState(outState);
    }

    private void onSessionStateChange(Session session, SessionState state, Exception exception) {
        if (state.isOpened()) {
            Log.i(Consts.TAG, "Logged in...");
            setCookies();
            Intent intent = new Intent(this, MainActivity.class);
            this.startActivity(intent);
        } else if (state.isClosed()) {
            Log.i(Consts.TAG, "Logged out...");
            Intent intent = new Intent(this, LoginActivity.class);
            this.startActivity(intent);
        }
    }
}

我认为这将是所有的活动课将继承 FacebookActivity 这种方式,我将有一个code处理所有的会话管理的一个好主意。

I thought it would be a good idea that all activity classes would inherit from FacebookActivity this way I will have one code that handles all of the session management.

不幸的是这并不能很好地工作,其中一个例子是,当我通过 MainActivity 注销我得到一个循环:

Unfortunately this doesn't work very well, one example is when I log out through MainActivity I get a loop :

  1. onSessionStateChange 事件监听器触发了,因为我清除了会议
  2. LoginActivity 启动
  3. FacebookActivity.onCreate() LoginActivity.onCreate被称为()
  4. onSessionStateChange 再次调用,并返回到2
  1. onSessionStateChange event listener fires up since I cleared the session
  2. LoginActivity is started
  3. FacebookActivity.onCreate() is called from LoginActivity.onCreate()
  4. onSessionStateChange is called again and go back to 2

我完全不知道是什么事件触发 Session.StatusCallback 倾听者,我不跟我的做法明白什么是错。

I don't exactly know what events trigger the Session.StatusCallback listener, and I don't understand whats wrong with my approach.

接近这种任何其他方式?

Any other way to approach this ?

推荐答案

UiLifecycleHelper 明明做了很多相关的会话<事情/ code>类。 这是的onCreate 方法的一部分:

The UiLifecycleHelper obviously does a lot of things related to the Session class. This is a part of the onCreate method:

public void onCreate(Bundle savedInstanceState) {
    Session session = Session.getActiveSession();
    if (session == null) {
        if (savedInstanceState != null) {
            session = Session.restoreSession(activity, null, callback, savedInstanceState);
        }
        if (session == null) {
            session = new Session(activity);
        }
        Session.setActiveSession(session);
    }

    [...]
}

这次会议的变化,因此 Session.StatusCallback 被称为每次..导致你的无限循环。

The session change, so the Session.StatusCallback is called every time.. causing your infinite loop.

这篇关于实施Facebook登录与UiLifecycleHelper的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆