2013-05-06 105 views
3

我有MainActivityLoginActivity。我创建了一个超类FacebookActivity保持UiLifecycleHelper对象和所有的重载方法:使用UiLifecycleHelper实施Facebook登录

MainActivity

public class MainActivity extends FacebookActivity { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 

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

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

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); 
    } 

} 

Facebook活动实施所有的UI生命周期方法:

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这样我会处理所有的会话管理的一个代码继承。

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

  1. onSessionStateChange事件监听器触发了,因为我清除
  2. LoginActivity开始
  3. 会议
  4. FacebookActivity.onCreate()LoginActivity.onCreate()
  5. onSessionStateChange称为被再次调用并回到2

我不完全知道什么事件触发了Session.StatusCallback听众,我不明白我的方法有什么问题。

任何其他方式来处理这个?

+0

什么是SherlockFragmentActivity? – keen 2013-07-15 06:56:28

+2

@BSThakrar它是低级别API广泛使用的ActionBar支持包的一部分:“当在所有版本的Android上创建活动以使用操作栏时,必须声明您的活动以扩展任何以'Sherlock “”。我使用它的Android 2.2+,效果很好。 – 2013-07-17 04:28:06

+0

感谢@BenSewards。 – keen 2013-07-17 05:13:37

回答

2

UiLifecycleHelper显然做了很多与Session类有关的事情。 这是onCreate方法的一部分:

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被称为每次..导致您的无限循环。

+0

这个onCreate会用于Facebook类还是每个已实施的活动onCreate?谢谢! – 2013-07-17 04:15:02

+0

当然每个活动。您不必实施Facebook课程。 – 5agado 2013-07-17 08:00:35

+0

谢谢,我是否会将这个添加到我从另一个活动注销后开始的活动中,以便会话被刷新并更新? – 2013-07-17 13:37:30